git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] stash pop: remove 'apply' options during 'drop' invocation

From
Thomas Rast <trast@student.ethz.ch>
Date
Feb 15, 2010, 16:01 UTC
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 <trast@student.ethz.ch>
---

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
Previous: Thomas RastNext: Stephen Boyd
Message 5 of 8 in “git stash pop not reapplying deletions”
  1. Steve FollyFeb 14, 2010
  2. Thomas RastFeb 14, 2010
  3. Steve FollyFeb 15, 2010
  4. Thomas RastFeb 15, 2010
  5. stash pop: remove 'apply' options during 'drop' invocationThomas Rast, Feb 15, 2010
  6. Stephen BoydFeb 15, 2010
  7. Steve FollyFeb 15, 2010
  8. Junio C HamanoFeb 16, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.