git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Edmundo Carmona Antoranz <eantoranz@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v1] builtin/merge.c - cleanup of code in for-cycle that tests strategies
Date: Mon, 08 Jul 2019 13:15:05 -0700	[thread overview]
Message-ID: <xmqqh87wxoza.fsf@gitster-ct.c.googlers.com> (raw)
In-Reply-To: <20190707000052.26057-1-eantoranz@gmail.com> (Edmundo Carmona Antoranz's message of "Sat, 6 Jul 2019 18:00:52 -0600")

Edmundo Carmona Antoranz <eantoranz@gmail.com> writes:

> Previous code was a little convoluted to follow logic
> New code is shorter and logic is easier to follow

In the body of the proposed commit log message, please finish each
sentence with a full-stop.

> - Easier to see what happens when merge is successful
> 	and how --no-commit affects result
> - Simpler to see that for-cycle will stop when merge_was_ok is set
> - Easier to spot what logic will run through best_strategy
> - Easier to see that in case of ret being 2, cycle will continue

These bullets are all subjective, and do not add any value to what
you already said in the second sentence.

> - Keep a single break case (when automerge succedes and a revision will
>   be created)
> - Put together closing actions when automerge succedes if a revision
>   will be created

These are facts that readers can see for themselves and agree with.

Something like...

	The cmd_merge() function has a loop that tries different
	merge strategies in turn, and stops when a strategy gets a
	clean merge, while keeping the "best" conflicted merge so
	far.

	Make the loop easier to follow by moving the code around,
	ensuring that there is only one "break" in the loop where
	an automerge succeeds.  Also group the actions that are
	performed after an automerge succeeds together to a single
	location, outside and after the loop.

perhaps?

> Signed-off-by: Edmundo Carmona Antoranz <eantoranz@gmail.com>
> ---
>  builtin/merge.c | 51 ++++++++++++++++++-------------------------------
>  1 file changed, 19 insertions(+), 32 deletions(-)
>
> diff --git a/builtin/merge.c b/builtin/merge.c
> index 6e99aead46..94f2713bea 100644
> --- a/builtin/merge.c
> +++ b/builtin/merge.c
> @@ -1586,7 +1586,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
>  	    save_state(&stash))
>  		oidclr(&stash);
>  
> -	for (i = 0; i < use_strategies_nr; i++) {
> +	for (i = 0; !merge_was_ok && i < use_strategies_nr; i++) {
>  		int ret;
>  		if (i) {
>  			printf(_("Rewinding the tree to pristine...\n"));
> @@ -1604,40 +1604,26 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
>  		ret = try_merge_strategy(use_strategies[i]->name,
>  					 common, remoteheads,
>  					 head_commit);
> -		if (!option_commit && !ret) {
> -			merge_was_ok = 1;
> -			/*
> -			 * This is necessary here just to avoid writing
> -			 * the tree, but later we will *not* exit with
> -			 * status code 1 because merge_was_ok is set.
> -			 */
> -			ret = 1;
> -		}
> -
> -		if (ret) {
> -			/*
> -			 * The backend exits with 1 when conflicts are
> -			 * left to be resolved, with 2 when it does not
> -			 * handle the given merge at all.
> -			 */
> -			if (ret == 1) {
> -				int cnt = evaluate_result();
> -
> -				if (best_cnt <= 0 || cnt <= best_cnt) {
> -					best_strategy = use_strategies[i]->name;
> -					best_cnt = cnt;
> +		/*
> +		 * The backend exits with 1 when conflicts are
> +		 * left to be resolved, with 2 when it does not
> +		 * handle the given merge at all.
> +		 */
> +		if (ret < 2) {
> +			if (!ret) {
> +				if (option_commit) {
> +					/* Automerge succeeded. */
> +					automerge_was_ok = 1;
> +					break;
>  				}
> +				merge_was_ok = 1;
> +			}
> +			int cnt = evaluate_result();

This introduces -Wdeclaration-after-statement, doesn't it?
Perhaps just declare the variable at the top of the for loop, next
to where the local 'ret' is declared?

Other than this single glitch, I think the code with this patch does
become easier to follow.

> +			if (best_cnt <= 0 || cnt <= best_cnt) {
> +				best_strategy = use_strategies[i]->name;
> +				best_cnt = cnt;
>  			}
> -			if (merge_was_ok)
> -				break;
> -			else
> -				continue;
>  		}
> -
> -		/* Automerge succeeded. */
> -		write_tree_trivial(&result_tree);
> -		automerge_was_ok = 1;
> -		break;
>  	}
>  
>  	/*
> @@ -1645,6 +1631,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
>  	 * auto resolved the merge cleanly.
>  	 */
>  	if (automerge_was_ok) {
> +		write_tree_trivial(&result_tree);
>  		ret = finish_automerge(head_commit, head_subsumed,
>  				       common, remoteheads,
>  				       &result_tree, wt_strategy);

  parent reply	other threads:[~2019-07-08 20:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-07  0:00 [PATCH v1] builtin/merge.c - cleanup of code in for-cycle that tests strategies Edmundo Carmona Antoranz
2019-07-07  3:15 ` Edmundo Carmona Antoranz
2019-07-08 20:15 ` Junio C Hamano [this message]
2019-07-08 20:52   ` Edmundo Carmona Antoranz

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=xmqqh87wxoza.fsf@gitster-ct.c.googlers.com \
    --to=gitster@pobox.com \
    --cc=eantoranz@gmail.com \
    --cc=git@vger.kernel.org \
    /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).