Re: [PATCH] git-mv: improve error message for conflicted file
- From
Elijah Newren <newren@gmail.com>
- Date
- Jul 18, 2020, 02:00 UTC
- Message-ID
- <CABPp-BGDp_SjJKvi+XVd6KvRLA5PVsK4xBLPvBxAimDft+0M9g@mail.gmail.com>
- In-Reply-To
- <xmqqeep9d6tm.fsf@gitster.c.googlers.com>
On Fri, Jul 17, 2020 at 5:12 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 32 quoted lines
>
> "Chris Torek via GitGitGadget" <gitgitgadget@gmail.com> 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@gitster-ct.c.googlers.com/.
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.)