t7300-clean: demonstrate deleting nested repo with an ignored file breakage
authorSZEDER Gábor <szeder.dev@gmail.com>
Sun, 25 Aug 2019 18:59:18 +0000 (20:59 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Aug 2019 19:01:33 +0000 (12:01 -0700)
'git clean -fd' must not delete an untracked directory if it belongs
to a different Git repository or worktree. Unfortunately, if a
'.gitignore' rule in the outer repository happens to match a file in a
nested repository or worktree, then something goes awry and 'git clean
-fd' does delete the content of the nested repository's worktree
except that ignored file, potentially leading to data loss.

Add a test to 't7300-clean.sh' to demonstrate this breakage.

This issue is a regression introduced in 6b1db43109 (clean: teach
clean -d to preserve ignored paths, 2017-05-23).

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t7300-clean.sh
index a2c45d1902ac5df8c67b16eb8a9a8dd99839eac1..d01fd120ab441285a8d5638633ed70a796a6f988 100755 (executable)
@@ -669,6 +669,28 @@ test_expect_success 'git clean -d skips untracked dirs containing ignored files'
        test_path_is_missing foo/b/bb
 '
 
        test_path_is_missing foo/b/bb
 '
 
+test_expect_failure 'git clean -d skips nested repo containing ignored files' '
+       test_when_finished "rm -rf nested-repo-with-ignored-file" &&
+
+       git init nested-repo-with-ignored-file &&
+       (
+               cd nested-repo-with-ignored-file &&
+               >file &&
+               git add file &&
+               git commit -m Initial &&
+
+               # This file is ignored by a .gitignore rule in the outer repo
+               # added in the previous test.
+               >ignoreme
+       ) &&
+
+       git clean -fd &&
+
+       test_path_is_file nested-repo-with-ignored-file/.git/index &&
+       test_path_is_file nested-repo-with-ignored-file/ignoreme &&
+       test_path_is_file nested-repo-with-ignored-file/file
+'
+
 test_expect_success MINGW 'handle clean & core.longpaths = false nicely' '
        test_config core.longpaths false &&
        a50=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&
 test_expect_success MINGW 'handle clean & core.longpaths = false nicely' '
        test_config core.longpaths false &&
        a50=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa &&