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
					Brandon Casey
				
			
				
					committed by
					
						 Junio C Hamano
						Junio C Hamano
					
				
			
			
				
	
			
			
			 Junio C Hamano
						Junio C Hamano
					
				
			
						parent
						
							c995ef49e2
						
					
				
				
					commit
					7474b8b452
				
			| @ -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 | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user