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 <hilco.wijbenga@gmail.com>
Signed-off-by: Brandon Casey <drafnel@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Brandon Casey 2011-08-26 19:59:27 -05:00 коммит произвёл Junio C Hamano
Родитель c995ef49e2
Коммит 7474b8b452
2 изменённых файлов: 24 добавлений и 4 удалений

Просмотреть файл

@ -228,7 +228,7 @@ save_stash () {
test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION= test "$untracked" = "all" && CLEAN_X_OPTION=-x || CLEAN_X_OPTION=
if test -n "$untracked" if test -n "$untracked"
then then
git clean --force --quiet $CLEAN_X_OPTION git clean --force --quiet -d $CLEAN_X_OPTION
fi fi
if test "$keep_index" = "t" && test -n $i_tree if test "$keep_index" = "t" && test -n $i_tree

Просмотреть файл

@ -17,6 +17,8 @@ test_expect_success 'stash save --include-untracked some dirty working directory
echo 3 > file && echo 3 > file &&
test_tick && test_tick &&
echo 1 > file2 && echo 1 > file2 &&
mkdir untracked &&
echo untracked >untracked/untracked &&
git stash --include-untracked && git stash --include-untracked &&
git diff-files --quiet && git diff-files --quiet &&
git diff-index --cached --quiet HEAD git diff-index --cached --quiet HEAD
@ -40,14 +42,23 @@ index 0000000..d00491f
+++ b/file2 +++ b/file2
@@ -0,0 +1 @@ @@ -0,0 +1 @@
+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 EOF
cat > expect.lstree <<EOF cat > expect.lstree <<EOF
file2 file2
untracked
EOF EOF
test_expect_success 'stash save --include-untracked stashed the untracked files' ' test_expect_success 'stash save --include-untracked stashed the untracked files' '
test "!" -f file2 && test "!" -f file2 &&
git diff HEAD..stash^3 -- file2 >actual && test ! -e untracked &&
git diff HEAD stash^3 -- file2 untracked >actual &&
test_cmp expect.diff actual && test_cmp expect.diff actual &&
git ls-tree --name-only stash^3: >actual && git ls-tree --name-only stash^3: >actual &&
test_cmp expect.lstree actual test_cmp expect.lstree actual
@ -67,15 +78,18 @@ cat > expect <<EOF
?? actual ?? actual
?? expect ?? expect
?? file2 ?? file2
?? untracked/
EOF EOF
test_expect_success 'stash pop after save --include-untracked leaves files untracked again' ' test_expect_success 'stash pop after save --include-untracked leaves files untracked again' '
git stash pop && git stash pop &&
git status --porcelain >actual && git status --porcelain >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' ' test_expect_success 'stash save -u dirty index' '
echo 4 > file3 && echo 4 > file3 &&
@ -125,12 +139,16 @@ test_expect_success 'stash save --include-untracked removed files got stashed' '
cat > .gitignore <<EOF cat > .gitignore <<EOF
.gitignore .gitignore
ignored ignored
ignored.d/
EOF EOF
test_expect_success 'stash save --include-untracked respects .gitignore' ' test_expect_success 'stash save --include-untracked respects .gitignore' '
echo ignored > ignored && echo ignored > ignored &&
mkdir ignored.d &&
echo ignored >ignored.d/untracked &&
git stash -u && git stash -u &&
test -s ignored && test -s ignored &&
test -s ignored.d/untracked &&
test -s .gitignore 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' ' test_expect_success 'stash save --all does not respect .gitignore' '
git stash -a && git stash -a &&
test "!" -f ignored && test "!" -f ignored &&
test "!" -e ignored.d &&
test "!" -f .gitignore test "!" -f .gitignore
' '
test_expect_success 'stash save --all is stash poppable' ' test_expect_success 'stash save --all is stash poppable' '
git stash pop && git stash pop &&
test -s ignored && test -s ignored &&
test -s ignored.d/untracked &&
test -s .gitignore test -s .gitignore
' '