Re: [PATCH v2] merge-file: honor merge.conflictStyle outside of a repository
- From
Yannik Tausch <dev@ytausch.de>
- Date
- Feb 5, 2026, 21:55 UTC
- Message-ID
- <D514F3BA-36DD-4DAD-BF73-609730390A27@ytausch.de>
- In-Reply-To
- <fa7fc215-03eb-492d-9af4-457482c56a48@app.fastmail.com>
> Junio C Hamano <gitster@pobox.com> wrote:
Show 6 quoted lines
> Wouldn't it suffice to unconditionally execute the body of the if > (startup_info->have_repository) block to pass "repo" we obtained > from the caller to repo_config() instead of the_repository? The > caller of this function passes us either the_repository or NULL and > repo_config() does the very-early thing when passed NULL as the > repo, signalling that we are outside a repository.
Jup, looks like I missed that. Implemented your suggestion!
> Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com> wrote:
> Preferably the message should discuss the code as it exists without the > patch applied in the present tense. (SubmittingPatches present-tense)
Fixed!
Show 6 quoted lines
> >> read from system and user configuration files using >> read_very_early_config(), so that users can set their preferred >> conflict style globally and have it honored even outside a repository. > > The update to the documentation might merit an “also”? I dunno.
Added!
> You need to replace this blank line with a `+` if you want this to be > the second paragraph on this option.
Fixed!
> Some tests in this file already use the regular expect/actual but there > are also many one-off names like expect.c/myers_output.c. I don’t > understand why. But I’m just thinking out loud here.
I also don’t understand why, but considering your point, I don’t see a reason to not use the regular expect/actual convention. Fixed.
> It seems you might as well break the lines for this command further with > some `\` to get closer to the soft limit.
Done!
Here is the new patch:
From 9fa437c70bfd328cfdfe9cfca982b49b70ad033f Mon Sep 17 00:00:00 2001 From: Yannik Tausch <dev@ytausch.de> Date: Thu, 5 Feb 2026 21:09:52 +0100 Subject: [PATCH v2] merge-file: honor merge.conflictStyle outside of a repository
When running outside a repository, git merge-file ignores the merge.conflictStyle configuration variable entirely. Since the function receives `repo` from the caller (which is NULL outside a repository), and repo_config() falls back to reading system and user configuration when passed NULL, pass `repo` to repo_config() unconditionally.
Also document that merge.conflictStyle is honored.
Signed-off-by: Yannik Tausch <dev@ytausch.de> ---
Notes:
Changes since v1:
- Use repo parameter directly with repo_config() (Junio)
- Fix AsciiDoc continuation, rename test files, break long
lines (Kristoffer)Documentation/git-merge-file.adoc | 3 +++ builtin/merge-file.c | 12 +++++------ t/t6403-merge-file.sh | 36 +++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-)
diff --git a/Documentation/git-merge-file.adoc b/Documentation/git-merge-file.adoc index 71915a00fa..9dc5d8a370 100644 --- a/Documentation/git-merge-file.adoc +++ b/Documentation/git-merge-file.adoc @@ -85,6 +85,9 @@ object store and the object ID of its blob is written to standard output. --zdiff3:: Show conflicts in "zdiff3" style. ++ +The `--diff3` and `--zdiff3` options default to the value of the +`merge.conflictStyle` configuration variable (see linkgit:git-config[1]). --ours:: --theirs:: diff --git a/builtin/merge-file.c b/builtin/merge-file.c index 46775d0c79..f9de636884 100644 --- a/builtin/merge-file.c +++ b/builtin/merge-file.c @@ -60,7 +60,7 @@ static int diff_algorithm_cb(const struct option *opt, int cmd_merge_file(int argc, const char **argv, const char *prefix, - struct repository *repo UNUSED) + struct repository *repo) { const char *names[3] = { 0 }; mmfile_t mmfs[3] = { 0 }; @@ -95,12 +95,10 @@ int cmd_merge_file(int argc, xmp.style = 0; xmp.favor = 0; - if (startup_info->have_repository) { - /* Read the configuration file */ - repo_config(the_repository, git_xmerge_config, NULL); - if (0 <= git_xmerge_style) - xmp.style = git_xmerge_style; - } + /* Read the configuration file */ + repo_config(repo, git_xmerge_config, NULL); + if (0 <= git_xmerge_style) + xmp.style = git_xmerge_style; argc = parse_options(argc, argv, prefix, options, merge_file_usage, 0); if (argc != 3) diff --git a/t/t6403-merge-file.sh b/t/t6403-merge-file.sh index 06ab4d7aed..4d6e748320 100755 --- a/t/t6403-merge-file.sh +++ b/t/t6403-merge-file.sh @@ -428,6 +428,42 @@ test_expect_success '"diff3 -m" style output (2)' ' test_cmp expect actual ' +test_expect_success 'merge.conflictStyle honored outside repo' ' + test_config_global merge.conflictStyle diff3 && + cat >nongit-base <<-\EOF && + line1 + original + line3 + EOF + cat >nongit-ours <<-\EOF && + line1 + ours + line3 + EOF + cat >nongit-theirs <<-\EOF && + line1 + theirs + line3 + EOF + cat >expect <<-\EOF && + line1 + <<<<<<< ours + ours + ||||||| base + original + ======= + theirs + >>>>>>> theirs + line3 + EOF + test_must_fail nongit git merge-file -p \ + -L ours -L base -L theirs \ + "$PWD/nongit-ours" \ + "$PWD/nongit-base" \ + "$PWD/nongit-theirs" >actual && + test_cmp expect actual +' + test_expect_success 'marker size' ' cat >expect <<-\EOF && Dominus regit me,
-- 2.52.0