Hi Elijah, On Sat, 22 Jan 2022, Elijah Newren via GitGitGadget wrote: > From: Elijah Newren <newren@xxxxxxxxx> > > Callers of `git merge-tree --write-tree` will often want to know which > files had conflicts. While they could potentially attempt to parse the > CONFLICT notices printed, those messages are not meant to be machine > readable. Provide a simpler mechanism of just printing the files (in > the same format as `git ls-files` with quoting, but restricted to > unmerged files) in the output before the free-form messages. > > Signed-off-by: Elijah Newren <newren@xxxxxxxxx> > --- > Documentation/git-merge-tree.txt | 8 ++++++++ > builtin/merge-tree.c | 24 ++++++++++++++++++++++-- > t/t4301-merge-tree-real.sh | 11 +++++++++++ > 3 files changed, 41 insertions(+), 2 deletions(-) > > diff --git a/Documentation/git-merge-tree.txt b/Documentation/git-merge-tree.txt > index fd7a867de60..041a4ac2785 100644 > --- a/Documentation/git-merge-tree.txt > +++ b/Documentation/git-merge-tree.txt > @@ -58,6 +58,7 @@ simply one line: > Whereas for a conflicted merge, the output is by default of the form: > > <OID of toplevel tree> > + <Conflicted file list> > <Informational messages> To distinguish between the list of conflicted files and the informational messages, I think it would be good to insert an empty line, as a separator, like. And... > > These are discussed individually below. > @@ -69,6 +70,13 @@ This is a tree object that represents what would be checked out in the > working tree at the end of `git merge`. If there were conflicts, then > files within this tree may have embedded conflict markers. > > +Conflicted file list > +~~~~~~~~~~~~~~~~~~~~ > + > +This is a sequence of lines containing a filename on each line, quoted > +as explained for the configuration variable `core.quotePath` (see > +linkgit:git-config[1]). > + > Informational messages > ~~~~~~~~~~~~~~~~~~~~~~ > > diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c > index 560640ad911..d8eeeb3f306 100644 > --- a/builtin/merge-tree.c > +++ b/builtin/merge-tree.c > @@ -11,6 +11,9 @@ > #include "blob.h" > #include "exec-cmd.h" > #include "merge-blobs.h" > +#include "quote.h" > + > +static int line_termination = '\n'; > > struct merge_list { > struct merge_list *next; > @@ -395,7 +398,8 @@ struct merge_tree_options { > }; > > static int real_merge(struct merge_tree_options *o, > - const char *branch1, const char *branch2) > + const char *branch1, const char *branch2, > + const char *prefix) > { > struct commit *parent1, *parent2; > struct commit_list *common; > @@ -449,6 +453,22 @@ static int real_merge(struct merge_tree_options *o, > o->show_messages = !result.clean; > > printf("%s\n", oid_to_hex(&result.tree->object.oid)); > + if (!result.clean) { > + struct string_list conflicted_files = STRING_LIST_INIT_NODUP; > + const char *last = NULL; > + int i; > + > + merge_get_conflicted_files(&result, &conflicted_files); > + for (i = 0; i < conflicted_files.nr; i++) { > + const char *name = conflicted_files.items[i].string; > + if (last && !strcmp(last, name)) > + continue; > + write_name_quoted_relative( > + name, prefix, stdout, line_termination); > + last = name; > + } > + string_list_clear(&conflicted_files, 1); > + } > if (o->show_messages) { > printf("\n"); ... it seems that we do this already... > merge_display_update_messages(&opt, &result, stdout); > @@ -502,7 +522,7 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix) > > /* Do the relevant type of merge */ > if (o.real) > - return real_merge(&o, argv[0], argv[1]); > + return real_merge(&o, argv[0], argv[1], prefix); > else > return trivial_merge(argv[0], argv[1], argv[2]); > } > diff --git a/t/t4301-merge-tree-real.sh b/t/t4301-merge-tree-real.sh > index c34f8e6c1ed..43c9950dedb 100755 > --- a/t/t4301-merge-tree-real.sh > +++ b/t/t4301-merge-tree-real.sh > @@ -94,6 +94,8 @@ test_expect_success 'test conflict notices and such' ' > # "whatever" has *both* a modify/delete and a file/directory conflict > cat <<-EOF >expect && > HASH > + greeting > + whatever~side1 > > Auto-merging greeting > CONFLICT (content): Merge conflict in greeting ... as illustrated by the test, too. I guess the documentation should show the empty line, too? Ciao, Dscho > @@ -105,4 +107,13 @@ test_expect_success 'test conflict notices and such' ' > test_cmp expect actual > ' > > +test_expect_success 'Just the conflicted files without the messages' ' > + test_expect_code 1 git merge-tree --write-tree --no-messages side1 side2 >out && > + sed -e "s/[0-9a-f]\{40,\}/HASH/g" out >actual && > + > + test_write_lines HASH greeting whatever~side1 >expect && > + > + test_cmp expect actual > +' > + > test_done > -- > gitgitgadget > >