On Fri, May 16, 2025 at 7:55 AM Derrick Stolee via GitGitGadget <gitgitgadget@xxxxxxxxx> wrote: > > From: Derrick Stolee <stolee@xxxxxxxxx> > > Similar to the previous change for 'git add -p', the reset builtin > checked for integration with the sparse index after possibly redirecting > its logic toward the interactive logic. This means that the builtin > would expand the sparse index to a full one upon read. > > Move this check earlier within cmd_reset() to improve performance here. > > Add tests to guarantee that we are not universally expanding the index. > Add behavior tests to check that we are doing the same operations as a > full index. > > Signed-off-by: Derrick Stolee <stolee@xxxxxxxxx> > --- > builtin/reset.c | 6 ++-- > t/t1092-sparse-checkout-compatibility.sh | 42 ++++++++++++++++++++++-- > 2 files changed, 43 insertions(+), 5 deletions(-) > > diff --git a/builtin/reset.c b/builtin/reset.c > index 73b4537a9a56..dc50ffc1ac59 100644 > --- a/builtin/reset.c > +++ b/builtin/reset.c > @@ -420,6 +420,9 @@ int cmd_reset(int argc, > oidcpy(&oid, &tree->object.oid); > } > > + prepare_repo_settings(the_repository); > + the_repository->settings.command_requires_full_index = 0; > + > if (patch_mode) { > if (reset_type != NONE) > die(_("options '%s' and '%s' cannot be used together"), "--patch", "--{hard,mixed,soft}"); > @@ -457,9 +460,6 @@ int cmd_reset(int argc, > if (intent_to_add && reset_type != MIXED) > die(_("the option '%s' requires '%s'"), "-N", "--mixed"); > > - prepare_repo_settings(the_repository); > - the_repository->settings.command_requires_full_index = 0; > - > if (repo_read_index(the_repository) < 0) > die(_("index file corrupt")); > > diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh > index c419d8b57e84..d8101139b40a 100755 > --- a/t/t1092-sparse-checkout-compatibility.sh > +++ b/t/t1092-sparse-checkout-compatibility.sh > @@ -384,7 +384,7 @@ test_expect_success 'add, commit, checkout' ' > test_all_match git checkout - > ' > > -test_expect_success 'git add -p' ' > +test_expect_success 'git add, checkout, and reset with -p' ' > init_repos && > > write_script edit-contents <<-\EOF && > @@ -398,7 +398,7 @@ test_expect_success 'git add -p' ' > test_write_lines y n >in && > run_on_all git add -p <in && > test_all_match git status --porcelain=v2 && > - test_all_match git reset && > + test_all_match git reset -p <in && > > test_write_lines u 1 "" q >in && > run_on_all git add -i <in && > @@ -413,6 +413,12 @@ test_expect_success 'git add -p' ' > test_sparse_match git reset && > test_write_lines u 2 3 "" q >in && > run_on_all git add -i <in && > + test_sparse_match git status --porcelain=v2 && > + > + run_on_all git add --sparse folder1 && > + run_on_all git commit -m "take changes" && > + test_write_lines y n y >in && > + test_sparse_match git checkout HEAD~1 --patch <in && > test_sparse_match git status --porcelain=v2 > ' > > @@ -2458,6 +2464,38 @@ test_expect_success 'sparse-index is not expanded: git add -p' ' > ensure_expanded add -i <in > ' > > +test_expect_success 'sparse-index is not expanded: checkout -p, reset -p' ' > + init_repos && > + > + # Does not expand when edits are within sparse checkout. > + echo "new content" >sparse-index/deep/a && > + echo "new content" >sparse-index/deep/deeper1/a && > + git -C sparse-index commit -a -m "inside-changes" && > + > + test_write_lines y y >in && > + ensure_not_expanded checkout HEAD~1 --patch <in && > + > + echo "new content" >sparse-index/deep/a && > + echo "new content" >sparse-index/deep/deeper1/a && > + git -C sparse-index add . && > + ensure_not_expanded reset --patch <in && > + > + # -p does expand when edits are outside sparse checkout. > + mkdir -p sparse-index/folder1 && > + echo "new content" >sparse-index/folder1/a && > + git -C sparse-index add --sparse folder1 && > + git -C sparse-index sparse-checkout reapply && > + ensure_expanded reset --patch <in && > + > + # Fully reset the index. > + mkdir -p sparse-index/folder1 && > + echo "new content" >sparse-index/folder1/a && > + git -C sparse-index add --sparse folder1 && > + git -C sparse-index commit -m "folder1 change" && > + git -C sparse-index sparse-checkout reapply && > + ensure_expanded checkout HEAD~1 --patch <in > +' > + > test_expect_success 'advice.sparseIndexExpanded' ' > init_repos && > > -- > gitgitgadget Patch looks good to me.