Subject: Re: [PATCH] git-mv: improve error message for conflicted file

From: Junio C Hamano <[email-masked]>
Date: Fri, 17 Jul 2020 17:07:17 -0700

"Chris Torek via GitGitGadget" <[email-masked]> writes:

> -		} else if (cache_name_pos(src, length) < 0)
> -			bad = _("not under version control");
> -		else if (lstat(dst, &st) == 0 &&
> +		} else if (cache_name_pos(src, length) < 0) {
> +			/*
> +			 * This occurs for both untracked files *and*
> +			 * files that are in merge-conflict state, so
> +			 * let's distinguish between those two.
> +			 */
> +			struct cache_entry *ce = cache_file_exists(src, length, ignore_case);
> +			if (ce == NULL)
> +				bad = _("not under version control");
> +			else
> +				bad = _("must resolve merge conflict first");

The original did not care about the cache entry itself, and that is
why cache_name_pos() was used.  Now you care what cache entry is at
that position, running both calls is quite wasteful.

Would it work better to declare "struct cache_entry *ce" in the
scope that surrounds this if/elseif cascade and then rewrite this
part more like so:

	} else if (!(ce = cache_file_exists(...)) {
		bad = _("not tracked");
	} else if (ce_stage(ce)) {
        	bad = _("conflicted");
	} else if (lstat(...)) { ...