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

Re: [PATCH] wt-status.c: set commitable bit if there is a meaningful merge.

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 17, 2016, 03:33 UTC
Message-ID
<xmqqr3gcj9i5.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<1455590305-30923-1-git-send-email-ischis2@cox.net>
"Stephen P. Smith" <ischis2@cox.net> writes:
Show 9 quoted lines
> The 'commit --dry-run' and commit return values differed if a
> conflicted merge had been resolved and the commit would be the same as
> the parent.
>
> Update show_merge_in_progress to set the commitable bit if conflicts
> have been resolved and a merge is in progress.
>
> Signed-off-by: Stephen P. Smith <ischis2@cox.net>
> ---

I think I mislead you into a slightly wrong direction. While the single liner does improve the situation, I think this is merely a band-aid upon closer inspection. For example, if you changed your "commit --dry-run" in your test to "commit --dry-run --short", you would notice that the test would fail.

In fact, "commit --dry-run" is already broken without this "a merge ends up in a no-op" corner case. The management of s->commitable flag and dry_run_commit() that uses it are unfortunately more broken than I originally thought.

If we check for places where s->committable is set, we notice that there is only one location: wt_status_print_updated(). This function runs an equivalent of "diff-index --cached" and flips s->committable on when it sees any difference.

This function is only called from wt_status_print(), which in turn is only called from run_status() in commit.c when the status format is unspecified or set to STATUS_FORMAT_LONG.

So if you do this:
    $ git reset --hard HEAD
    $ >a-new-file && git add a-new-file
    $ git commit --dry-run --short; echo $?

you'd get "No, there is nothing interesting to commit", which is clearly bogus.

I said s->committable is flipped on only when there is any change in "diff-index --cached". There is nothing that flips it off, by noticing that there are unmerged paths, for example. This is another brokenness around "git commit --dry-run". Imagine that you are in a middle of a conflicted cherry-pick. You did "git add" on a resolved path and you still have another path whose conflict has not been resolved. If you run a "git commit --dry-run", you will hear "Yes, you can make a meaningful commit", which again is clearly bogus.

These things need to be eventually fixed, and I think the fix will involve revamping how we compute s->committable flag. Most likely, we won't be doing any of that in any wt_status function whose name has "print" or "show" in it. As the original designer of the wt_* suite (before these multiple output formats are added), I would say everything should happen inside the "collect" phase, if we wanted to make s->committable bit usable.

So in the sense, eventually the code updated by this patch will have to be discarded when we fix the "commit --dry-run" in the right way, but in the meantime, the patch does not make things worse, so let's think about queuing it as-is for now as a stop-gap measure.

Thanks.
Previous: Stephen & Linda SmithNext: Stephen P. Smith
Message 8 of 16 in “Re: Bug report: 'git commit --dry-run' corner case: returns error ("nothing to commit") when all conflicts resolved to HEAD”
  1. Stephen & Linda SmithFeb 9, 2016
  2. wt-status.c: set commitable bit if there is a meaningful merge.Stephen P. Smith, Feb 16, 2016
  3. Philip OakleyFeb 16, 2016
  4. Junio C HamanoFeb 16, 2016
  5. Stephen & Linda SmithFeb 16, 2016
  6. Stephen & Linda SmithFeb 16, 2016
  7. Stephen & Linda SmithFeb 16, 2016
  8. Junio C HamanoFeb 17, 2016
  9. wt-status.c: set commitable bit if there is a meaningful merge.Stephen P. Smith, Feb 17, 2016
  10. Stephen & Linda SmithFeb 17, 2016
  11. Stephen & Linda SmithMay 10, 2016
  12. Stephen SmithAug 22, 2018
  13. Junio C HamanoAug 22, 2018
  14. Junio C HamanoAug 22, 2018
  15. Stephen & Linda SmithAug 23, 2018
  16. Stephen & Linda SmithFeb 12, 2016

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.