Re: [PATCH 09/12] merge-tree: provide a list of which files have conflicts
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Jan 28, 2022, 16:57 UTC
- Message-ID
- <nycvar.QRO.7.76.6.2201281755200.347@tvgsbejvaqbjf.bet>
- In-Reply-To
- <fcbb087fa8865ac05e20473d822cd9795590ee38.1642888562.git.gitgitgadget@gmail.com>
Hi Elijah,
On Sat, 22 Jan 2022, Elijah Newren via GitGitGadget wrote:
Show 26 quoted lines
> From: Elijah Newren <newren@gmail.com> > > 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@gmail.com> > --- > 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...
Show 62 quoted lines
>
> 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...
Show 23 quoted lines
> 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
Show 18 quoted lines
> @@ -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
>
>