clean: integrate with sparse index

Remove full index requirement for `git clean` and test to ensure the index
is not expanded in `git clean`. Add to existing test for `git clean` to
verify cleanup of untracked files in sparse directories is consistent
between sparse index and non-sparse index checkouts.

Signed-off-by: Victoria Dye <vdye@github.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Victoria Dye 2022-01-11 18:05:00 +00:00 committed by Junio C Hamano
parent 1624333ec1
commit 1e9e10e048
2 changed files with 24 additions and 0 deletions

View File

@ -983,6 +983,9 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
dir.flags |= DIR_KEEP_UNTRACKED_CONTENTS; dir.flags |= DIR_KEEP_UNTRACKED_CONTENTS;
} }


prepare_repo_settings(the_repository);
the_repository->settings.command_requires_full_index = 0;

if (read_cache() < 0) if (read_cache() < 0)
die(_("index file corrupt")); die(_("index file corrupt"));



View File

@ -764,23 +764,42 @@ test_expect_success 'clean' '
test_all_match git commit -m "ignore bogus files" && test_all_match git commit -m "ignore bogus files" &&


run_on_sparse mkdir folder1 && run_on_sparse mkdir folder1 &&
run_on_all mkdir -p deep/untracked-deep &&
run_on_all touch folder1/bogus && run_on_all touch folder1/bogus &&
run_on_all touch folder1/untracked &&
run_on_all touch deep/untracked-deep/bogus &&
run_on_all touch deep/untracked-deep/untracked &&


test_all_match git status --porcelain=v2 && test_all_match git status --porcelain=v2 &&
test_all_match git clean -f && test_all_match git clean -f &&
test_all_match git status --porcelain=v2 && test_all_match git status --porcelain=v2 &&
test_sparse_match ls && test_sparse_match ls &&
test_sparse_match ls folder1 && test_sparse_match ls folder1 &&
run_on_all test_path_exists folder1/bogus &&
run_on_all test_path_is_missing folder1/untracked &&
run_on_all test_path_exists deep/untracked-deep/bogus &&
run_on_all test_path_exists deep/untracked-deep/untracked &&

test_all_match git clean -fd &&
test_all_match git status --porcelain=v2 &&
test_sparse_match ls &&
test_sparse_match ls folder1 &&
run_on_all test_path_exists folder1/bogus &&
run_on_all test_path_exists deep/untracked-deep/bogus &&
run_on_all test_path_is_missing deep/untracked-deep/untracked &&


test_all_match git clean -xf && test_all_match git clean -xf &&
test_all_match git status --porcelain=v2 && test_all_match git status --porcelain=v2 &&
test_sparse_match ls && test_sparse_match ls &&
test_sparse_match ls folder1 && test_sparse_match ls folder1 &&
run_on_all test_path_is_missing folder1/bogus &&
run_on_all test_path_exists deep/untracked-deep/bogus &&


test_all_match git clean -xdf && test_all_match git clean -xdf &&
test_all_match git status --porcelain=v2 && test_all_match git status --porcelain=v2 &&
test_sparse_match ls && test_sparse_match ls &&
test_sparse_match ls folder1 && test_sparse_match ls folder1 &&
run_on_all test_path_is_missing deep/untracked-deep/bogus &&


test_sparse_match test_path_is_dir folder1 test_sparse_match test_path_is_dir folder1
' '
@ -920,6 +939,8 @@ test_expect_success 'sparse-index is not expanded' '
# Wildcard identifies only full sparse directories, no index expansion # Wildcard identifies only full sparse directories, no index expansion
ensure_not_expanded reset deepest -- folder\* && ensure_not_expanded reset deepest -- folder\* &&


ensure_not_expanded clean -fd &&

ensure_not_expanded checkout -f update-deep && ensure_not_expanded checkout -f update-deep &&
test_config -C sparse-index pull.twohead ort && test_config -C sparse-index pull.twohead ort &&
( (