Re: [PATCH 6/6] sparse-index: integrate with cherry-pick and rebase
- From
Elijah Newren <newren@gmail.com>
- Date
- Aug 21, 2021, 00:12 UTC
- Message-ID
- <CABPp-BF_djmCi6XdsMGx6F8fOqzJLog24rW=WsFo2VJgeyu99A@mail.gmail.com>
- In-Reply-To
- <350ed86a4533d7fe332aebdf88cc474ceaf30ffe.1629220124.git.gitgitgadget@gmail.com>
On Tue, Aug 17, 2021 at 10:08 AM Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com> wrote:
Show 6 quoted lines
> > From: Derrick Stolee <dstolee@microsoft.com> > > The hard work was already done with 'git merge' and the ORT strategy. > Just add extra tests to see that we get the expected results in the > non-conflict cases.
:-)
Show 28 quoted lines
> Signed-off-by: Derrick Stolee <dstolee@microsoft.com> > --- > builtin/rebase.c | 6 ++++ > builtin/revert.c | 3 ++ > t/t1092-sparse-checkout-compatibility.sh | 41 ++++++++++++++++++++++-- > 3 files changed, 47 insertions(+), 3 deletions(-) > > diff --git a/builtin/rebase.c b/builtin/rebase.c > index 33e09619005..27433d7c5a2 100644 > --- a/builtin/rebase.c > +++ b/builtin/rebase.c > @@ -559,6 +559,9 @@ int cmd_rebase__interactive(int argc, const char **argv, const char *prefix) > argc = parse_options(argc, argv, prefix, options, > builtin_rebase_interactive_usage, PARSE_OPT_KEEP_ARGV0); > > + prepare_repo_settings(the_repository); > + the_repository->settings.command_requires_full_index = 0; > + > if (!is_null_oid(&squash_onto)) > opts.squash_onto = &squash_onto; > > @@ -1430,6 +1433,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) > usage_with_options(builtin_rebase_usage, > builtin_rebase_options); > > + prepare_repo_settings(the_repository); > + the_repository->settings.command_requires_full_index = 0; > +
While rebase can use either merge-recursive or merge-ort under the covers, this change is okay because merge-recursive.c now has code to expand the index unconditionally, and merge-ort does so only conditionally in the cases needed. Right? (Same for change below to revert.c)
Show 73 quoted lines
> options.allow_empty_message = 1;
> git_config(rebase_config, &options);
> /* options.gpg_sign_opt will be either "-S" or NULL */
> diff --git a/builtin/revert.c b/builtin/revert.c
> index 237f2f18d4c..6c4c22691bd 100644
> --- a/builtin/revert.c
> +++ b/builtin/revert.c
> @@ -136,6 +136,9 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
> PARSE_OPT_KEEP_ARGV0 |
> PARSE_OPT_KEEP_UNKNOWN);
>
> + prepare_repo_settings(the_repository);
> + the_repository->settings.command_requires_full_index = 0;
> +
> /* implies allow_empty */
> if (opts->keep_redundant_commits)
> opts->allow_empty = 1;
> diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
> index a52d2edda54..c047b95b121 100755
> --- a/t/t1092-sparse-checkout-compatibility.sh
> +++ b/t/t1092-sparse-checkout-compatibility.sh
> @@ -532,6 +532,38 @@ test_expect_success 'merge with conflict outside cone' '
> test_all_match git rev-parse HEAD^{tree}
> '
>
> +test_expect_success 'cherry-pick/rebase with conflict outside cone' '
> + init_repos &&
> +
> + for OPERATION in cherry-pick rebase
> + do
> + test_all_match git checkout -B tip &&
> + test_all_match git reset --hard merge-left &&
> + test_all_match git status --porcelain=v2 &&
> + test_all_match test_must_fail git $OPERATION merge-right &&
> + test_all_match git status --porcelain=v2 &&
> +
> + # Resolve the conflict in different ways:
> + # 1. Revert to the base
> + test_all_match git checkout base -- deep/deeper2/a &&
> + test_all_match git status --porcelain=v2 &&
> +
> + # 2. Add the file with conflict markers
> + test_all_match git add folder1/a &&
> + test_all_match git status --porcelain=v2 &&
> +
> + # 3. Rename the file to another sparse filename and
> + # accept conflict markers as resolved content.
> + run_on_all mv folder2/a folder2/z &&
> + test_all_match git add folder2 &&
> + test_all_match git status --porcelain=v2 &&
> +
> + test_all_match git $OPERATION --continue &&
> + test_all_match git status --porcelain=v2 &&
> + test_all_match git rev-parse HEAD^{tree} || return 1
> + done
> +'
> +
> test_expect_success 'merge with outside renames' '
> init_repos &&
>
> @@ -670,9 +702,12 @@ test_expect_success 'sparse-index is not expanded' '
> echo >>sparse-index/untracked.txt &&
> ensure_not_expanded add . &&
>
> - ensure_not_expanded checkout -f update-deep &&
> - ensure_not_expanded merge -s ort -m merge update-folder1 &&
> - ensure_not_expanded merge -s ort -m merge update-folder2
> + for OPERATION in "merge -s ort -m merge" cherry-pick rebase
> + do
> + ensure_not_expanded checkout -f -B temp update-deep &&
> + ensure_not_expanded $OPERATION update-folder1 &&
> + ensure_not_expanded $OPERATION update-folder2 || return 1
> + doneWon't this fail on linux-gcc in the automated testing, since it uses GIT_TEST_MERGE_ALGORITHM=recursive and you didn't override the merge strategy for cherry-pick and rebase?
To fix, you'd either need to put a GIT_TEST_MERGE_ALGORITHM=ort at the beginning of the file, or add `--strategy ort` options to the cherry-pick and rebase commands.
Show 5 quoted lines
> ' > > test_expect_success 'sparse-index is not expanded: merge conflict in cone' ' > -- > gitgitgadget