Browse Source

sparse-checkout: fix cone mode behavior mismatch

The intention of the special "cone mode" in the sparse-checkout
feature is to always match the same patterns that are matched by the
same sparse-checkout file as when cone mode is disabled.

When a file path is given to "git sparse-checkout set" in cone mode,
then the cone mode improperly matches the file as a recursive path.
When setting the skip-worktree bits, files were not expecting the
MATCHED_RECURSIVE response, and hence these were left out of the
matched cone.

Fix this bug by checking for MATCHED_RECURSIVE in addition to MATCHED
and add a test that prevents regression.

Reported-by: Finn Bryant <finnbryant@gmail.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Derrick Stolee 5 years ago committed by Junio C Hamano
parent
commit
f998a3f1e5
  1. 12
      t/t1091-sparse-checkout-builtin.sh
  2. 2
      unpack-trees.c

12
t/t1091-sparse-checkout-builtin.sh

@ -305,6 +305,18 @@ test_expect_success 'different sparse-checkouts with worktrees' ' @@ -305,6 +305,18 @@ test_expect_success 'different sparse-checkouts with worktrees' '
check_files worktree a deep
'

test_expect_success 'set using filename keeps file on-disk' '
git -C repo sparse-checkout set a deep &&
cat >expect <<-\EOF &&
/*
!/*/
/a/
/deep/
EOF
test_cmp expect repo/.git/info/sparse-checkout &&
check_files repo a deep
'

check_read_tree_errors () {
REPO=$1
FILES=$2

2
unpack-trees.c

@ -1416,7 +1416,7 @@ static int clear_ce_flags_1(struct index_state *istate, @@ -1416,7 +1416,7 @@ static int clear_ce_flags_1(struct index_state *istate,
name, &dtype, pl, istate);
if (ret == UNDECIDED)
ret = default_match;
if (ret == MATCHED)
if (ret == MATCHED || ret == MATCHED_RECURSIVE)
ce->ce_flags &= ~clear_mask;
cache++;
progress_nr++;

Loading…
Cancel
Save