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
This commit is contained in:
commit
4f66e44300
52
t/t1090-sparse-checkout-scope.sh
Executable file
52
t/t1090-sparse-checkout-scope.sh
Executable file
@ -0,0 +1,52 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='sparse checkout scope tests'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
echo "initial" >a &&
|
||||
echo "initial" >b &&
|
||||
echo "initial" >c &&
|
||||
git add a b c &&
|
||||
git commit -m "initial commit"
|
||||
'
|
||||
|
||||
test_expect_success 'create feature branch' '
|
||||
git checkout -b feature &&
|
||||
echo "modified" >b &&
|
||||
echo "modified" >c &&
|
||||
git add b c &&
|
||||
git commit -m "modification"
|
||||
'
|
||||
|
||||
test_expect_success 'perform sparse checkout of master' '
|
||||
git config --local --bool core.sparsecheckout true &&
|
||||
echo "!/*" >.git/info/sparse-checkout &&
|
||||
echo "/a" >>.git/info/sparse-checkout &&
|
||||
echo "/c" >>.git/info/sparse-checkout &&
|
||||
git checkout master &&
|
||||
test_path_is_file a &&
|
||||
test_path_is_missing b &&
|
||||
test_path_is_file c
|
||||
'
|
||||
|
||||
test_expect_success 'merge feature branch into sparse checkout of master' '
|
||||
git merge feature &&
|
||||
test_path_is_file a &&
|
||||
test_path_is_missing b &&
|
||||
test_path_is_file c &&
|
||||
test "$(cat c)" = "modified"
|
||||
'
|
||||
|
||||
test_expect_success 'return to full checkout of master' '
|
||||
git checkout feature &&
|
||||
echo "/*" >.git/info/sparse-checkout &&
|
||||
git checkout master &&
|
||||
test_path_is_file a &&
|
||||
test_path_is_file b &&
|
||||
test_path_is_file c &&
|
||||
test "$(cat b)" = "modified"
|
||||
'
|
||||
|
||||
test_done
|
@ -224,6 +224,9 @@ static int check_updates(struct unpack_trees_options *o)
|
||||
struct cache_entry *ce = index->cache[i];
|
||||
|
||||
if (ce->ce_flags & CE_UPDATE) {
|
||||
if (ce->ce_flags & CE_WT_REMOVE)
|
||||
die("BUG: both update and delete flags are set on %s",
|
||||
ce->name);
|
||||
display_progress(progress, ++cnt);
|
||||
ce->ce_flags &= ~CE_UPDATE;
|
||||
if (o->update && !o->dry_run) {
|
||||
@ -293,6 +296,7 @@ static int apply_sparse_checkout(struct index_state *istate,
|
||||
if (!(ce->ce_flags & CE_UPDATE) && verify_uptodate_sparse(ce, o))
|
||||
return -1;
|
||||
ce->ce_flags |= CE_WT_REMOVE;
|
||||
ce->ce_flags &= ~CE_UPDATE;
|
||||
}
|
||||
if (was_skip_worktree && !ce_skip_worktree(ce)) {
|
||||
if (verify_absent_sparse(ce, ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN, o))
|
||||
|
Loading…
Reference in New Issue
Block a user