All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Phillip Wood <phillip.wood123@gmail.com>
Cc: git@vger.kernel.org,  Elijah Newren <newren@gmail.com>,
	 Johannes Sixt <j6t@kdbg.org>
Subject: Re: [PATCH v3 2/2] merge: remember conflict labels
Date: Fri, 09 Oct 2026 17:24:06 -0700	[thread overview]
Message-ID: <xmqq1p9yjtcp.fsf@gitster.g> (raw)
In-Reply-To: <182edb2e8874986206a38a0af005e4df9ef9dd8f.1791537203.git.phillip.wood@dunelm.org.uk> (Phillip Wood's message of "Fri, 9 Oct 2026 10:13:25 +0100")

Phillip Wood <phillip.wood123@gmail.com> writes:

> @@ -347,10 +349,19 @@ static int checkout_merged(int pos, const struct checkout *state,
>  
>  	repo_config_get_bool(the_repository, "merge.renormalize", &renormalize);
>  	ll_opts.renormalize = renormalize;
> +	if (read_merge_labels(the_repository, &base_label, &ours_label,
> +			      &theirs_label)) {
> +		base_label = xstrdup("base");
> +		ours_label = xstrdup("ours");
> +		theirs_label = xstrdup("theirs");
> +	}
>  	ll_opts.conflict_style = conflict_style;
> -	merge_status = ll_merge(&result_buf, path, &ancestor, "base",
> -				&ours, "ours", &theirs, "theirs",
> +	merge_status = ll_merge(&result_buf, path, &ancestor, base_label,
> +				&ours, ours_label, &theirs, theirs_label,
>  				state->istate, &ll_opts);
> +	free(base_label);
> +	free(ours_label);
> +	free(theirs_label);
>  	free(ancestor.ptr);
>  	free(ours.ptr);
>  	free(theirs.ptr);


This function is called once for each conflicted path, which means
we would read the "merge.renormalize" configuration variable and the
MERGE_LABELS file, both of which will stay constant during a single
conflicted "checkout -m".  The issue is shared with the original,
but looking up the same configuration variable repeatedly would be
helped with in-core configset cache.  Compared to that, the overhead
added by this patch is to open the same unchanging file, read & parse,
allocate and deallocate.

Perhaps we want to have another preliminary [PATCH 1.5/2] before
this step to allow setting these "per invocation constants" once to
be reused?  Then step [PATCH 2/2] can read labels in the prepare
phace just once, use it from the data structure in
checkout_merged(), and free them in release phase when we are done.


 builtin/checkout.c | 37 +++++++++++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 6 deletions(-)

diff --git i/builtin/checkout.c w/builtin/checkout.c
index c0f0d2c700..a02cbacf1d 100644
--- i/builtin/checkout.c
+++ w/builtin/checkout.c
@@ -310,9 +310,27 @@ static int checkout_stage(int stage, const struct cache_entry *ce, int pos,
 		return error(_("path '%s' does not have their version"), ce->name);
 }
 
+struct checkout_merged_data {
+	int conflict_style;
+	int renormalize;
+	/* we will add more later */
+};
+
+static void checkout_merged_release(struct checkout_merged_data *data)
+{
+	; /* nothing to free (yet) */
+}
+
+static void checkout_merged_prepare(struct checkout_merged_data *data)
+{
+	int renormalize = 0;
+	repo_config_get_bool(the_repository, "merge.renormalize", &renormalize);
+	data->renormalize = renormalize;
+}
+
 static int checkout_merged(int pos, const struct checkout *state,
 			   int *nr_checkouts, struct mem_pool *ce_mem_pool,
-			   int conflict_style)
+			   struct checkout_merged_data *data)
 {
 	struct cache_entry *ce = the_repository->index->cache[pos];
 	const char *path = ce->name;
@@ -324,7 +342,6 @@ static int checkout_merged(int pos, const struct checkout *state,
 	struct object_id threeway[3];
 	unsigned mode = 0;
 	struct ll_merge_options ll_opts = LL_MERGE_OPTIONS_INIT;
-	int renormalize = 0;
 
 	memset(threeway, 0, sizeof(threeway));
 	while (pos < the_repository->index->cache_nr) {
@@ -345,9 +362,8 @@ static int checkout_merged(int pos, const struct checkout *state,
 	read_mmblob(&ours, the_repository->objects, &threeway[1]);
 	read_mmblob(&theirs, the_repository->objects, &threeway[2]);
 
-	repo_config_get_bool(the_repository, "merge.renormalize", &renormalize);
-	ll_opts.renormalize = renormalize;
-	ll_opts.conflict_style = conflict_style;
+	ll_opts.renormalize = data->renormalize;
+	ll_opts.conflict_style = data->conflict_style;
 	merge_status = ll_merge(&result_buf, path, &ancestor, "base",
 				&ours, "ours", &theirs, "theirs",
 				state->istate, &ll_opts);
@@ -446,6 +462,7 @@ static int checkout_worktree(const struct checkout_opts *opts,
 	int pos;
 	int pc_workers, pc_threshold;
 	struct mem_pool ce_mem_pool;
+	struct checkout_merged_data checkout_merged_data = {0};
 
 	state.force = 1;
 	state.refresh_cache = 1;
@@ -462,6 +479,10 @@ static int checkout_worktree(const struct checkout_opts *opts,
 	if (pc_workers > 1)
 		init_parallel_checkout();
 
+	if (opts->merge) {
+		checkout_merged_prepare(&checkout_merged_data);
+		checkout_merged_data.conflict_style = opts->conflict_style;
+	}
 	for (pos = 0; pos < the_repository->index->cache_nr; pos++) {
 		struct cache_entry *ce = the_repository->index->cache[pos];
 		if (ce->ce_flags & CE_MATCHED) {
@@ -479,10 +500,14 @@ static int checkout_worktree(const struct checkout_opts *opts,
 				errs |= checkout_merged(pos, &state,
 							&nr_unmerged,
 							&ce_mem_pool,
-							opts->conflict_style);
+							&checkout_merged_data);
 			pos = skip_same_name(ce, pos) - 1;
 		}
 	}
+
+	if (opts->merge)
+		checkout_merged_release(&checkout_merged_data);
+
 	if (pc_workers > 1)
 		errs |= run_parallel_checkout(&state, pc_workers, pc_threshold,
 					      NULL, NULL);

  reply	other threads:[~2026-10-10  0:24 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-30  9:48 [PATCH 0/2] checkout -m: recreate conflict labels Phillip Wood
2026-09-30  9:48 ` [PATCH 1/2] remove_branch_state: convert boolean argument to flags Phillip Wood
2026-09-30  9:48 ` [PATCH 2/2] merge: remember conflict labels Phillip Wood
2026-09-30 16:42   ` Junio C Hamano
2026-10-01  8:54     ` Phillip Wood
2026-10-01 17:14       ` Junio C Hamano
2026-09-30 20:24 ` [PATCH 0/2] checkout -m: recreate " Johannes Sixt
2026-09-30 20:40   ` Junio C Hamano
2026-09-30 21:20     ` Johannes Sixt
2026-10-01  8:45   ` Phillip Wood
2026-10-05 13:24 ` [PATCH v2 " Phillip Wood
2026-10-05 13:24   ` [PATCH v2 1/2] remove_branch_state: convert boolean argument to flags Phillip Wood
2026-10-05 13:24   ` [PATCH v2 2/2] merge: remember conflict labels Phillip Wood
2026-10-05 16:19     ` Junio C Hamano
2026-10-06 15:21       ` Phillip Wood
2026-10-05 16:31     ` Junio C Hamano
2026-10-06 15:05       ` Phillip Wood
2026-10-06 15:46     ` Junio C Hamano
2026-10-07 13:38       ` Phillip Wood
2026-10-05 14:48   ` [PATCH v2 0/2] checkout -m: recreate " Johannes Sixt
2026-10-05 15:09     ` Phillip Wood
2026-10-05 15:53   ` Junio C Hamano
2026-10-09  9:13 ` [PATCH v3 " Phillip Wood
2026-10-09  9:13   ` [PATCH v3 1/2] remove_branch_state: convert boolean argument to flags Phillip Wood
2026-10-09  9:13   ` [PATCH v3 2/2] merge: remember conflict labels Phillip Wood
2026-10-10  0:24     ` Junio C Hamano [this message]
2026-10-12 14:10       ` Phillip Wood
2026-10-12 15:09         ` Junio C Hamano
2026-10-13 15:49           ` Phillip Wood
2026-10-09 20:31   ` [PATCH v3 0/2] checkout -m: recreate " Junio C Hamano
2026-10-13 15:47 ` [PATCH v4 0/3] " Phillip Wood
2026-10-13 15:47   ` [PATCH v4 1/3] remove_branch_state: convert boolean argument to flags Phillip Wood
2026-10-13 15:47   ` [PATCH v4 2/3] checkout -m <path>: cache merge settings Phillip Wood
2026-10-13 15:47   ` [PATCH v4 3/3] merge: remember conflict labels Phillip Wood

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=xmqq1p9yjtcp.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=j6t@kdbg.org \
    --cc=newren@gmail.com \
    --cc=phillip.wood123@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.