]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort: optionally produce machine-readable output
authorElijah Newren <newren@gmail.com>
Sat, 18 Jun 2022 00:20:57 +0000 (00:20 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 22 Jun 2022 23:10:06 +0000 (16:10 -0700)
With the new `detailed` parameter, a new mode can be triggered when
displaying the merge messages: The `detailed` mode prints NUL-delimited
fields of the following form:

<path-count> NUL <path>... NUL <conflict-type> NUL <message>

The `<path-count>` field determines how many `<path>` fields there are.

The intention of this mode is to support server-side operations, where
worktree-less merges can lead to conflicts and depending on the type
and/or path count, the caller might know how to handle said conflict.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/merge-tree.c
merge-ort.c
merge-ort.h

index c61b5b4a10dcc18951e228603147ebd33c29bcab..b3c5692498e8cd72b71182ae5b320428043d5037 100644 (file)
@@ -468,7 +468,8 @@ static int real_merge(struct merge_tree_options *o,
        }
        if (o->show_messages) {
                putchar(line_termination);
-               merge_display_update_messages(&opt, &result);
+               merge_display_update_messages(&opt, line_termination == '\0',
+                                             &result);
        }
        merge_finalize(&opt, &result);
        return !result.clean; /* result.clean < 0 handled above */
index 6081b29705b763decbf2d97dd68e2198ca9e80d4..01f150ef3b56bb693a1d8c466ca129aa3835eb57 100644 (file)
@@ -4413,6 +4413,7 @@ static int record_conflicted_index_entries(struct merge_options *opt)
 }
 
 void merge_display_update_messages(struct merge_options *opt,
+                                  int detailed,
                                   struct merge_result *result)
 {
        struct merge_options_internal *opti = result->priv;
@@ -4438,8 +4439,25 @@ void merge_display_update_messages(struct merge_options *opt,
        /* Iterate over the items, printing them */
        for (int path_nr = 0; path_nr < olist.nr; ++path_nr) {
                struct string_list *conflicts = olist.items[path_nr].util;
-               for (int i = 0; i < conflicts->nr; i++)
+               for (int i = 0; i < conflicts->nr; i++) {
+                       struct logical_conflict_info *info =
+                               conflicts->items[i].util;
+
+                       if (detailed) {
+                               printf("%lu", (unsigned long)info->paths.nr);
+                               putchar('\0');
+                               for (int n = 0; n < info->paths.nr; n++) {
+                                       fputs(info->paths.v[n], stdout);
+                                       putchar('\0');
+                               }
+                               fputs(type_short_descriptions[info->type],
+                                     stdout);
+                               putchar('\0');
+                       }
                        puts(conflicts->items[i].string);
+                       if (detailed)
+                               putchar('\0');
+               }
        }
        string_list_clear(&olist, 0);
 
@@ -4519,7 +4537,7 @@ void merge_switch_to_result(struct merge_options *opt,
                trace2_region_leave("merge", "write_auto_merge", opt->repo);
        }
        if (display_update_msgs)
-               merge_display_update_messages(opt, result);
+               merge_display_update_messages(opt, /* detailed */ 0, result);
 
        merge_finalize(opt, result);
 }
index c4909bcbf962577260a65fba481ec9c4919837c5..a994c9a5fcdb040b3ecb80db0489a50c1394ac75 100644 (file)
@@ -87,6 +87,7 @@ void merge_switch_to_result(struct merge_options *opt,
  * so only call this when bypassing merge_switch_to_result().
  */
 void merge_display_update_messages(struct merge_options *opt,
+                                  int detailed,
                                   struct merge_result *result);
 
 struct stage_info {