@@ -1068,23 +1068,42 @@ test_expect_success 'clean' '
10681068 test_all_match git commit -m "ignore bogus files" &&
10691069
10701070 run_on_sparse mkdir folder1 &&
1071+ run_on_all mkdir -p deep/untracked-deep &&
10711072 run_on_all touch folder1/bogus &&
1073+ run_on_all touch folder1/untracked &&
1074+ run_on_all touch deep/untracked-deep/bogus &&
1075+ run_on_all touch deep/untracked-deep/untracked &&
10721076
10731077 test_all_match git status --porcelain=v2 &&
10741078 test_all_match git clean -f &&
10751079 test_all_match git status --porcelain=v2 &&
10761080 test_sparse_match ls &&
10771081 test_sparse_match ls folder1 &&
1082+ run_on_all test_path_exists folder1/bogus &&
1083+ run_on_all test_path_is_missing folder1/untracked &&
1084+ run_on_all test_path_exists deep/untracked-deep/bogus &&
1085+ run_on_all test_path_exists deep/untracked-deep/untracked &&
1086+
1087+ test_all_match git clean -fd &&
1088+ test_all_match git status --porcelain=v2 &&
1089+ test_sparse_match ls &&
1090+ test_sparse_match ls folder1 &&
1091+ run_on_all test_path_exists folder1/bogus &&
1092+ run_on_all test_path_exists deep/untracked-deep/bogus &&
1093+ run_on_all test_path_is_missing deep/untracked-deep/untracked &&
10781094
10791095 test_all_match git clean -xf &&
10801096 test_all_match git status --porcelain=v2 &&
10811097 test_sparse_match ls &&
10821098 test_sparse_match ls folder1 &&
1099+ run_on_all test_path_is_missing folder1/bogus &&
1100+ run_on_all test_path_exists deep/untracked-deep/bogus &&
10831101
10841102 test_all_match git clean -xdf &&
10851103 test_all_match git status --porcelain=v2 &&
10861104 test_sparse_match ls &&
10871105 test_sparse_match ls folder1 &&
1106+ run_on_all test_path_is_missing deep/untracked-deep/bogus &&
10881107
10891108 test_sparse_match test_path_is_dir folder1
10901109'
@@ -1206,6 +1225,8 @@ test_expect_success 'sparse-index is not expanded' '
12061225 git -C sparse-index add README.md &&
12071226 ensure_not_expanded diff --staged &&
12081227
1228+ ensure_not_expanded clean -fd &&
1229+
12091230 ensure_not_expanded reset base -- deep/a &&
12101231 ensure_not_expanded reset base -- nonexistent-file &&
12111232 ensure_not_expanded reset deepest -- deep &&
@@ -1300,6 +1321,46 @@ test_expect_success 'sparse index is not expanded: read-tree' '
13001321 ensure_not_expanded read-tree --prefix=deep/deeper2 -u deepest
13011322'
13021323
1324+ # NEEDSWORK: although the full repository's index is _not_ expanded as part of
1325+ # stash, a temporary index, which is _not_ sparse, is created when stashing and
1326+ # applying a stash of untracked files. As a result, the test reports that it
1327+ # finds an instance of `ensure_full_index`, but it does not carry with it the
1328+ # performance implications of expanding the full repository index.
1329+ test_expect_success ' sparse index is not expanded: stash -u' '
1330+ init_repos &&
1331+
1332+ mkdir -p sparse-index/folder1 &&
1333+ echo >>sparse-index/README.md &&
1334+ echo >>sparse-index/a &&
1335+ echo >>sparse-index/folder1/new &&
1336+
1337+ GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
1338+ git -C sparse-index stash -u &&
1339+ test_region index ensure_full_index trace2.txt &&
1340+
1341+ GIT_TRACE2_EVENT="$(pwd)/trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
1342+ git -C sparse-index stash pop &&
1343+ test_region index ensure_full_index trace2.txt
1344+ '
1345+
1346+ # NEEDSWORK: similar to `git add`, untracked files outside of the sparse
1347+ # checkout definition are successfully stashed and unstashed.
1348+ test_expect_success ' stash -u outside sparse checkout definition' '
1349+ init_repos &&
1350+
1351+ write_script edit-contents <<-\EOF &&
1352+ echo text >>$1
1353+ EOF
1354+
1355+ run_on_sparse mkdir -p folder1 &&
1356+ run_on_all ../edit-contents folder1/new &&
1357+ test_all_match git stash -u &&
1358+ test_all_match git status --porcelain=v2 &&
1359+
1360+ test_all_match git stash pop -q &&
1361+ test_all_match git status --porcelain=v2
1362+ '
1363+
13031364# NEEDSWORK: a sparse-checkout behaves differently from a full checkout
13041365# in this scenario, but it shouldn't.
13051366test_expect_success ' reset mixed and checkout orphan' '
0 commit comments