git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Elijah Newren <newren@gmail.com>
To: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Cc: "Junio C Hamano" <gitster@pobox.com>,
	"Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com>,
	"Git Mailing List" <git@vger.kernel.org>,
	"Christian Couder" <chriscool@tuxfamily.org>,
	"Taylor Blau" <me@ttaylorr.com>,
	"Johannes Altmanninger" <aclopte@gmail.com>,
	"Ramsay Jones" <ramsay@ramsayjones.plus.com>,
	"Johannes Schindelin" <Johannes.Schindelin@gmx.de>,
	"Christian Couder" <christian.couder@gmail.com>,
	"René Scharfe" <l.s.r@web.de>, "Johannes Sixt" <j6t@kdbg.org>
Subject: Re: [PATCH v2 11/13] merge-tree: provide easy access to `ls-files -u` style info
Date: Thu, 3 Feb 2022 00:39:18 -0800	[thread overview]
Message-ID: <CABPp-BHKpOPM85bRiYmtZ6YT7AK_jpn6aen+o9jeNM6Jwbns=A@mail.gmail.com> (raw)
In-Reply-To: <220203.86iltw7nhm.gmgdl@evledraar.gmail.com>

On Wed, Feb 2, 2022 at 5:22 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
>
> On Wed, Feb 02 2022, Elijah Newren wrote:
>
> > On Wed, Feb 2, 2022 at 1:32 PM Junio C Hamano <gitster@pobox.com> wrote:
> >>
> >> "Elijah Newren via GitGitGadget" <gitgitgadget@gmail.com> writes:
> >>
> >> > @@ -450,7 +451,11 @@ static int real_merge(struct merge_tree_options *o,
> >> >               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))
> >> > +                     struct stage_info *c = conflicted_files.items[i].util;
> >> > +                     if (!o->exclude_modes_oids_stages)
> >> > +                             printf("%06o %s %d\t",
> >> > +                                    c->mode, oid_to_hex(&c->oid), c->stage);
> >> > +                     else if (last && !strcmp(last, name))
> >> >                               continue;
> >> >                       write_name_quoted_relative(
> >> >                               name, prefix, stdout, line_termination);
> >>
> >> OK.  The addition (and disabling of the deduping) is quite trivial.
> >> We do not even have to worry about line termination since the extra
> >> pieces of info are prepended to the pathname.  Nice.
> >>
> >> > @@ -485,6 +490,10 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
> >> >                           N_("do a trivial merge only"), 't'),
> >> >               OPT_BOOL(0, "messages", &o.show_messages,
> >> >                        N_("also show informational/conflict messages")),
> >> > +             OPT_BOOL_F('l', "exclude-modes-oids-stages",
> >> > +                        &o.exclude_modes_oids_stages,
> >> > +                        N_("list conflicted files without modes/oids/stages"),
> >> > +                        PARSE_OPT_NONEG),
> >>
> >> Why does "-l" give shorter output than without it?  "-l" strongly
> >> hints a longer output than without, at least to me.  Just wondering
> >> if this will not become a source of confusion to future scripting
> >> users.
> >
> > Here's another example where I was struggling with naming.  Something
> > like ls-tree's `--name-only` would have been nice, but I was worried
> > it'd be confusing since it only affected the conflicted info section
> > and does not suppress the printing of the toplevel tree or the
> > informational messages sections.  And the name
> > --exclude-modes-oids-stages was long enough that I wanted a short flag
> > for it, and just used the first letter of the description ("list
> > conflicted files...").  I'm happy to change either the long or the
> > short name for this flag if anyone has suggestions.
>
> There's always sidestepping it by replacing it with a --format :)

Another solution that occurred to me, and I was _really_ close to
doing it for v3, was to just flat drop this patch entirely and not
include any such option.  But...

  * "Which files had conflicts?" seems like such an obvious question
  * I've used `git ls-files -u | awk {print\$4} | uniq` a lot in the
past after `git merge` (Or `git rebase`) to get this info (yeah, it
turns out `git diff --name-only --diff-filter=U` is 4 fewer
characters)
  * "display the list of files where conflicts were present in the web
UI" was listed as an early usecase[1]

[1] https://lore.kernel.org/git/YYlqpuzv+bmZaFzz@nand.local/

So it seemed like making that question easy to answer was worthwhile.

> Anyway, I'd mentioned that in an earlier review in
> <220124.864k5tigto.gmgdl@evledraar.gmail.com>. FWIW here's an experiment
> to do that that I polished up (mostly copied from the ls-tree WIP code
> I'd written already).
>
> I don't know if it will ever be useful, or if you think it's
> worthwhile/simpler, but in either case I think in doing this I spotted
> the following issues or otherwise noted inconsistencies in the pre-image:
>
>    The docs say that "<stage> <path>" is SP-separated, but it's
>    actually TAB-separated, the rest is SP-separated.

Yeah, good catch.  However, it doesn't actually say they are
SP-separated; it's ambiguous about the spacing.  Which probably isn't
a good thing, but it was kind of copied from the ls-files manual:

"""
       git ls-files just outputs the filenames unless --stage is specified in
       which case it outputs:

           [<tag> ]<mode> <object> <stage> <file>
"""

(which also uses a tab between <stage> and <file> and a space
otherwise, but the output above may lead you to believe otherwise.)

>  * That you de-dupe --exclude-modes-oids-stages is a bit of a hidden feature,
>    but argubly initiative. Should it by optional? In any case my formatting
>    experiment makes it optional, since it then needs to be generalized to de-dupe
>    after we've formatted.

I think without de-duping the flag isn't helpful enough to bother
implementing.  Requiring two flags also seems painful, given the
common case scenario.

I hope I'm not coming across as dismissive.  I think eventually adding
a --format and --dedupe (the combination of which might be implied by
whatever flag is used now) might be useful additions.  Maybe --abbrev
too...eventually.  But I'm worried that it's distracting from focusing
on usecases.  In particular, I'm worried it leads to "well, script
writers technically can get what they want because we provided
everything" rather than focusing on making the most common things easy
to get, and then extending the command for flexibility as needed
later.

I'd really rather that early versions _just_ focus on actual usecases
as far as UI is concerned (and thus I was really happy to see Dscho
and Taylor concentrate on that side; I think Christian might have been
talking about that angle some but it was hard to differentiate from
the "merge-tree on steroids" spitballing).  While I want to be careful
to avoid preventing UI flexibility, I think building it in from the
beginning tends to lead to a design that is less usable.  (e.g. the
possible loss of de-duping that would naturally have arisen from
looking at things from the other angle.)  It's just a bias I have.

>  * Perhaps we should support --abbrev as ls-tree does? The below diff shows
>    it's easy enough.

This one is less problematic to me, but I'd still rather that the UI
side of things focused on the usecases for early versions.

>  * The dance you have with sed-ing out the hash in the tests could be made much
>    easier with "sed 1d <out >actual" and --no-messages for some existing tests.

Ignoring the first line is semantically different than verifying it
looks like a hash.  It also only works on the first line, and hashes
appear in multiple places, so you'd need a variety of different sed
commands for different parts of the output, which doesn't seem any
easier at all to me; I think using the same replacement everywhere is
simpler.  But perhaps I should turn it into a shell function that I
use in each case.

> diff --git a/Documentation/git-merge-tree.txt b/Documentation/git-merge-tree.txt
> index 6a2ed475106..e906d1dc9bf 100644
> --- a/Documentation/git-merge-tree.txt
> +++ b/Documentation/git-merge-tree.txt
> @@ -44,10 +44,9 @@ OPTIONS
>         newline.  Also begin the messages section with a NUL character
>         instead of a newline.  See OUTPUT below for more information.
>
> ---exclude-oids-and-modes::
> -       Instead of writing a list of (mode, oid, stage, path) tuples
> -       to output for conflicted files, just provide a list of
> -       filenames with conflicts.
> +--conflict-format::
> +       Override the default "%(objectmode) %(objectname)
> +       %(stage)%x09%(path)" format.
>
>  --[no-]messages::
>         Write any informational messages such as "Auto-merging <path>"
> @@ -89,13 +88,13 @@ Conflicted file info
>
>  This is a sequence of lines with the format
>
> -       <mode> <object> <stage> <filename>
> +       %(objectmode) %(objectname) %(stage)%x09%(path)
>
>  The filename will be quoted as explained for the configuration
> -variable `core.quotePath` (see linkgit:git-config[1]).  However, if
> -the `--exclude-oids-and-modes` option is passed, the mode, object, and
> -stage will be omitted.  If `-z` is passed, the "lines" are terminated
> -by a NUL character instead of a newline character.
> +variable `core.quotePath` (see linkgit:git-config[1]).
> +
> +If `-z` is passed, the "lines" are terminated by a NUL character
> +instead of a newline character.
>
>  Informational messages
>  ~~~~~~~~~~~~~~~~~~~~~~
> diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
> index 58c0ddc5a32..14fed95a8ce 100644
> --- a/builtin/merge-tree.c
> +++ b/builtin/merge-tree.c
> @@ -395,9 +395,64 @@ struct merge_tree_options {
>         int mode;
>         int allow_unrelated_histories;
>         int show_messages;
> -       int exclude_modes_oids_stages;
> +       const char *conflict_format;
> +       int unique_conflicts;
> +       int abbrev;
>  };
>
> +struct expand_conflict_data {
> +       const char *prefix;
> +       struct string_list_item *item;
> +       struct strbuf *scratch;
> +       int abbrev;
> +       struct strbuf *sb_tmp;
> +};
> +static size_t expand_conflict_format(struct strbuf *sb,
> +                                    const char *start,
> +                                    void *context)
> +{
> +       struct expand_conflict_data *data = context;
> +       struct string_list_item *item = data->item;
> +       struct stage_info *info = item->util;
> +       const char *end;
> +       const char *p;
> +       size_t len;
> +
> +       len = strbuf_expand_literal_cb(sb, start, NULL);
> +       if (len)
> +               return len;
> +
> +       if (*start != '(')
> +               die(_("bad format as of '%s'"), start);
> +       end = strchr(start + 1, ')');
> +       if (!end)
> +               die(_("format element '%s' does not end in ')'"), start);
> +       len = end - start + 1;
> +
> +       if (skip_prefix(start, "(objectmode)", &p)) {
> +               strbuf_addf(sb, "%06o", info->mode);
> +       } else if (skip_prefix(start, "(objectname)", &p)) {
> +               strbuf_addstr(sb, find_unique_abbrev(&info->oid, data->abbrev));
> +       } else if (skip_prefix(start, "(stage)", &p)) {
> +               strbuf_addf(sb, "%d", info->stage);
> +       } else if (skip_prefix(start, "(path)", &p)) {
> +               const char *name = item->string;
> +
> +               if (data->prefix)
> +                       name = relative_path(name, data->prefix, data->scratch);
> +               strbuf_addstr(sb, name);
> +
> +               strbuf_reset(data->sb_tmp);
> +               /* The relative_path() function resets "scratch" */
> +
> +       } else {
> +               unsigned int errlen = (unsigned long)len;
> +               die(_("bad format specifier %%%.*s"), errlen, start);
> +       }
> +
> +       return len;
> +}
> +
>  static int real_merge(struct merge_tree_options *o,
>                       const char *branch1, const char *branch2,
>                       const char *prefix)
> @@ -446,23 +501,43 @@ static int real_merge(struct merge_tree_options *o,
>         puts(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;
> +               struct string_list_item *item;
> +               char *last = NULL;
> +               struct strbuf sb = STRBUF_INIT;
> +               struct strbuf tmp = STRBUF_INIT;
>
>                 merge_get_conflicted_files(&result, &conflicted_files);
> -               for (i = 0; i < conflicted_files.nr; i++) {
> -                       const char *name = conflicted_files.items[i].string;
> -                       struct stage_info *c = conflicted_files.items[i].util;
> -                       if (!o->exclude_modes_oids_stages)
> -                               printf("%06o %s %d\t",
> -                                      c->mode, oid_to_hex(&c->oid), c->stage);
> -                       else if (last && !strcmp(last, name))
> +               for_each_string_list_item(item, &conflicted_files) {
> +                       struct expand_conflict_data ctx = {
> +                               .prefix = prefix,
> +                               .item = item,
> +                               .abbrev = o->abbrev,
> +                               .scratch = &sb,
> +                               .sb_tmp = &tmp,
> +                       };
> +
> +                       strbuf_expand(&sb, o->conflict_format, expand_conflict_format, &ctx);
> +                       strbuf_addch(&sb, line_termination);
> +
> +                       if (o->unique_conflicts && last && !strcmp(last, sb.buf)) {
> +                               free(last);
> +                               last = strbuf_detach(&sb, NULL);
>                                 continue;
> -                       write_name_quoted_relative(
> -                               name, prefix, stdout, line_termination);
> -                       last = name;
> +                       }
> +
> +                       fwrite(sb.buf, sb.len, 1, stdout);
> +
> +                       if (o->unique_conflicts) {
> +                               free(last);
> +                               last = strbuf_detach(&sb, NULL);
> +                       } else {
> +                               strbuf_reset(&sb);
> +                       }
>                 }
>                 string_list_clear(&conflicted_files, 1);
> +               strbuf_release(&sb);
> +               strbuf_release(&tmp);
> +               free(last);
>         }
>         if (o->show_messages) {
>                 putchar(line_termination);
> @@ -474,7 +549,11 @@ static int real_merge(struct merge_tree_options *o,
>
>  int cmd_merge_tree(int argc, const char **argv, const char *prefix)
>  {
> -       struct merge_tree_options o = { .show_messages = -1 };
> +       struct merge_tree_options o = {
> +               .show_messages = -1,
> +               .conflict_format = "%(objectmode) %(objectname) %(stage)%x09%(path)",
> +               .unique_conflicts = 1,
> +       };
>         int expected_remaining_argc;
>         int original_argc;
>
> @@ -493,14 +572,15 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
>                          N_("also show informational/conflict messages")),
>                 OPT_SET_INT('z', NULL, &line_termination,
>                             N_("separate paths with the NUL character"), '\0'),
> -               OPT_BOOL_F('l', "exclude-modes-oids-stages",
> -                          &o.exclude_modes_oids_stages,
> -                          N_("list conflicted files without modes/oids/stages"),
> -                          PARSE_OPT_NONEG),
> +               OPT_STRING(0, "conflict-format", &o.conflict_format, N_("format"),
> +                          N_("specify a custom format to use for conflicted files")),
> +               OPT_BOOL(0, "unique-conflicts", &o.unique_conflicts,
> +                        N_("omit duplicate --conflict-format lines")),

The latter of which you didn't include in the manual?  Also,
unique_conflicts seems like something that is trivial to understand
from the coding perspective, but probably require quite a bit more
explanation from the manual.  For example, if objectname is included
in the format, unique-conflicts is essentially a no-op.  And that's
the default...so, you'd probably have to spend time in the manual
explaining under what circumstances it's useful.  I'm also not sure if
a user who wanted (mode, path) would want unique_conflicts to default
to 1; it may be something only meaningful in the particular case of
"just give me conflicted filenames".

>                 OPT_BOOL_F(0, "allow-unrelated-histories",
>                            &o.allow_unrelated_histories,
>                            N_("allow merging unrelated histories"),
>                            PARSE_OPT_NONEG),
> +               OPT__ABBREV(&o.abbrev),
>                 OPT_END()
>         };
>
> diff --git a/t/t4301-merge-tree-write-tree.sh b/t/t4301-merge-tree-write-tree.sh
> index 4de089d976d..e6354b2d284 100755
> --- a/t/t4301-merge-tree-write-tree.sh
> +++ b/t/t4301-merge-tree-write-tree.sh
> @@ -93,7 +93,7 @@ test_expect_success 'Barf on too many arguments' '
>  '
>
>  test_expect_success 'test conflict notices and such' '
> -       test_expect_code 1 git merge-tree --write-tree --exclude-modes-oids-stages side1 side2 >out &&
> +       test_expect_code 1 git merge-tree --write-tree --conflict-format="%(path)" side1 side2 >out &&
>         sed -e "s/[0-9a-f]\{40,\}/HASH/g" out >actual &&
>
>         # Expected results:
> @@ -115,8 +115,35 @@ test_expect_success 'test conflict notices and such' '
>         test_cmp expect actual
>  '
>
> +test_expect_success 'merge-tree --unique-conflicts is the default' '
> +       test_expect_code 1 git merge-tree --write-tree --conflict-format="%(path)" --no-messages side1 side2 >out &&
> +       sed 1d <out >actual &&
> +       cat >expect <<-\EOF &&
> +       greeting
> +       whatever~side1
> +       EOF
> +       test_cmp expect actual &&
> +
> +       test_expect_code 1 git merge-tree --write-tree --conflict-format="%(path)" --no-messages side1 side2 >out2 &&
> +       sed 1d <out2 >actual2 &&
> +       test_cmp actual actual2
> +'
> +
> +test_expect_success 'merge-tree --no-unique-conflicts' '
> +       test_expect_code 1 git merge-tree --write-tree --conflict-format="%(path)" --no-unique-conflicts --no-messages side1 side2 >out &&
> +       sed 1d <out >actual &&
> +       cat >expect <<-\EOF &&
> +       greeting
> +       greeting
> +       greeting
> +       whatever~side1
> +       whatever~side1
> +       EOF
> +       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 --exclude-modes-oids-stages side1 side2 >out &&
> +       test_expect_code 1 git merge-tree --write-tree --no-messages --conflict-format="%(path)" side1 side2 >out &&
>         sed -e "s/[0-9a-f]\{40,\}/HASH/g" out >actual &&
>
>         test_write_lines HASH greeting whatever~side1 >expect &&

  reply	other threads:[~2022-02-03  8:39 UTC|newest]

Thread overview: 240+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-22 21:55 [PATCH 00/12] RFC: In-core git merge-tree ("Server side merges") Elijah Newren via GitGitGadget
2022-01-22 21:55 ` [PATCH 01/12] merge-tree: rename merge_trees() to trivial_merge_trees() Elijah Newren via GitGitGadget
2022-01-22 21:55 ` [PATCH 02/12] merge-tree: move logic for existing merge into new function Elijah Newren via GitGitGadget
2022-01-22 21:55 ` [PATCH 03/12] merge-tree: add option parsing and initial shell for real merge function Elijah Newren via GitGitGadget
2022-01-23  8:05   ` René Scharfe
2022-01-24 16:43     ` Elijah Newren
2022-01-24  9:46   ` Ævar Arnfjörð Bjarmason
2022-01-24 16:54     ` Elijah Newren
2022-01-22 21:55 ` [PATCH 04/12] merge-tree: implement real merges Elijah Newren via GitGitGadget
2022-01-24  9:51   ` Ævar Arnfjörð Bjarmason
2022-01-24 17:12     ` Elijah Newren
2022-01-25 17:07   ` Johannes Schindelin
2022-01-26  9:44   ` Christian Couder
2022-01-29  4:09     ` Elijah Newren
2022-01-22 21:55 ` [PATCH 05/12] merge-ort: split out a separate display_update_messages() function Elijah Newren via GitGitGadget
2022-01-24  9:56   ` Ævar Arnfjörð Bjarmason
2022-01-25  1:59     ` Elijah Newren
2022-01-28 16:09   ` Johannes Schindelin
2022-01-22 21:55 ` [PATCH 06/12] merge-ort: allow update messages to be written to different file stream Elijah Newren via GitGitGadget
2022-01-28 16:31   ` Johannes Schindelin
2022-01-29  4:33     ` Elijah Newren
2022-01-22 21:55 ` [PATCH 07/12] merge-tree: support including merge messages in output Elijah Newren via GitGitGadget
2022-01-26 10:42   ` Christian Couder
2022-01-29  4:52     ` Elijah Newren
2022-01-28 16:37   ` Johannes Schindelin
2022-01-29  4:46     ` Elijah Newren
2022-01-22 21:55 ` [PATCH 08/12] merge-ort: provide a merge_get_conflicted_files() helper function Elijah Newren via GitGitGadget
2022-01-26 10:55   ` Christian Couder
2022-01-29  4:55     ` Elijah Newren
2022-01-26 11:07   ` Christian Couder
2022-01-29  5:06     ` Elijah Newren
2022-01-28 16:55   ` Johannes Schindelin
2022-01-29  6:08     ` Elijah Newren
2022-01-29  8:23       ` Johannes Sixt
2022-01-29 16:47         ` Elijah Newren
2022-02-04 23:10           ` Johannes Schindelin
2022-02-05  0:54             ` Elijah Newren
2022-02-21 10:46               ` Johannes Schindelin
2022-02-21 14:27                 ` Ævar Arnfjörð Bjarmason
2022-02-21 14:28                 ` machine-parsable git-merge-tree messages (was: [PATCH 08/12] merge-ort: provide a merge_get_conflicted_files() helper function) Ævar Arnfjörð Bjarmason
2022-02-23  4:00                   ` Elijah Newren
2022-02-28  8:50                     ` Ævar Arnfjörð Bjarmason
2022-03-01  3:49                       ` Elijah Newren
2022-02-22 16:54                 ` [PATCH 08/12] merge-ort: provide a merge_get_conflicted_files() helper function Johannes Schindelin
2022-02-23  3:13                   ` Elijah Newren
2022-02-25 16:26                     ` Johannes Schindelin
2022-02-23  2:15                 ` Elijah Newren
2022-02-25 16:31                   ` Johannes Schindelin
2022-02-25 18:40                     ` Junio C Hamano
2022-02-26  6:53                     ` Elijah Newren
2022-03-07 16:27                       ` Johannes Schindelin
2022-03-08  8:25                         ` Elijah Newren
2022-03-10 15:10                           ` Johannes Schindelin
2022-05-13 10:21                             ` Johannes Schindelin
2022-05-17  8:23                               ` Elijah Newren
2022-06-03 22:11                                 ` Johannes Schindelin
2022-06-05 15:40                                   ` Johannes Schindelin
2022-06-05 22:42                                     ` Johannes Schindelin
2022-06-06 21:37                                       ` Johannes Schindelin
2022-06-07  7:38                                         ` Elijah Newren
2022-06-17 23:44                                           ` Elijah Newren
2022-06-18 21:58                                             ` Johannes Schindelin
2022-01-22 21:55 ` [PATCH 09/12] merge-tree: provide a list of which files have conflicts Elijah Newren via GitGitGadget
2022-01-24 10:01   ` Ævar Arnfjörð Bjarmason
2022-01-24 17:18     ` Elijah Newren
2022-01-28 16:57   ` Johannes Schindelin
2022-01-29  6:21     ` Elijah Newren
2022-02-04 23:12       ` Johannes Schindelin
     [not found]         ` <CABPp-BFyaakDSjHULpBRPQqq_jz2keyufHo1MjNS6dHQNR+JLQ@mail.gmail.com>
2022-02-21  9:31           ` Johannes Schindelin
2022-01-22 21:56 ` [PATCH 10/12] merge-tree: provide easy access to `ls-files -u` style info Elijah Newren via GitGitGadget
2022-01-24 10:06   ` Ævar Arnfjörð Bjarmason
2022-01-24 17:30     ` Elijah Newren
2022-01-22 21:56 ` [PATCH 11/12] merge-tree: add a --allow-unrelated-histories flag Elijah Newren via GitGitGadget
2022-01-22 21:56 ` [PATCH 12/12] git-merge-tree.txt: add a section on potentional usage mistakes Elijah Newren via GitGitGadget
2022-01-26  8:48 ` [PATCH 00/12] RFC: In-core git merge-tree ("Server side merges") Christian Couder
2022-01-26 12:02   ` Johannes Schindelin
2022-01-26 14:44     ` Christian Couder
2022-01-28 12:58       ` Johannes Schindelin
2022-01-28 13:37         ` Christian Couder
2022-01-28 16:05           ` Johannes Schindelin
2022-01-29  7:03   ` Elijah Newren
2022-01-29  8:17     ` Christian Couder
2022-01-29 17:43       ` Elijah Newren
2022-01-31 17:45         ` Elijah Newren
2022-01-28 17:00 ` Johannes Schindelin
2022-01-29 18:07 ` [PATCH v2 00/13] " Elijah Newren via GitGitGadget
2022-01-29 18:07   ` [PATCH v2 01/13] merge-tree: rename merge_trees() to trivial_merge_trees() Elijah Newren via GitGitGadget
2022-01-29 18:07   ` [PATCH v2 02/13] merge-tree: move logic for existing merge into new function Elijah Newren via GitGitGadget
2022-01-29 18:07   ` [PATCH v2 03/13] merge-tree: add option parsing and initial shell for real merge function Elijah Newren via GitGitGadget
2022-02-02 21:30     ` Junio C Hamano
2022-01-29 18:07   ` [PATCH v2 04/13] merge-tree: implement real merges Elijah Newren via GitGitGadget
2022-02-02 21:30     ` Junio C Hamano
2022-02-02 22:00       ` Elijah Newren
2022-02-21  8:40         ` Johannes Schindelin
2022-01-29 18:07   ` [PATCH v2 05/13] diff: allow diff_warn_rename_limit to write somewhere besides stdout Johannes Schindelin via GitGitGadget
2022-01-29 18:07   ` [PATCH v2 06/13] merge-ort: split out a separate display_update_messages() function Elijah Newren via GitGitGadget
2022-01-29 18:07   ` [PATCH v2 07/13] merge-ort: allow update messages to be written to different file stream Elijah Newren via GitGitGadget
2022-01-29 18:07   ` [PATCH v2 08/13] merge-tree: support including merge messages in output Elijah Newren via GitGitGadget
2022-02-02 21:30     ` Junio C Hamano
2022-02-02 23:09       ` Elijah Newren
2022-01-29 18:07   ` [PATCH v2 09/13] merge-ort: provide a merge_get_conflicted_files() helper function Elijah Newren via GitGitGadget
2022-01-29 18:07   ` [PATCH v2 10/13] merge-tree: provide a list of which files have conflicts Elijah Newren via GitGitGadget
2022-02-02 21:32     ` Junio C Hamano
2022-02-02 21:32     ` Junio C Hamano
2022-02-03 23:55     ` Junio C Hamano
2022-01-29 18:07   ` [PATCH v2 11/13] merge-tree: provide easy access to `ls-files -u` style info Elijah Newren via GitGitGadget
2022-02-02 21:32     ` Junio C Hamano
2022-02-02 23:18       ` Elijah Newren
2022-02-03  1:08         ` Ævar Arnfjörð Bjarmason
2022-02-03  8:39           ` Elijah Newren [this message]
2022-01-29 18:07   ` [PATCH v2 12/13] merge-tree: add a --allow-unrelated-histories flag Elijah Newren via GitGitGadget
2022-02-02 21:32     ` Junio C Hamano
2022-01-29 18:07   ` [PATCH v2 13/13] git-merge-tree.txt: add a section on potentional usage mistakes Elijah Newren via GitGitGadget
2022-02-02  7:34   ` [PATCH v3 00/15] In-core git merge-tree ("Server side merges") Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 01/15] merge-tree: rename merge_trees() to trivial_merge_trees() Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 02/15] merge-tree: move logic for existing merge into new function Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 03/15] merge-tree: add option parsing and initial shell for real merge function Elijah Newren via GitGitGadget
2022-02-03  2:05       ` Ævar Arnfjörð Bjarmason
2022-02-03  9:04         ` Elijah Newren
2022-02-03  9:22           ` Elijah Newren
2022-02-03  9:45             ` Ævar Arnfjörð Bjarmason
2022-02-03 16:20               ` Elijah Newren
2022-02-03 17:15                 ` Ævar Arnfjörð Bjarmason
2022-02-03 18:18                   ` Elijah Newren
2022-02-03 10:26           ` Ævar Arnfjörð Bjarmason
2022-02-07 22:41       ` Emily Shaffer
2022-02-07 23:36         ` Junio C Hamano
2022-02-02  7:34     ` [PATCH v3 04/15] merge-tree: implement real merges Elijah Newren via GitGitGadget
2022-02-02 21:22       ` Junio C Hamano
2022-02-02 21:56         ` Elijah Newren
2022-02-02 22:01           ` Junio C Hamano
2022-02-03  0:18             ` Elijah Newren
2022-02-03 10:42               ` Johannes Altmanninger
2022-02-03 16:54                 ` Elijah Newren
2022-02-21  9:06                   ` Johannes Schindelin
2022-02-22  2:37                     ` Elijah Newren
2022-02-03 20:05                 ` Junio C Hamano
2022-02-21 18:55               ` Junio C Hamano
2022-02-22 16:26                 ` Elijah Newren
2022-02-23 20:07                   ` Junio C Hamano
2022-02-24  2:22                     ` Elijah Newren
2022-02-24 20:04                       ` Junio C Hamano
2022-02-24 23:36                         ` Junio C Hamano
2022-02-27 17:35                           ` Johannes Altmanninger
2022-02-27 17:35                   ` Johannes Altmanninger
2022-02-22 16:45                 ` Johannes Schindelin
2022-02-04  4:48       ` Josh Steadmon
2022-02-04  6:08         ` Elijah Newren
2022-02-02  7:34     ` [PATCH v3 05/15] Introduce a variant of the `warning()` function that takes a `FILE *` Johannes Schindelin via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 06/15] diff: allow diff_warn_rename_limit to write somewhere besides stderr Johannes Schindelin via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 07/15] merge-ort: split out a separate display_update_messages() function Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 08/15] merge-ort: allow update messages to be written to different file stream Elijah Newren via GitGitGadget
2022-02-03  1:48       ` Ævar Arnfjörð Bjarmason
2022-02-03  9:12         ` Elijah Newren
2022-02-03 10:01           ` Ævar Arnfjörð Bjarmason
2022-02-03 16:09             ` Elijah Newren
2022-02-03 16:19               ` Ævar Arnfjörð Bjarmason
2022-02-03 17:00                 ` Elijah Newren
2022-02-21  9:13                   ` Johannes Schindelin
2022-02-22  1:54                     ` Elijah Newren
2022-02-22 16:48                       ` Johannes Schindelin
2022-02-02  7:34     ` [PATCH v3 09/15] merge-tree: support including merge messages in output Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 10/15] merge-ort: provide a merge_get_conflicted_files() helper function Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 11/15] merge-tree: provide a list of which files have conflicts Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 12/15] merge-tree: provide easy access to `ls-files -u` style info Elijah Newren via GitGitGadget
2022-02-02 23:55       ` Ævar Arnfjörð Bjarmason
2022-02-03  5:19         ` Elijah Newren
2022-02-02  7:34     ` [PATCH v3 13/15] merge-tree: allow `ls-files -u` style info to be NUL terminated Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 14/15] merge-tree: add a --allow-unrelated-histories flag Elijah Newren via GitGitGadget
2022-02-02  7:34     ` [PATCH v3 15/15] git-merge-tree.txt: add a section on potentional usage mistakes Elijah Newren via GitGitGadget
2022-02-12 20:34     ` [PATCH v4 00/12] In-core git merge-tree ("Server side merges") Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 01/12] merge-tree: rename merge_trees() to trivial_merge_trees() Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 02/12] merge-tree: move logic for existing merge into new function Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 03/12] merge-tree: add option parsing and initial shell for real merge function Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 04/12] merge-tree: implement real merges Elijah Newren via GitGitGadget
2022-02-14 17:51         ` Junio C Hamano
2022-02-15  6:03           ` Elijah Newren
2022-02-15  8:46         ` Ævar Arnfjörð Bjarmason
2022-02-12 20:34       ` [PATCH v4 05/12] merge-ort: split out a separate display_update_messages() function Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 06/12] merge-tree: support including merge messages in output Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 07/12] merge-ort: provide a merge_get_conflicted_files() helper function Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 08/12] merge-tree: provide a list of which files have conflicts Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 09/12] merge-tree: provide easy access to `ls-files -u` style info Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 10/12] merge-tree: allow `ls-files -u` style info to be NUL terminated Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 11/12] merge-tree: add a --allow-unrelated-histories flag Elijah Newren via GitGitGadget
2022-02-12 20:34       ` [PATCH v4 12/12] git-merge-tree.txt: add a section on potentional usage mistakes Elijah Newren via GitGitGadget
2022-02-20  6:54       ` [PATCH v5 00/12] In-core git merge-tree ("Server side merges") Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 01/12] merge-tree: rename merge_trees() to trivial_merge_trees() Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 02/12] merge-tree: move logic for existing merge into new function Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 03/12] merge-tree: add option parsing and initial shell for real merge function Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 04/12] merge-tree: implement real merges Elijah Newren via GitGitGadget
2022-02-20  9:03           ` René Scharfe
2022-02-21  9:25             ` Johannes Schindelin
2022-02-22  2:28             ` Elijah Newren
2022-02-22 16:25               ` Johannes Schindelin
2022-02-20  6:54         ` [PATCH v5 05/12] merge-ort: split out a separate display_update_messages() function Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 06/12] merge-tree: support including merge messages in output Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 07/12] merge-ort: provide a merge_get_conflicted_files() helper function Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 08/12] merge-tree: provide a list of which files have conflicts Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 09/12] merge-tree: provide easy access to `ls-files -u` style info Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 10/12] merge-tree: allow `ls-files -u` style info to be NUL terminated Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 11/12] merge-tree: add a --allow-unrelated-histories flag Elijah Newren via GitGitGadget
2022-02-20  6:54         ` [PATCH v5 12/12] git-merge-tree.txt: add a section on potentional usage mistakes Elijah Newren via GitGitGadget
2022-02-22 16:26           ` Johannes Schindelin
2022-02-20 10:23         ` [PATCH v5 00/12] In-core git merge-tree ("Server side merges") Ævar Arnfjörð Bjarmason
2022-02-21  9:16           ` Johannes Schindelin
2022-02-22  2:08           ` Elijah Newren
2022-02-22 10:07             ` Ævar Arnfjörð Bjarmason
2022-02-23  7:46         ` [PATCH v6 " Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 01/12] merge-tree: rename merge_trees() to trivial_merge_trees() Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 02/12] merge-tree: move logic for existing merge into new function Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 03/12] merge-tree: add option parsing and initial shell for real merge function Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 04/12] merge-tree: implement real merges Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 05/12] merge-ort: split out a separate display_update_messages() function Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 06/12] merge-tree: support including merge messages in output Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 07/12] merge-ort: provide a merge_get_conflicted_files() helper function Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 08/12] merge-tree: provide a list of which files have conflicts Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 09/12] merge-tree: provide easy access to `ls-files -u` style info Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 10/12] merge-tree: allow `ls-files -u` style info to be NUL terminated Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 11/12] merge-tree: add a --allow-unrelated-histories flag Elijah Newren via GitGitGadget
2022-02-23  7:46           ` [PATCH v6 12/12] git-merge-tree.txt: add a section on potentional usage mistakes Elijah Newren via GitGitGadget
2022-02-23 23:13           ` [PATCH v6 00/12] In-core git merge-tree ("Server side merges") Junio C Hamano
2022-06-18  0:20           ` [PATCH v7 00/17] " Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 01/17] merge-tree: rename merge_trees() to trivial_merge_trees() Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 02/17] merge-tree: move logic for existing merge into new function Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 03/17] merge-tree: add option parsing and initial shell for real merge function Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 04/17] merge-tree: implement real merges Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 05/17] merge-ort: split out a separate display_update_messages() function Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 06/17] merge-tree: support including merge messages in output Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 07/17] merge-ort: provide a merge_get_conflicted_files() helper function Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 08/17] merge-ort: remove command-line-centric submodule message from merge-ort Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 09/17] merge-tree: provide a list of which files have conflicts Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 10/17] merge-tree: provide easy access to `ls-files -u` style info Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 11/17] merge-ort: store messages in a list, not in a single strbuf Johannes Schindelin via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 12/17] merge-ort: make `path_messages` a strmap to a string_list Johannes Schindelin via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 13/17] merge-ort: store more specific conflict information Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 14/17] merge-ort: optionally produce machine-readable output Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 15/17] merge-tree: allow `ls-files -u` style info to be NUL terminated Elijah Newren via GitGitGadget
2022-06-18  0:20             ` [PATCH v7 16/17] merge-tree: add a --allow-unrelated-histories flag Elijah Newren via GitGitGadget
2022-06-18  0:21             ` [PATCH v7 17/17] git-merge-tree.txt: add a section on potentional usage mistakes Elijah Newren via GitGitGadget

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CABPp-BHKpOPM85bRiYmtZ6YT7AK_jpn6aen+o9jeNM6Jwbns=A@mail.gmail.com' \
    --to=newren@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=aclopte@gmail.com \
    --cc=avarab@gmail.com \
    --cc=chriscool@tuxfamily.org \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=gitster@pobox.com \
    --cc=j6t@kdbg.org \
    --cc=l.s.r@web.de \
    --cc=me@ttaylorr.com \
    --cc=ramsay@ramsayjones.plus.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).