Message ID | 76f2a9e87223e1c1ebf2de6629c46bdf7ad326f1.1650908958.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Sparse index: integrate with 'git stash' | expand |
On 4/25/2022 1:49 PM, Victoria Dye via GitGitGadget wrote: > From: Victoria Dye <vdye@github.com> > > Change the merge function used in 'do_apply_stash()' from 'merge_recursive' > to 'merge_ort_recursive'. In addition to aligning with the default merge > strategy used by 'git merge' (6a5fb96672 (Change default merge backend from > recursive to ort, 2021-08-04)), this allows 'git stash <apply|pop>' to > operate without expanding the index by default. Update tests in 't1092' > verifying index expansion for 'git stash' accordingly. This is an interesting change, not just in the sparse index sense. Yes, using ORT by default is a good idea to align with our default merge strategy _and_ allowing us to avoid expanding the sparse index. But: should we allow this algorithm to change via our pull.twoHead config value? By default, it will be fast with the sparse index. Would there be value in allowing a user to change back to the recursive strategy if they want? This also seems like we should have a measurable performance impact for 'git stash <apply|pop>' when the stash contains a lot of renames. It would be interesting to have that documented here. Elijah might have some thoughts on how to measure this performance impact. Thanks, -Stolee
diff --git a/builtin/stash.c b/builtin/stash.c index 16171eb1dab..cd77d448546 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -7,6 +7,7 @@ #include "cache-tree.h" #include "unpack-trees.h" #include "merge-recursive.h" +#include "merge-ort-wrappers.h" #include "strvec.h" #include "run-command.h" #include "dir.h" @@ -554,7 +555,7 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, bases[0] = &info->b_tree; ret = merge_recursive_generic(&o, &c_tree, &info->w_tree, 1, bases, - merge_recursive, &result); + merge_ort_recursive, &result); if (ret) { rerere(0); diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh index a8c1c345ab0..8545a865e04 100755 --- a/t/t1092-sparse-checkout-compatibility.sh +++ b/t/t1092-sparse-checkout-compatibility.sh @@ -1377,7 +1377,7 @@ test_expect_success 'sparse-index is not expanded: stash' ' ensure_not_expanded stash && ensure_not_expanded stash list && ensure_not_expanded stash show stash@{0} && - ! ensure_not_expanded stash apply stash@{0} && + ensure_not_expanded stash apply stash@{0} && ensure_not_expanded stash drop stash@{0} && echo >>sparse-index/deep/new && @@ -1391,7 +1391,7 @@ test_expect_success 'sparse-index is not expanded: stash' ' oid=$(git -C sparse-index stash create) && ensure_not_expanded stash store -m "test" $oid && ensure_not_expanded reset --hard && - ! ensure_not_expanded stash pop && + ensure_not_expanded stash pop && ensure_not_expanded checkout-index -f a && ensure_not_expanded checkout-index -f --all &&