git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: Elijah Newren <newren@gmail.com>
Cc: "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 v3 03/15] merge-tree: add option parsing and initial shell for real merge function
Date: Thu, 03 Feb 2022 18:15:18 +0100	[thread overview]
Message-ID: <220203.86bkzn6ea8.gmgdl@evledraar.gmail.com> (raw)
In-Reply-To: <CABPp-BF8VoQ7F7yvfzrpQEZwErxHzb9x8M_R9PrrM7vWzw=wSw@mail.gmail.com>


On Thu, Feb 03 2022, Elijah Newren wrote:

> On Thu, Feb 3, 2022 at 1:52 AM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
>>
>> On Thu, Feb 03 2022, Elijah Newren wrote:
>>
> [...]
>> > ...also, even if we did require the `--write-tree` flag, we'd still
>> > have to look at argc.  Since the option parsing handles both modes,
>> > someone could leave off --write-tree, but include a bunch of other
>> > options that only make sense with --write-tree.  Individually checking
>> > the setting of every extra flag along with write_tree is a royal pain
>> > and I don't want to repeat that for each new option added.  Simply
>> > checking argc allows you to provide an error message if the user does
>> > that.
>> >
>> > (And I think it's sad that in Git we often forgot to warn and notify
>> > users of options that are only functional with certain other
>> > arguments; it makes it harder for users to figure out, and has in the
>> > past even made it harder for other developers to figure out what was
>> > meant and how things are to be used.  I think I've seen multiple Git
>> > devs be confused over ls-files --directory and --no-empty-directory
>> > options, assuming they'd do something sensible for tracked files, when
>> > in fact those arguments are simply ignored because they are only
>> > modifiers for how untracked files are treated.)
>>
>> There's a much simpler way to do what you're trying to do here which is
>> to only parse --write-tree, and as soon as you have that pass off two
>> one function or the other, and have those functions call
>> parse_options().
>
> But that makes --write-tree a mandatory argument when trying to use
> that mode, right?  If so, that is not a simpler way to do what I'm
> trying to do at all; it breaks my intended usage.
>
> --write-tree is a documentation-only construct that users should never
> have to pass.
>
> Also, what happens if we remove the --trivial-merge flag and its whole
> mode after a sufficient deprecation period?  Would the --write-tree
> parameter remain required in your model to select the only existing
> mode, simply due to us having gone through a transition period?

You can have your cake and eat it too by running parse_optionss() N
number of times. Although perhaps in this case the end result isn't
worth it.

I was hoping this could be a simpler case of a subcommand dispatch, and
perhaps it can still be generalized to that.

If the "trivial" mode never takes options and always 3 argv elements, we
could just run parse_options() for it with no options, after checking
that we have 3 arguments, and none start with '-'.

But the below is a generalization of this I tried out just now, it
passes all your tests, and means that whenever you add new options you
don't need to keep saying "no, not with the trivial mode" for each one.

Basically we run parse_options() once with the full set of options, and
save away argc/argv (note the lack of strvec_clear() there, that's a
TODO memory leak).

Then we've got a o.mode, which along with argc is the *only* thing we
pay attention to at that point.

Then we dispatch to the "trivial" or "write" functions, which do
parse_options() again, this time with only their options.

It means that e.g. this now works as expected:
    
    ./git merge-tree --trivial-merge -z origin/{master,next,seen}
    error: unknown switch `z'
    usage: git merge-tree [--trivial-merge] <base-tree> <branch1> <branch2>
    
        --trivial-merge       do a trivial merge only

I.e. we error out, with your verison we'll just ignore the -z.

Your "--trivial-merge is incompatible with all other options" doesn't
work as you expect, and is buggy whether you want to go this route or
not, as the added tests show.

Basically it does nothing at all. Because if you add --foo we'll die
before we get there, parse_options() will die for us.

But if you do --trivial-merge -z your argc/argv will be trimmed, because
-z is a known option. So your check is doing nothing. Your tests also
pass with this removal of the only option compatibily check on top:
	
	diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
	index 58c0ddc5a32..08f18d43334 100644
	--- a/builtin/merge-tree.c
	+++ b/builtin/merge-tree.c
	@@ -476,7 +476,6 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
	 {
	 	struct merge_tree_options o = { .show_messages = -1 };
	 	int expected_remaining_argc;
	-	int original_argc;
	 
	 	const char * const merge_tree_usage[] = {
	 		N_("git merge-tree [--write-tree] [<options>] <branch1> <branch2>"),
	@@ -505,7 +504,6 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
	 	};
	 
	 	/* Parse arguments */
	-	original_argc = argc;
	 	argc = parse_options(argc, argv, prefix, mt_options,
	 			     merge_tree_usage, PARSE_OPT_STOP_AT_NON_OPTION);
	 	if (o.mode) {
	@@ -517,8 +515,6 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
	 			usage_with_options(merge_tree_usage, mt_options);
	 		o.mode = (argc == 2 ? 'w' : 't');
	 	}
	-	if (o.mode == 't' && original_argc < argc)
	-		die(_("--trivial-merge is incompatible with all other options"));
	 
	 	/* Do the relevant type of merge */
	 	if (o.mode == 'w')

So, here it is in all its glory :) A bit nasty for sure, but IMO
preferrable to an ever expanding list of "X isn't compatible with A".

diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
index 58c0ddc5a32..1d47912816d 100644
--- a/builtin/merge-tree.c
+++ b/builtin/merge-tree.c
@@ -12,6 +12,7 @@
 #include "exec-cmd.h"
 #include "merge-blobs.h"
 #include "quote.h"
+#include "strvec.h"
 
 static int line_termination = '\n';
 
@@ -371,13 +372,66 @@ static void *get_tree_descriptor(struct repository *r,
 	return buf;
 }
 
-static int trivial_merge(const char *base,
-			 const char *branch1,
-			 const char *branch2)
+struct merge_tree_options {
+	int mode;
+	int allow_unrelated_histories;
+	int show_messages;
+	int exclude_modes_oids_stages;
+};
+
+#define BUILTIN_MERGE_TREE_USAGE_WRITE \
+		N_("git merge-tree [--write-tree] [<options>] <branch1> <branch2>")
+#define BUILTIN_MERGE_TREE_USAGE_TRIVIAL \
+		N_("git merge-tree [--trivial-merge] <base-tree> <branch1> <branch2>")
+
+#define BUILTIN_MERGE_TREE_OPT_CMDMODE_TRIVIAL \
+		OPT_CMDMODE(0, "trivial-merge", &o.mode, \
+			    N_("do a trivial merge only"), 't')
+
+#define BUILTIN_MERGE_TREE_OPT_CMDMODE_WRITE \
+		OPT_CMDMODE(0, "write-tree", &o.mode, \
+			    N_("do a real merge instead of a trivial merge"), \
+			    'w')
+
+#define BUILTIN_MERGE_TREE_OPT_WRITE \
+		BUILTIN_MERGE_TREE_OPT_CMDMODE_WRITE, \
+		OPT_BOOL(0, "messages", &o.show_messages, \
+			 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_BOOL_F(0, "allow-unrelated-histories", \
+			   &o.allow_unrelated_histories, \
+			   N_("allow merging unrelated histories"), \
+			   PARSE_OPT_NONEG)
+
+static int trivial_merge(int argc, const char **argv, const char *prefix)
 {
 	struct repository *r = the_repository;
 	struct tree_desc t[3];
 	void *buf1, *buf2, *buf3;
+	struct merge_tree_options o = { 0 };
+	const char * const usage[] = {
+		BUILTIN_MERGE_TREE_USAGE_TRIVIAL,
+		NULL,
+	};
+	struct option options[] = {
+		BUILTIN_MERGE_TREE_OPT_CMDMODE_TRIVIAL,
+		OPT_END()
+	};
+	const char *base, *branch1, *branch2;
+
+	argc = parse_options(argc, argv, prefix, options, usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
+	if (argc != 3)
+		BUG("should have ensured remaining argc == 3 already! Got %d", argc);
+
+	base = argv[0];
+	branch1 = argv[1];
+	branch2 = argv[2];;
 
 	buf1 = get_tree_descriptor(r, t+0, base);
 	buf2 = get_tree_descriptor(r, t+1, branch1);
@@ -391,24 +445,34 @@ static int trivial_merge(const char *base,
 	return 0;
 }
 
-struct merge_tree_options {
-	int mode;
-	int allow_unrelated_histories;
-	int show_messages;
-	int exclude_modes_oids_stages;
-};
-
-static int real_merge(struct merge_tree_options *o,
-		      const char *branch1, const char *branch2,
-		      const char *prefix)
+static int real_merge(int argc, const char **argv, const char *prefix)
 {
 	struct commit *parent1, *parent2;
 	struct commit_list *common;
 	struct commit_list *merge_bases = NULL;
 	struct commit_list *j;
+	struct merge_tree_options o = { .show_messages = 1 };
 	struct merge_options opt;
 	struct merge_result result = { 0 };
 
+	const char * const usage[] = {
+		BUILTIN_MERGE_TREE_USAGE_WRITE,
+		NULL,
+	};
+	struct option options[] = {
+		BUILTIN_MERGE_TREE_OPT_CMDMODE_WRITE,
+		BUILTIN_MERGE_TREE_OPT_WRITE,
+		OPT_END()
+	};
+	const char *branch1, *branch2;
+
+	argc = parse_options(argc, argv, prefix, options, usage,
+			     PARSE_OPT_STOP_AT_NON_OPTION);
+	if (argc != 2)
+		BUG("should have ensured remaining argc == 2 already! Got %d", argc);
+	branch1 = argv[0];
+	branch2 = argv[1];
+
 	parent1 = get_merge_parent(branch1);
 	if (!parent1)
 		help_unknown_ref(branch1, "merge-tree",
@@ -431,7 +495,7 @@ static int real_merge(struct merge_tree_options *o,
 	 * merge_incore_recursive in merge-ort.h
 	 */
 	common = get_merge_bases(parent1, parent2);
-	if (!common && !o->allow_unrelated_histories)
+	if (!common && !o.allow_unrelated_histories)
 		die(_("refusing to merge unrelated histories"));
 	for (j = common; j; j = j->next)
 		commit_list_insert(j->item, &merge_bases);
@@ -440,8 +504,8 @@ static int real_merge(struct merge_tree_options *o,
 	if (result.clean < 0)
 		die(_("failure to merge"));
 
-	if (o->show_messages == -1)
-		o->show_messages = !result.clean;
+	if (o.show_messages == -1)
+		o.show_messages = !result.clean;
 
 	puts(oid_to_hex(&result.tree->object.oid));
 	if (!result.clean) {
@@ -453,7 +517,7 @@ static int real_merge(struct merge_tree_options *o,
 		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)
+			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))
@@ -464,7 +528,7 @@ static int real_merge(struct merge_tree_options *o,
 		}
 		string_list_clear(&conflicted_files, 1);
 	}
-	if (o->show_messages) {
+	if (o.show_messages) {
 		putchar(line_termination);
 		merge_display_update_messages(&opt, &result, stdout);
 	}
@@ -474,40 +538,32 @@ 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;
 	int expected_remaining_argc;
-	int original_argc;
-
+	int original_argc = argc;
+	struct strvec original_args = STRVEC_INIT;
 	const char * const merge_tree_usage[] = {
-		N_("git merge-tree [--write-tree] [<options>] <branch1> <branch2>"),
-		N_("git merge-tree [--trivial-merge] <base-tree> <branch1> <branch2>"),
+		BUILTIN_MERGE_TREE_USAGE_WRITE,
+		BUILTIN_MERGE_TREE_USAGE_TRIVIAL,
 		NULL
 	};
 	struct option mt_options[] = {
-		OPT_CMDMODE(0, "write-tree", &o.mode,
-			    N_("do a real merge instead of a trivial merge"),
-			    'w'),
-		OPT_CMDMODE(0, "trivial-merge", &o.mode,
-			    N_("do a trivial merge only"), 't'),
-		OPT_BOOL(0, "messages", &o.show_messages,
-			 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_BOOL_F(0, "allow-unrelated-histories",
-			   &o.allow_unrelated_histories,
-			   N_("allow merging unrelated histories"),
-			   PARSE_OPT_NONEG),
+		BUILTIN_MERGE_TREE_OPT_CMDMODE_TRIVIAL,
+		BUILTIN_MERGE_TREE_OPT_CMDMODE_WRITE,
+		BUILTIN_MERGE_TREE_OPT_WRITE,
 		OPT_END()
 	};
 
+	/* We only care about deciding "o.mode" here */
+	o.mode = 0;
+	/*
+	 * We need our original argv, and
+	 * PARSE_OPT_KEEP_{ARGV0,UNKNOWN} would do the wrong thing
+	 */
+	strvec_pushv(&original_args, argv);
 	/* Parse arguments */
-	original_argc = argc;
 	argc = parse_options(argc, argv, prefix, mt_options,
-			     merge_tree_usage, PARSE_OPT_STOP_AT_NON_OPTION);
+			     merge_tree_usage, 0);
 	if (o.mode) {
 		expected_remaining_argc = (o.mode == 'w' ? 2 : 3);
 		if (argc != expected_remaining_argc)
@@ -517,12 +573,10 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
 			usage_with_options(merge_tree_usage, mt_options);
 		o.mode = (argc == 2 ? 'w' : 't');
 	}
-	if (o.mode == 't' && original_argc < argc)
-		die(_("--trivial-merge is incompatible with all other options"));
 
 	/* Do the relevant type of merge */
 	if (o.mode == 'w')
-		return real_merge(&o, argv[0], argv[1], prefix);
+		return real_merge(original_argc, original_args.v, prefix);
 	else
-		return trivial_merge(argv[0], argv[1], argv[2]);
+		return trivial_merge(original_argc, original_args.v, prefix);
 }
diff --git a/t/t4301-merge-tree-write-tree.sh b/t/t4301-merge-tree-write-tree.sh
index 4de089d976d..749bdb6862d 100755
--- a/t/t4301-merge-tree-write-tree.sh
+++ b/t/t4301-merge-tree-write-tree.sh
@@ -92,6 +92,18 @@ test_expect_success 'Barf on too many arguments' '
 	grep "^usage: git merge-tree" expect
 '
 
+for opt in $(git merge-tree --git-completion-helper-all)
+do
+	if test $opt = "--trivial-merge" || test $opt = "--write-tree"
+	then
+		continue
+	fi
+
+	test_expect_success "usage: --trivial-merge is incompatible with $opt" '
+		test_expect_code 129 git merge-tree --trivial-merge $opt side1 side2 side3
+	'
+done
+
 test_expect_success 'test conflict notices and such' '
 	test_expect_code 1 git merge-tree --write-tree --exclude-modes-oids-stages side1 side2 >out &&
 	sed -e "s/[0-9a-f]\{40,\}/HASH/g" out >actual &&

  reply	other threads:[~2022-02-03 17: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
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 [this message]
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=220203.86bkzn6ea8.gmgdl@evledraar.gmail.com \
    --to=avarab@gmail.com \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=aclopte@gmail.com \
    --cc=chriscool@tuxfamily.org \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=j6t@kdbg.org \
    --cc=l.s.r@web.de \
    --cc=me@ttaylorr.com \
    --cc=newren@gmail.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).