diff options
author | Junio C Hamano <gitster@pobox.com> | 2013-07-11 13:05:52 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-07-11 13:05:52 -0700 |
commit | d26792ad69c0d2ea0b197656ae9a562e2c1f900e (patch) | |
tree | 06b8527f68bc9705bc6fe979f9c3f75ab2bb5e05 /t | |
parent | Merge branch 'jc/maint-diff-core-safecrlf' (diff) | |
parent | git stash: avoid data loss when "git stash save" kills a directory (diff) | |
download | tgif-d26792ad69c0d2ea0b197656ae9a562e2c1f900e.tar.xz |
Merge branch 'pb/stash-refuse-to-kill'
"git stash save" is not just about "saving" the local changes, but
also is to restore the working tree state to that of HEAD. If you
changed a non-directory into a directory in the local change, you
may have untracked files in that directory, which have to be killed
while doing so, unless you run it with --include-untracked. Teach
the command to detect and error out before spreading the damage.
This needed a small fix to "ls-files --killed".
* pb/stash-refuse-to-kill:
git stash: avoid data loss when "git stash save" kills a directory
treat_directory(): do not declare submodules to be untracked
Diffstat (limited to 't')
-rwxr-xr-x | t/t3010-ls-files-killed-modified.sh | 23 | ||||
-rwxr-xr-x | t/t3903-stash.sh | 18 |
2 files changed, 38 insertions, 3 deletions
diff --git a/t/t3010-ls-files-killed-modified.sh b/t/t3010-ls-files-killed-modified.sh index 262e617445..f611d799b6 100755 --- a/t/t3010-ls-files-killed-modified.sh +++ b/t/t3010-ls-files-killed-modified.sh @@ -11,6 +11,8 @@ This test prepares the following in the cache: path1 - a symlink path2/file2 - a file in a directory path3/file3 - a file in a directory + submod1/ - a submodule + submod2/ - another submodule and the following on the filesystem: @@ -21,9 +23,11 @@ and the following on the filesystem: path4 - a file path5 - a symlink path6/file6 - a file in a directory + submod1/ - a submodule (modified from the cache) + submod2/ - a submodule (matches the cache) -git ls-files -k should report that existing filesystem -objects except path4, path5 and path6/file6 to be killed. +git ls-files -k should report that existing filesystem objects +path0/*, path1/*, path2 and path3 to be killed. Also for modification test, the cache and working tree have: @@ -33,7 +37,7 @@ Also for modification test, the cache and working tree have: path10 - a non-empty file, cache dirtied. We should report path0, path1, path2/file2, path3/file3, path7 and path8 -modified without reporting path9 and path10. +modified without reporting path9 and path10. submod1 is also modified. ' . ./test-lib.sh @@ -48,6 +52,18 @@ test_expect_success 'git update-index --add to add various paths.' ' : >path9 && date >path10 && git update-index --add -- path0 path?/file? path7 path8 path9 path10 && + for i in 1 2 + do + git init submod$i && + ( + cd submod$i && git commit --allow-empty -m "empty $i" + ) || break + done && + git update-index --add submod[12] + ( + cd submod1 && + git commit --allow-empty -m "empty 1 (updated)" + ) && rm -fr path? # leave path10 alone ' @@ -94,6 +110,7 @@ test_expect_success 'validate git ls-files -m output.' ' path3/file3 path7 path8 + submod1 EOF test_cmp .expected .output ' diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index debda7a678..5d22f17ca2 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -673,4 +673,22 @@ test_expect_success 'store updates stash ref and reflog' ' grep quux bazzy ' +test_expect_success 'stash a change to turn a non-directory to a directory' ' + git reset --hard && + >testfile && + git add testfile && + git commit -m "add testfile as a regular file" && + rm testfile && + mkdir testfile && + >testfile/file && + test_must_fail git stash save "recover regular file" && + test -f testfile/file +' + +test_expect_success 'stash a change to turn a non-directory to a directory (forced)' ' + git stash save --force "recover regular file (forced)" && + ! test -f testfile/file && + test -f testfile +' + test_done |