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

[PATCH v5 2/3] stash push: avoid printing errors

From
Thomas Gummerer <t.gummerer@gmail.com>
Date
Mar 19, 2018, 23:21 UTC
Message-ID
<20180319232156.30916-3-t.gummerer@gmail.com>
In-Reply-To
<20180319232156.30916-1-t.gummerer@gmail.com>

'git stash push -u -- <pathspec>' prints the following errors if <pathspec> only matches untracked files:

    fatal: pathspec 'untracked' did not match any files
    error: unrecognized input

This is because we first clean up the untracked files using 'git clean <pathspec>', and then use a command chain involving 'git add -u <pathspec>' and 'git apply' to clear the changes to files that are in the index and were stashed.

As the <pathspec> only includes untracked files that were already removed by 'git clean', the 'git add' call will barf, and so will 'git apply', as there are no changes that need to be applied.

Fix this by avoiding the 'git clean' if a pathspec is given, and use the pipeline that's used for pathspec mode to get rid of the untracked files as well.

Reported-by: Marc Strapetz <marc.strapetz@syntevo.com>
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
---
 git-stash.sh                       |  6 +++--
 t/t3905-stash-include-untracked.sh | 46 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/git-stash.sh b/git-stash.sh
index 4c92ec931f..5e06f96da5 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -308,14 +308,16 @@ push_stash () {
 	if test -z "$patch_mode"
 	then
 		test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
-		if test -n "$untracked"
+		if test -n "$untracked" && test $# = 0
 		then
 			git clean --force --quiet -d $CLEAN_X_OPTION -- "$@"
 		fi
 
 		if test $# != 0
 		then
-			git add -u -- "$@"
+			test -z "$untracked" && UPDATE_OPTION="-u" || UPDATE_OPTION=
+			test "$untracked" = "all" && FORCE_OPTION="--force" || FORCE_OPTION=
+			git add $UPDATE_OPTION $FORCE_OPTION -- "$@"
 			git diff-index -p --cached --binary HEAD -- "$@" |
 			git apply --index -R
 		else
diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh
index bfde4057ad..2f9045553e 100755
--- a/t/t3905-stash-include-untracked.sh
+++ b/t/t3905-stash-include-untracked.sh
@@ -228,4 +228,50 @@ test_expect_success 'stash previously ignored file' '
 	test_path_is_file ignored.d/foo
 '
 
+test_expect_success 'stash -u -- <untracked> doesnt print error' '
+	>untracked &&
+	git stash push -u -- untracked 2>actual &&
+	test_path_is_missing untracked &&
+	test_line_count = 0 actual
+'
+
+test_expect_success 'stash -u -- <untracked> leaves rest of working tree in place' '
+	>tracked &&
+	git add tracked &&
+	>untracked &&
+	git stash push -u -- untracked &&
+	test_path_is_missing untracked &&
+	test_path_is_file tracked
+'
+
+test_expect_success 'stash -u -- <tracked> <untracked> clears changes in both' '
+	>tracked &&
+	git add tracked &&
+	>untracked &&
+	git stash push -u -- tracked untracked &&
+	test_path_is_missing tracked &&
+	test_path_is_missing untracked
+'
+
+test_expect_success 'stash --all -- <ignored> stashes ignored file' '
+	>ignored.d/bar &&
+	git stash push --all -- ignored.d/bar &&
+	test_path_is_missing ignored.d/bar
+'
+
+test_expect_success 'stash --all -- <tracked> <ignored> clears changes in both' '
+	>tracked &&
+	git add tracked &&
+	>ignored.d/bar &&
+	git stash push --all -- tracked ignored.d/bar &&
+	test_path_is_missing tracked &&
+	test_path_is_missing ignored.d/bar
+'
+
+test_expect_success 'stash -u -- <ignored> leaves ignored file alone' '
+	>ignored.d/bar &&
+	git stash push -u -- ignored.d/bar &&
+	test_path_is_file ignored.d/bar
+'
+
 test_done
-- 
2.15.1.33.g3165b24a68
Previous: Thomas GummererNext: Junio C Hamano
Message 24 of 33 in “git stash push -u always warns "pathspec '...' did not match any files"”
  1. Marc StrapetzMar 3, 2018
  2. Thomas GummererMar 3, 2018
  3. Marc StrapetzMar 4, 2018
  4. Junio C HamanoMar 9, 2018
  5. Marc StrapetzMar 10, 2018
  6. Thomas GummererMar 10, 2018
  7. 1/2 stash push: avoid printing errorsThomas Gummerer, Mar 14, 2018
  8. 2/2 stash push -u: don't create empty stashThomas Gummerer, Mar 14, 2018
  9. Junio C HamanoMar 15, 2018
  10. Thomas GummererMar 16, 2018
  11. Marc StrapetzMar 15, 2018
  12. Thomas GummererMar 16, 2018
  13. 0/2 stash push -u -- <pathspec> fixesThomas Gummerer, Mar 16, 2018
  14. 2/2 stash push -u: don't create empty stashThomas Gummerer, Mar 16, 2018
  15. 1/2 stash push: avoid printing errorsThomas Gummerer, Mar 16, 2018
  16. Junio C HamanoMar 16, 2018
  17. 0/3 stash push -u -- <pathspec> fixesJunio C Hamano, Mar 16, 2018
  18. 2/3 stash push: avoid printing errorsJunio C Hamano, Mar 16, 2018
  19. 1/3 stash: fix nonsense pipelineJunio C Hamano, Mar 16, 2018
  20. 3/3 stash push -u: don't create empty stashJunio C Hamano, Mar 16, 2018
  21. Thomas GummererMar 17, 2018
  22. 0/3 stash push -u -- <pathspec> fixesThomas Gummerer, Mar 19, 2018
  23. 1/3 stash: fix nonsense pipelineThomas Gummerer, Mar 19, 2018
  24. 2/3 stash push: avoid printing errorsThomas Gummerer, Mar 19, 2018
  25. Junio C HamanoMar 20, 2018
  26. Thomas GummererMar 21, 2018
  27. stash: drop superfluos pathspec parameter (was: Re: [PATCH v5 2/3] stash push: avoid printing errors)Thomas Gummerer, Mar 21, 2018
  28. Junio C HamanoMar 21, 2018
  29. Junio C HamanoMar 21, 2018
  30. 3/3 stash push -u: don't create empty stashThomas Gummerer, Mar 19, 2018
  31. Marc StrapetzMar 20, 2018
  32. Marc StrapetzMar 19, 2018
  33. Thomas GummererMar 19, 2018

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.