git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Simplified merge logic

From
Junio C Hamano <gitster@pobox.com>
Date
Nov 9, 2020, 23:17 UTC
Message-ID
<xmqqo8k69l3e.fsf@gitster.c.googlers.com>
In-Reply-To
<pull.911.git.git.1604871456715.gitgitgadget@gmail.com>
"Seija K. via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 5 quoted lines
> From: pi1024e <pi1024e@github.com>
>
> commit: Avoid extraneous boolean checking by simplifying the if statements.
> Signed-off-by: Seija <pi1024e@github.com>
> ---
Meh.
Admittedly, readability is somewhat subjective, but a rewrite like
        if (condition)                  if (!condition)
                do_when_true();                 do_when_false();
        else                       ==>  else
                do_when_false();                do_when_true();

while it may not be incorrect per-se needs more than a subjective "I think this is more readable" to justify the code churn.

Show 14 quoted lines
> diff --git a/builtin/merge.c b/builtin/merge.c
> index 4c133402a6..9664da6031 100644
> --- a/builtin/merge.c
> +++ b/builtin/merge.c
> @@ -853,9 +853,8 @@ static void prepare_to_commit(struct commit_list *remoteheads)
>  	if (run_commit_hook(0 < option_edit, get_index_file(), "prepare-commit-msg",
>  			    git_path_merge_msg(the_repository), "merge", NULL))
>  		abort_commit(remoteheads, NULL);
> -	if (0 < option_edit) {
> -		if (launch_editor(git_path_merge_msg(the_repository), NULL, NULL))
> -			abort_commit(remoteheads, NULL);
> +	if (0 < option_edit && launch_editor(git_path_merge_msg(the_repository), NULL, NULL)) {
> +		abort_commit(remoteheads, NULL);
>  	}
This may reduce the number of lines, but personally I find that
	if (are we editing?) {
		if (run editor---did we fail?)
			abort();
	}
is much easier to read.

And much more importantly, it would be much easier to extend later what hwppens when we decide to edit, than the new code proposed by this patch.

Show 6 quoted lines
> @@ -1213,7 +1212,7 @@ static int merging_a_throwaway_tag(struct commit *commit)
>  	if (!merge_remote_util(commit) ||
>  	    !merge_remote_util(commit)->obj ||
>  	    merge_remote_util(commit)->obj->type != OBJ_TAG)
> -		return is_throwaway_tag;
> +		return 0;

Likewise. If somebody _must_ touch this function to gain commit count without making the code harder to maintain, it may be an option to use "goto leave;" here and then create a "leave:" label before the other "return"---at least that may be worth considering, but not this---when everybody else in the function wants to maintain that the value in this variable is what is returned from the function.

Show 17 quoted lines
> @@ -1459,13 +1458,12 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
>  			fast_forward = FF_NO;
>  	}
>  
> -	if (!use_strategies) {
> -		if (!remoteheads)
> -			; /* already up-to-date */
> -		else if (!remoteheads->next)
> -			add_strategies(pull_twohead, DEFAULT_TWOHEAD);
> -		else
> +	if (!use_strategies && remoteheads) {
> +		/* not up-to-date */
> +		if (remoteheads->next)
>  			add_strategies(pull_octopus, DEFAULT_OCTOPUS);
> +		else
> +			add_strategies(pull_twohead, DEFAULT_TWOHEAD);
>  	}
Likewise.
	if (do we have to choose strategies ourselves?) {
		... depending on the case, choose strategy ...
	}
is much easier to reason about than
	if (do we have to choose strategies ourselves?, oh by the
    	    way, don't forget that already up-to-date case we do not
	    have to choose) {
		... the remainder ...
	}

and extend when we need to add something to do in the up-to-date case as long as the end-user did not specify which strategy to use in the future. The reduced line count alone is not a good yardstick to use when talking about code restructuring for readability and maintainability.

Thanks.
Previous: Seija K. via GitGitGadgetNext: Seija K. via GitGitGadget
Message 2 of 4 in “Simplified merge logic”
  1. Simplified merge logicSeija K. via GitGitGadget, Nov 8, 2020
  2. Junio C HamanoNov 9, 2020
  3. Simplify merge logicSeija K. via GitGitGadget, Nov 17, 2020
  4. Simplify merge logicSeija K. via GitGitGadget, Nov 17, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.