From: Patrick Steinhardt <ps@pks.im>
To: Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Elijah Newren <newren@gmail.com>
Subject: Re: [PATCH 1/3] merge-ort: add new merge_ort_generic() function
Date: Wed, 12 Mar 2025 09:06:24 +0100 [thread overview]
Message-ID: <Z9FAgCSCZSJnzv9d@pks.im> (raw)
In-Reply-To: <9f73e54224d55b40faeb5d68ebd7ff0c13d69c7b.1741362522.git.gitgitgadget@gmail.com>
On Fri, Mar 07, 2025 at 03:48:40PM +0000, Elijah Newren via GitGitGadget wrote:
> diff --git a/merge-ort-wrappers.c b/merge-ort-wrappers.c
> index d6f61359965..62834c30e9e 100644
> --- a/merge-ort-wrappers.c
> +++ b/merge-ort-wrappers.c
> @@ -64,3 +68,63 @@ int merge_ort_recursive(struct merge_options *opt,
>
> return tmp.clean;
> }
> +
> +static struct commit *get_ref(struct repository *repo,
> + const struct object_id *oid,
> + const char *name)
> +{
> + struct object *object;
> +
> + object = deref_tag(repo, parse_object(repo, oid),
> + name, strlen(name));
> + if (!object)
> + return NULL;
> + if (object->type == OBJ_TREE)
> + return make_virtual_commit(repo, (struct tree*)object, name);
> + if (object->type != OBJ_COMMIT)
> + return NULL;
> + if (repo_parse_commit(repo, (struct commit *)object))
> + return NULL;
> + return (struct commit *)object;
> +}
This is an exact copy of the same function in "merge-recursive.c".
> +int merge_ort_generic(struct merge_options *opt,
> + const struct object_id *head,
> + const struct object_id *merge,
> + int num_merge_bases,
> + const struct object_id *merge_bases,
> + struct commit **result)
> +{
> + int clean;
> + struct lock_file lock = LOCK_INIT;
> + struct commit *head_commit = get_ref(opt->repo, head, opt->branch1);
> + struct commit *next_commit = get_ref(opt->repo, merge, opt->branch2);
> + struct commit_list *ca = NULL;
> +
> + if (merge_bases) {
> + int i;
> + for (i = 0; i < num_merge_bases; ++i) {
> + struct commit *base;
> + if (!(base = get_ref(opt->repo, &merge_bases[i],
> + oid_to_hex(&merge_bases[i]))))
> + return error(_("Could not parse object '%s'"),
> + oid_to_hex(&merge_bases[i]));
> + commit_list_insert(base, &ca);
> + }
> + }
> +
> + repo_hold_locked_index(opt->repo, &lock, LOCK_DIE_ON_ERROR);
> + clean = merge_ort_recursive(opt, head_commit, next_commit, ca,
> + result);
> + free_commit_list(ca);
> + if (clean < 0) {
> + rollback_lock_file(&lock);
> + return clean;
> + }
> +
> + if (write_locked_index(opt->repo->index, &lock,
> + COMMIT_LOCK | SKIP_IF_UNCHANGED))
> + return error(_("Unable to write index."));
> +
> + return clean ? 0 : 1;
> +}
There are two differences here:
- We use `error()` instead of the custom `err()` function that
"merge-recursive.c" uses. I'm happy to see us using standard error
reporting.
- We don't have the check for `num_merge_bases == 1`. I have no idea
why we don't have it, and it's likely that other readers may be
puzzled in the same way. So this is something I'd expect to see
explained in the commit message.
Other than that this function looks identical.
> diff --git a/merge-ort.c b/merge-ort.c
> index 46e78c3ffa6..b4ff24403a1 100644
> --- a/merge-ort.c
> +++ b/merge-ort.c
> @@ -5186,6 +5186,8 @@ static void merge_ort_internal(struct merge_options *opt,
> ancestor_name = "empty tree";
> } else if (merge_bases) {
> ancestor_name = "merged common ancestors";
> + } else if (opt->ancestor) {
> + ancestor_name = opt->ancestor;
> } else {
> strbuf_add_unique_abbrev(&merge_base_abbrev,
> &merged_merge_bases->object.oid,
> @@ -5275,8 +5277,13 @@ void merge_incore_recursive(struct merge_options *opt,
> {
> trace2_region_enter("merge", "incore_recursive", opt->repo);
>
> - /* We set the ancestor label based on the merge_bases */
> - assert(opt->ancestor == NULL);
> + /*
> + * We set the ancestor label based on the merge_bases...but we
> + * allow one exception through so that builtin/am can override
> + * with its constructed fake ancestor.
> + */
> + assert(opt->ancestor == NULL ||
> + (merge_bases && !merge_bases->next));
>
> trace2_region_enter("merge", "merge_start", opt->repo);
> merge_start(opt, result);
These two hunks look related to my above observation that we don't have
the check for `num_merge_bases == 1`, as in "merge-recursive.c" we used
to set `opt->ancestor = "constructed merge base" if so.
Patrick
next prev parent reply other threads:[~2025-03-12 8:06 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-07 15:48 [PATCH 0/3] Small new merge-ort features, prepping for deletion of merge-recursive.[ch] Elijah Newren via GitGitGadget
2025-03-07 15:48 ` [PATCH 1/3] merge-ort: add new merge_ort_generic() function Elijah Newren via GitGitGadget
2025-03-12 8:06 ` Patrick Steinhardt [this message]
2025-03-12 20:00 ` Taylor Blau
2025-03-12 21:39 ` Elijah Newren
2025-03-07 15:48 ` [PATCH 2/3] merge-ort: allow rename detection to be disabled Elijah Newren via GitGitGadget
2025-03-12 8:06 ` Patrick Steinhardt
2025-03-12 20:02 ` Taylor Blau
2025-03-12 21:40 ` Elijah Newren
2025-03-12 21:50 ` Taylor Blau
2025-03-13 5:25 ` Jeff King
2025-03-07 15:48 ` [PATCH 3/3] merge-ort: support having merge verbosity be set to 0 Elijah Newren via GitGitGadget
2025-03-12 20:03 ` Taylor Blau
2025-03-12 21:44 ` Elijah Newren
2025-03-12 21:50 ` Taylor Blau
2025-03-12 8:06 ` [PATCH 0/3] Small new merge-ort features, prepping for deletion of merge-recursive.[ch] Patrick Steinhardt
2025-03-12 20:05 ` Taylor Blau
2025-03-13 2:46 ` [PATCH v2 0/6] " Elijah Newren via GitGitGadget
2025-03-13 2:46 ` [PATCH v2 1/6] merge-ort: add new merge_ort_generic() function Elijah Newren via GitGitGadget
2025-03-13 2:46 ` [PATCH v2 2/6] merge-ort: allow rename detection to be disabled Elijah Newren via GitGitGadget
2025-03-13 2:46 ` [PATCH v2 3/6] merge-ort: support having merge verbosity be set to 0 Elijah Newren via GitGitGadget
2025-03-13 2:46 ` [PATCH v2 4/6] t3650: document bug when directory renames are turned off Johannes Schindelin via GitGitGadget
2025-03-13 2:46 ` [PATCH v2 5/6] merge-ort: fix merge.directoryRenames=false Elijah Newren via GitGitGadget
2025-03-13 2:46 ` [PATCH v2 6/6] am: switch from merge_recursive_generic() to merge_ort_generic() Elijah Newren via GitGitGadget
2025-03-17 21:25 ` [PATCH v2 0/6] Small new merge-ort features, prepping for deletion of merge-recursive.[ch] Taylor Blau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z9FAgCSCZSJnzv9d@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=newren@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).