All of lore.kernel.org
 help / color / mirror / Atom feed
From: Phillip Wood <phillip.wood123@gmail.com>
To: Izzy via GitGitGadget <gitgitgadget@gmail.com>, git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>, Jeff King <peff@peff.net>,
	Izzy <winglovet@gmail.com>
Subject: Re: [PATCH v5] merge-tree: add -X strategy option
Date: Mon, 18 Sep 2023 10:53:48 +0100	[thread overview]
Message-ID: <67638fd7-ad63-4e20-87e1-bef121fef197@gmail.com> (raw)
In-Reply-To: <pull.1565.v5.git.1694853437494.gitgitgadget@gmail.com>

On 16/09/2023 09:37, Izzy via GitGitGadget wrote:
> From: Tang Yuyi <winglovet@gmail.com>
> 
> Add merge strategy option to produce more customizable merge result such
> as automatically resolving conflicts.

I think adding a merge strategy option to merge-tree is a good idea, but 
have you tested this with anything apart from -Xours or -Xtheirs? It 
looks to me like those are the only two that this patch supports. If you 
look at parse_merge_opt() in merge-recursive.c you will see that there 
are many other options. In order to support all the merge options I 
think this patch needs a bit of refactoring.

> diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
> index 0de42aecf4b..97d0fe6c952 100644
> --- a/builtin/merge-tree.c
> +++ b/builtin/merge-tree.c
>   static int real_merge(struct merge_tree_options *o,
> @@ -439,6 +441,8 @@ static int real_merge(struct merge_tree_options *o,
>   
>   	init_merge_options(&opt, the_repository);
>   
> +	opt.recursive_variant = o->merge_options.recursive_variant;
> +

Rather that copying across individual members I think you should 
initialize o->merge_options properly in cmd_merge_tree() by calling 
init_merge_options() and then use o->merge_options instead of "opt" in 
this function. That way all the strategy options will be supported.

>   	opt.show_rename_progress = 0;
>   
>   	opt.branch1 = branch1;
> @@ -513,6 +517,7 @@ 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 strvec xopts = STRVEC_INIT;
>   	int expected_remaining_argc;
>   	int original_argc;
>   	const char *merge_base = NULL;
> @@ -548,6 +553,8 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)
>   			   &merge_base,
>   			   N_("commit"),
>   			   N_("specify a merge-base for the merge")),
> +		OPT_STRVEC('X', "strategy-option", &xopts, N_("option=value"),
> +			N_("option for selected merge strategy")),
>   		OPT_END()
>   	};
>   
> @@ -556,6 +563,10 @@ int cmd_merge_tree(int argc, const char **argv, const char *prefix)

You should add

	init_merge_options(&o.merge_options);

here to ensure it is properly initialized.

>   	argc = parse_options(argc, argv, prefix, mt_options,
>   			     merge_tree_usage, PARSE_OPT_STOP_AT_NON_OPTION);

This is the right place to call parse_merge_opt() but I think we should 
first check that the user has requested a real merge rather than a 
trivial merge.

	if (xopts.nr && o.mode == MODE_TRIVIAL)
		die(_("--trivial-merge is incompatible with all other options"));

Otherwise if the user passes in invalid strategy option to a trivial 
merge they'll get an error about an invalid strategy option rather than 
being told --strategy-option is not supported with --trivial-merge.

Ideally there would be a preparatory patch that moves the switch 
statement that is below the "if(o.use_stdin)" block up to this point so 
we'd always have set o.mode before checking if it is a trivial merge. (I 
think you'd to change the code slightly when it is moved to add a check 
for o.use_stdin)

Best Wishes

Phillip

> +	for (int x = 0; x < xopts.nr; x++)
> +		if (parse_merge_opt(&o.merge_options, xopts.v[x]))
> +			die(_("unknown strategy option: -X%s"), xopts.v[x]);
> +
>   	/* Handle --stdin */
>   	if (o.use_stdin) {
>   		struct strbuf buf = STRBUF_INIT;
> diff --git a/t/t4301-merge-tree-write-tree.sh b/t/t4301-merge-tree-write-tree.sh
> index 250f721795b..b2c8a43fce3 100755
> --- a/t/t4301-merge-tree-write-tree.sh
> +++ b/t/t4301-merge-tree-write-tree.sh
> @@ -22,6 +22,7 @@ test_expect_success setup '
>   	git branch side1 &&
>   	git branch side2 &&
>   	git branch side3 &&
> +	git branch side4 &&
>   
>   	git checkout side1 &&
>   	test_write_lines 1 2 3 4 5 6 >numbers &&
> @@ -46,6 +47,13 @@ test_expect_success setup '
>   	test_tick &&
>   	git commit -m rename-numbers &&
>   
> +	git checkout side4 &&
> +	test_write_lines 0 1 2 3 4 5 >numbers &&
> +	echo yo >greeting &&
> +	git add numbers greeting &&
> +	test_tick &&
> +	git commit -m other-content-modifications &&
> +
>   	git switch --orphan unrelated &&
>   	>something-else &&
>   	git add something-else &&
> @@ -97,6 +105,21 @@ test_expect_success 'Content merge and a few conflicts' '
>   	test_cmp expect actual
>   '
>   
> +test_expect_success 'Auto resolve conflicts by "ours" strategy option' '
> +	git checkout side1^0 &&
> +
> +	# make sure merge conflict exists
> +	test_must_fail git merge side4 &&
> +	git merge --abort &&
> +
> +	git merge -X ours side4 &&
> +	git rev-parse HEAD^{tree} >expected &&
> +
> +	git merge-tree -X ours side1 side4 >actual &&
> +
> +	test_cmp expected actual
> +'
> +
>   test_expect_success 'Barf on misspelled option, with exit code other than 0 or 1' '
>   	# Mis-spell with single "s" instead of double "s"
>   	test_expect_code 129 git merge-tree --write-tree --mesages FOOBAR side1 side2 2>expect &&
> 
> base-commit: ac83bc5054c2ac489166072334b4147ce6d0fccb


  parent reply	other threads:[~2023-09-18  9:54 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-05 14:24 [PATCH] merge-tree: add -X strategy option Izzy via GitGitGadget
2023-08-07  2:10 ` Junio C Hamano
2023-08-12  5:33 ` [PATCH v2] " Izzy via GitGitGadget
2023-08-12  5:41   ` 唐宇奕
2023-09-03  1:31     ` 唐宇奕
2023-09-12 15:03   ` Elijah Newren
2023-09-16  2:14   ` [PATCH v3] " Izzy via GitGitGadget
2023-09-16  2:26     ` 唐宇奕
2023-09-16  3:21       ` Elijah Newren
2023-09-16  3:16     ` Elijah Newren
2023-09-16  3:47     ` [PATCH v4] " Izzy via GitGitGadget
2023-09-16  3:55       ` Elijah Newren
2023-09-16  4:04       ` 唐宇奕
2023-09-16  6:11       ` Jeff King
2023-09-16  8:37       ` [PATCH v5] " Izzy via GitGitGadget
2023-09-16  8:38         ` 唐宇奕
2023-09-18  9:53         ` Phillip Wood [this message]
2023-09-18 16:08           ` Junio C Hamano
2023-09-24  2:23         ` [PATCH v6] " Izzy via GitGitGadget
2023-09-24  2:26           ` 唐宇奕
2023-10-09  9:58           ` Phillip Wood
2023-10-09 15:53             ` Jeff King
2023-10-09 17:10               ` Junio C Hamano
2023-10-09 18:52                 ` Jeff King
2023-10-11 19:38                   ` Junio C Hamano
2023-10-11 21:43                     ` Jeff King
2023-10-11 22:19                       ` Junio C Hamano

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

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

  git send-email \
    --in-reply-to=67638fd7-ad63-4e20-87e1-bef121fef197@gmail.com \
    --to=phillip.wood123@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=newren@gmail.com \
    --cc=peff@peff.net \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=winglovet@gmail.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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.