From: Thomas Rast Date: Mon, 15 Feb 2010 16:01:57 GMT Subject: [PATCH] stash pop: remove 'apply' options during 'drop' invocation Message-ID: <2927b3dc67ab0b9067d4fe849e85654125706b91.1266249586.git.trast@student.ethz.ch> In-Reply-To: <201002151641.19694.trast@student.ethz.ch> The 'git stash pop' option parsing used to remove the first argument in --index mode. At the time this was implemented, this first argument was always --index. However, since the invention of the -q option in fcdd0e9 (stash: teach quiet option, 2009-06-17) 'git stash pop') you can cause an internal invocation of git stash drop --index by running git stash pop -q --index which then of course fails because drop doesn't know --index. To handle this, instead let 'git stash apply' decide what the future argument to 'drop' should be. Warning: this means that 'git stash apply' must parse all options that 'drop' can take, and deal with them in the same way. This is currently true for its only option -q. Signed-off-by: Thomas Rast --- Noticed this while whipping up the draft patch. I'm trading one maintainability problem (that bit us) for another (that hasn't... yet), but I'm scared to try properly filtering the arguments in sh. git-stash.sh | 7 +++++-- t/t3903-stash.sh | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/git-stash.sh b/git-stash.sh index 3a0685f..2d69196 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -221,6 +221,7 @@ show_stash () { } apply_stash () { + applied_stash= unstash_index= while test $# != 0 @@ -242,6 +243,9 @@ apply_stash () { if test $# = 0 then have_stash || die 'Nothing to apply' + applied_stash="$ref_stash@{0}" + else + applied_stash="$*" fi # stash records the work tree, and is a merge between the @@ -415,8 +419,7 @@ pop) shift if apply_stash "$@" then - test -z "$unstash_index" || shift - drop_stash "$@" + drop_stash "$applied_stash" fi ;; branch) diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index 5514f74..476e5ec 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -194,6 +194,15 @@ test_expect_success 'pop -q is quiet' ' test ! -s output.out ' +test_expect_success 'pop -q --index works and is quiet' ' + echo foo > file && + git add file && + git stash save --quiet && + git stash pop -q --index > output.out 2>&1 && + test foo = "$(git show :file)" && + test ! -s output.out +' + test_expect_success 'drop -q is quiet' ' git stash && git stash drop -q > output.out 2>&1 && -- 1.7.0.225.g2927b