On Fri, Jul 17, 2020 at 5:12 PM Junio C Hamano <gitster@xxxxxxxxx> wrote: > > "Chris Torek via GitGitGadget" <gitgitgadget@xxxxxxxxx> 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(...)) { ... Or, even better, make ce_stage(ce) not be an error; see https://lore.kernel.org/git/xmqqk1ozb6qy.fsf@xxxxxxxxxxxxxxxxxxxxxxxxx/. I hadn't gotten around to it yet, but it's still on my radar. (That said, I've obviously taken a really long time to get to it, so improving the error message as an interim step is perfectly fine.)