From: Brandon Casey Date: Sat, 27 Aug 2011 00:59:27 +0000 (-0500) Subject: git-stash: remove untracked/ignored directories when stashed X-Git-Tag: v1.7.8-rc0~144^2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=7474b8b452f2600bd2a9e03f67b83b489aeadb37;p=git.git git-stash: remove untracked/ignored directories when stashed The two new stash options --include-untracked and --all do not remove the untracked and/or ignored files that are stashed if those files reside in a subdirectory. e.g. the following sequence fails: mkdir untracked && echo hello >untracked/file.txt && git stash --include-untracked && test ! -f untracked/file.txt Within the git-stash script, git-clean is used to remove the untracked/ignored files, but since the -d option was not supplied, it does not remove directories. So, add -d to the git-clean arguments, and update the tests to test this functionality. Reported-by: Hilco Wijbenga Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- diff --git a/git-stash.sh b/git-stash.sh index 0d167fcdf..315791723 100755 --- a/git-stash.sh +++ b/git-stash.sh @@ -228,7 +228,7 @@ save_stash () { test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION= if test -n "$untracked" then - git clean --force --quiet $CLEAN_X_OPTION + git clean --force --quiet -d $CLEAN_X_OPTION fi if test "$keep_index" = "t" && test -n $i_tree diff --git a/t/t3905-stash-include-untracked.sh b/t/t3905-stash-include-untracked.sh index ca1a46cb1..ef44fb226 100755 --- a/t/t3905-stash-include-untracked.sh +++ b/t/t3905-stash-include-untracked.sh @@ -17,6 +17,8 @@ test_expect_success 'stash save --include-untracked some dirty working directory echo 3 > file && test_tick && echo 1 > file2 && + mkdir untracked && + echo untracked >untracked/untracked && git stash --include-untracked && git diff-files --quiet && git diff-index --cached --quiet HEAD @@ -40,14 +42,23 @@ index 0000000..d00491f +++ b/file2 @@ -0,0 +1 @@ +1 +diff --git a/untracked/untracked b/untracked/untracked +new file mode 100644 +index 0000000..5a72eb2 +--- /dev/null ++++ b/untracked/untracked +@@ -0,0 +1 @@ ++untracked EOF cat > expect.lstree <actual && + test ! -e untracked && + git diff HEAD stash^3 -- file2 untracked >actual && test_cmp expect.diff actual && git ls-tree --name-only stash^3: >actual && test_cmp expect.lstree actual @@ -67,15 +78,18 @@ cat > expect <actual && - test_cmp expect actual + test_cmp expect actual && + test "1" = "`cat file2`" && + test untracked = "`cat untracked/untracked`" ' -git clean --force --quiet +git clean --force --quiet -d test_expect_success 'stash save -u dirty index' ' echo 4 > file3 && @@ -125,12 +139,16 @@ test_expect_success 'stash save --include-untracked removed files got stashed' ' cat > .gitignore < ignored && + mkdir ignored.d && + echo ignored >ignored.d/untracked && git stash -u && test -s ignored && + test -s ignored.d/untracked && test -s .gitignore ' @@ -143,12 +161,14 @@ test_expect_success 'stash save -u can stash with only untracked files different test_expect_success 'stash save --all does not respect .gitignore' ' git stash -a && test "!" -f ignored && + test "!" -e ignored.d && test "!" -f .gitignore ' test_expect_success 'stash save --all is stash poppable' ' git stash pop && test -s ignored && + test -s ignored.d/untracked && test -s .gitignore '