Skip to content

Commit 4f66e44

Browse files
committed
Merge branch 'as/sparse-checkout-removal' into maint
"sparse checkout" misbehaved for a path that is excluded from the checkout when switching between branches that differ at the path. * as/sparse-checkout-removal: unpack-trees: don't update files with CE_WT_REMOVE set
2 parents 7e7ce32 + 7d78241 commit 4f66e44

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

t/t1090-sparse-checkout-scope.sh

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#!/bin/sh
2+
3+
test_description='sparse checkout scope tests'
4+
5+
. ./test-lib.sh
6+
7+
test_expect_success 'setup' '
8+
echo "initial" >a &&
9+
echo "initial" >b &&
10+
echo "initial" >c &&
11+
git add a b c &&
12+
git commit -m "initial commit"
13+
'
14+
15+
test_expect_success 'create feature branch' '
16+
git checkout -b feature &&
17+
echo "modified" >b &&
18+
echo "modified" >c &&
19+
git add b c &&
20+
git commit -m "modification"
21+
'
22+
23+
test_expect_success 'perform sparse checkout of master' '
24+
git config --local --bool core.sparsecheckout true &&
25+
echo "!/*" >.git/info/sparse-checkout &&
26+
echo "/a" >>.git/info/sparse-checkout &&
27+
echo "/c" >>.git/info/sparse-checkout &&
28+
git checkout master &&
29+
test_path_is_file a &&
30+
test_path_is_missing b &&
31+
test_path_is_file c
32+
'
33+
34+
test_expect_success 'merge feature branch into sparse checkout of master' '
35+
git merge feature &&
36+
test_path_is_file a &&
37+
test_path_is_missing b &&
38+
test_path_is_file c &&
39+
test "$(cat c)" = "modified"
40+
'
41+
42+
test_expect_success 'return to full checkout of master' '
43+
git checkout feature &&
44+
echo "/*" >.git/info/sparse-checkout &&
45+
git checkout master &&
46+
test_path_is_file a &&
47+
test_path_is_file b &&
48+
test_path_is_file c &&
49+
test "$(cat b)" = "modified"
50+
'
51+
52+
test_done

unpack-trees.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,9 @@ static int check_updates(struct unpack_trees_options *o)
224224
struct cache_entry *ce = index->cache[i];
225225

226226
if (ce->ce_flags & CE_UPDATE) {
227+
if (ce->ce_flags & CE_WT_REMOVE)
228+
die("BUG: both update and delete flags are set on %s",
229+
ce->name);
227230
display_progress(progress, ++cnt);
228231
ce->ce_flags &= ~CE_UPDATE;
229232
if (o->update && !o->dry_run) {
@@ -293,6 +296,7 @@ static int apply_sparse_checkout(struct index_state *istate,
293296
if (!(ce->ce_flags & CE_UPDATE) && verify_uptodate_sparse(ce, o))
294297
return -1;
295298
ce->ce_flags |= CE_WT_REMOVE;
299+
ce->ce_flags &= ~CE_UPDATE;
296300
}
297301
if (was_skip_worktree && !ce_skip_worktree(ce)) {
298302
if (verify_absent_sparse(ce, ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN, o))

0 commit comments

Comments
 (0)