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

Re: [Bug] commit-tree shouldn't append an extra newline to commit messages

From
Jeff King <peff@peff.net>
Date
Sep 5, 2017, 15:36 UTC
Message-ID
<20170905153636.tsmlq3wv7ztpc67z@sigill.intra.peff.net>
In-Reply-To
<CAEVs+zbbWQuM-=5d04bkpTu38Mr4PyczskNhni5K1u_nzh-2Qw@mail.gmail.com>
On Tue, Sep 05, 2017 at 11:09:01AM -0400, Ross Kabus wrote:
Show 10 quoted lines
> On Sat, Sep 2, 2017 at 4:33 AM, Jeff King <peff@peff.net> wrote:
> 
> > But I am confused by your "inconsistent with git commit porcelain"
> > comment. The porcelain git-commit definitely _does_ add a newline if one
> > isn't present (and in fact runs the whole thing through git-stripspace
> > to clean up whitespace oddities).
> 
> Ok I figured out my confusion. The repository I am working with did
> commits with "git commit --cleanup=verbatim" thus do not have a newline.
> This is why I thought there was an inconsistency.

OK, that makes more sense. Though I think even with verbatim, "-m" will still complete a line (it happens in opt_parse_m):

  $ git commit -q --allow-empty -m foo
  $ git cat-file commit HEAD | xxd
  ...
  00000090: 3034 3030 0a0a 666f 6f0a                 0400..foo.
                                  ^^
				  newline

That makes sense, since the idea of "-m" is to take a one-liner, but you would not typically provide the newline yourself via the shell.

It looks like "-F" does not do an explicit complete-line (so it would depend on --cleanup to do it normally, but in verbatim mode would not). That makes sense to me, as well (in a full file, usually you _would_ have the newline, or choose to omit it intentionally, and we should respect that). So I'd argue that "git commit -F" is doing a reasonable thing, and "commit-tree -F" should probably change to match it (because it's inconsistent, and because if anything the plumbing commit-tree should err more on the side of not touching its input than the porcelain commit command).

Show 7 quoted lines
> > So I don't think "inconsistent with git-commit" is a compelling
> > argument, unless I'm missing something.
> 
> Agreed, but now I guess I would argue that it is inconsistent because
> it lacks a "verbatim" option like git-commit has. I would like to see
> an argument like this for commit-tree but a clean way to add this option
> didn't immediately jump out at me.

I think the default behavior of reading via stdin _is_ the verbatim option. And you can choose whether or not to pipe it through git-stripspace to do more cleanup (and in fact, when git-commit was implemented as a shell script long ago, that's exactly how it was implemented). But...

> > And definitely it does not when taking the message in via stdin.
> 
> I'm not seeing this, I see commit-tree as adding a new line even via
> stdin (and the code seems to corroborate this), unless I missed something.
I'm not sure why you're seeing that. It seems verbatim to me:
  $ tree=$(git write-tree)
  $ commit=$(printf end | git commit-tree $tree)
  $ git cat-file commit $commit | xxd
  ...
  00000090: 3034 3030 0a0a 656e 64                   0400..end
-Peff
Previous: Ross KabusNext: Ross Kabus
Message 4 of 10 in “[Bug] commit-tree shouldn't append an extra newline to commit messages”
  1. Ross KabusSep 1, 2017
  2. Jeff KingSep 2, 2017
  3. Ross KabusSep 5, 2017
  4. Jeff KingSep 5, 2017
  5. Ross KabusSep 5, 2017
  6. Jeff KingSep 5, 2017
  7. Ross KabusSep 5, 2017
  8. Ross KabusSep 5, 2017
  9. Jeff KingSep 7, 2017
  10. Junio C HamanoSep 5, 2017

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.