Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion sparse-index.c
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,17 @@ static int convert_to_sparse_rec(struct index_state *istate,
continue;
}

span = ct->down[pos]->cache_tree->entry_count;
if (span < 0) {
/* cache-tree entry is invalidated, cannot collapse. */
istate->cache[num_converted++] = ce;
i++;
continue;
}

strbuf_setlen(&child_path, 0);
strbuf_add(&child_path, ce->name, slash - ce->name + 1);

span = ct->down[pos]->cache_tree->entry_count;
count = convert_to_sparse_rec(istate,
num_converted, i, i + span,
child_path.buf, child_path.len,
Expand Down
17 changes: 17 additions & 0 deletions t/t1092-sparse-checkout-compatibility.sh
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,23 @@ test_expect_success 'add, commit, checkout' '
test_all_match git checkout -
'

test_expect_success 'intent-to-add entries outside sparse-checkout' '
init_repos &&

write_script edit-contents <<-\EOF &&
echo text >>$1
EOF

test_sparse_match git sparse-checkout set deep folder1 &&
run_on_sparse mkdir -p folder1 &&
run_on_all ../edit-contents folder1/newita &&
test_sparse_match git add -N folder1/newita &&

test_sparse_match git sparse-checkout set deep &&
test_sparse_match git status --porcelain=v2 &&
test_sparse_match git ls-files --stage
'

test_expect_success 'git add, checkout, and reset with -p' '
init_repos &&

Expand Down
26 changes: 26 additions & 0 deletions t/t3705-add-sparse-checkout.sh
Original file line number Diff line number Diff line change
Expand Up @@ -233,4 +233,30 @@ test_expect_success 'refuse to add non-skip-worktree file from sparse dir' '
test_cmp expect stderr
'

test_expect_success 'intent-to-add entry and sparse index' '
test_when_finished "git sparse-checkout disable" &&
test_when_finished "git reset --hard" &&

git sparse-checkout disable &&
mkdir -p in out &&
echo base >in/file &&
echo base >out/file &&
git add in/file out/file &&
git commit -m "in and out directories" &&

# enable sparse-checkout, but with all child directories.
git config index.sparse true &&
git sparse-checkout set in out &&

# create a new path and set intent-to-add bit
echo new >out/newita &&
git add -N out/newita &&

# collapse sparse-checkout, and make sure that the sparse index
# maintains the intent-to-add bit.
git sparse-checkout set in &&
git ls-files --error-unmatch out/newita &&
git status --porcelain
'

test_done
Loading