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,
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 'intent-to-add with --sparse outside sparse-checkout' '
+ init_repos &&
+
+ write_script edit-contents <<-\EOF &&
+ echo text >>$1
+ EOF
+
+ run_on_all mkdir -p folder1 &&
+ run_on_all ../edit-contents folder1/newita &&
+ test_all_match git add --sparse --intent-to-add folder1/newita &&
+
+ test_all_match git status --porcelain=v2 &&
+ test_all_match git ls-files --stage &&
+ test_all_match git diff --cached --stat &&
+
+ # Ensure sparse index stores correct sparse directories and
+ # intent-to-add path.
+ git -C sparse-index ls-files --format="%(path)" --sparse >out &&
+
+ # These paths should be present in index as-is.
+ test_grep "^before/\$" out &&
+ test_grep "^folder1/newita\$" out &&
+ test_grep "^folder2/\$" out &&
+ test_grep "^x/\$" out &&
+
+ # folder/0/ could theoretically be collapsed to a sparse
+ # directory entry, but the current implementation avoids the
+ # reduction because of folder1/newita
+ test_grep "^folder1/0/0/0\$" out
+'
+
test_expect_success 'git add, checkout, and reset with -p' '
init_repos &&
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