Skip to content

Commit

Permalink
Merge branch 'as/sparse-checkout-removal'
Browse files Browse the repository at this point in the history
"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
  • Loading branch information
Junio C Hamano committed Aug 3, 2015
2 parents d939af1 + 7d78241 commit 8348bf1
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
52 changes: 52 additions & 0 deletions t/t1090-sparse-checkout-scope.sh
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions unpack-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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))
Expand Down

0 comments on commit 8348bf1

Please sign in to comment.