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

Re: Multiple consecutive null bytes with log -z --name-only

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 27, 2018, 22:12 UTC
Message-ID
<xmqq36w4l44x.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<CAJd66x7ZHn=6AHFRXo5E4MhzEiW98Mpf37JRWv_18U5eYFeVJg@mail.gmail.com>
Drew Noakes <drew@drewnoakes.com> writes:
Show 7 quoted lines
> Passing -z with --name-only causes double nulls.
>
> $ git log -z --pretty=format:"%H" --name-only | grep -obUaP "\x00\x00" | wc
> -l
> 8994
> $ git log -z --pretty=format:"%H" | grep -obUaP "\x00\x00" | wc -l
> 0

With --pretty that tells you to show %H and --name-only that tells you to show names of paths that were touched by each commit, you'd need to be able to distinguish commit object name (or whategver you give --pretty=format to) and each pathname, and because you are driving "log", you also should be able to see where info for one commit ends and the next one starts.

So I'd imagine that for a commit that touches N paths, you would get (one pathname followed by NUL) N times, and then another NUL after that to let you know that you read all the pathnames for that commit.

By the way, tools should be reading from "--format=...", not from "--pretty=format:...". The --format=... option is for human consumption and gives LF (or NUL when -z is used) the "separator" semantics, i.e. when listing things A B and C, we would throw separator in between but not before the first one (obviously) and not after the last one. "--format=..." which is a synonym for "--pretty=tformat:..." is designed for tool consumption and gives LF (or NULL when -z i used) the "terminator" semantics, i.e. each item in the output is followed by terminator, so in addition to LF/NUL after A and B in the example in this paragraph, you also get one after C, which is the last item.

	
Previous: Drew Noakes
Message 2 of 2 in “Multiple consecutive null bytes with log -z --name-only”
  1. Drew NoakesJul 27, 2018
  2. Junio C HamanoJul 27, 2018

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.