stash: complain about unknown flags

The option parser for git-stash stuffs unknown flags into the $FLAGS variable, where they can be accessed by the individual commands. However, most commands do not even look at these extra flags, leading to unexpected results like this: $ git stash drop --help Dropped refs/stash@{0} (e6cf6d80faf92bb7828f7b60c47fc61c03bd30a1) We should notice the extra flags and bail. Rather than annotate each command to reject a non-empty $FLAGS variable, we can notice that "stash show" is the only command that actually _wants_ arbitrary flags. So we switch the default mode to reject unknown flags, and let stash_show() opt into the feature. Reported-by: Vincent Legoll <vincent.legoll@gmail.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed May 20, 2015 at 14:01 UTC d6cc2df5c80dc4f52a56679baa5e32539eb028b1
2 files changed +9 -1
git-stash.sh
+5 -1
@@ -301,6 +301,7 @@ list_stash () {
301 }
302
303 show_stash () {
304 + ALLOW_UNKNOWN_FLAGS=t
305 assert_stash_like "$@"
306
307 git diff ${FLAGS:---stat} $b_commit $w_commit
@@ -332,13 +333,14 @@ show_stash () {
333 #
334 # GIT_QUIET is set to t if -q is specified
335 # INDEX_OPTION is set to --index if --index is specified.
335 -# FLAGS is set to the remaining flags
336 +# FLAGS is set to the remaining flags (if allowed)
337 #
338 # dies if:
339 # * too many revisions specified
340 # * no revision is specified and there is no stash stack
341 # * a revision is specified which cannot be resolve to a SHA1
342 # * a non-existent stash reference is specified
343 +# * unknown flags were set and ALLOW_UNKNOWN_FLAGS is not "t"
344 #
345
346 parse_flags_and_rev()
@@ -372,6 +374,8 @@ parse_flags_and_rev()
374 INDEX_OPTION=--index
375 ;;
376 -*)
377 + test "$ALLOW_UNKNOWN_FLAGS" = t ||
378 + die "$(eval_gettext "unknown option: \$opt")"
379 FLAGS="${FLAGS}${FLAGS:+ }$opt"
380 ;;
381 esac
t/t3903-stash.sh
+4
@@ -93,6 +93,10 @@ test_expect_success 'unstashing in a subdirectory' '
93 )
94 '
95
96 +test_expect_success 'stash drop complains of extra options' '
97 + test_must_fail git stash drop --foo
98 +'
99 +
100 test_expect_success 'drop top stash' '
101 git reset --hard &&
102 git stash list > stashlist1 &&