All of lore.kernel.org
 help / color / mirror / Atom feed
* Multiple consecutive null bytes with log -z --name-only
@ 2018-07-27 20:20 Drew Noakes
  2018-07-27 22:12 ` Junio C Hamano
  0 siblings, 1 reply; 2+ messages in thread
From: Drew Noakes @ 2018-07-27 20:20 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: text/plain, Size: 748 bytes --]

Hi all,

I'm a developer on the Git Extensions project [1] and am looking at an
issue parsing the output of `git log` in that application.

Some investigation suggests that a certain combination of arguments causes
multiple consecutive null bytes between rows, where I would ordinarily
expect one.

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

We can work around this issue, but I would like to understand if it's a bug
or if there's some information to be gleaned here.

$ git --version
git version 2.18.0.windows.1

Many thanks,

Drew

[1] https://github.com/gitextensions/gitextensions

[-- Attachment #2: Type: text/html, Size: 1146 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Multiple consecutive null bytes with log -z --name-only
  2018-07-27 20:20 Multiple consecutive null bytes with log -z --name-only Drew Noakes
@ 2018-07-27 22:12 ` Junio C Hamano
  0 siblings, 0 replies; 2+ messages in thread
From: Junio C Hamano @ 2018-07-27 22:12 UTC (permalink / raw)
  To: Drew Noakes; +Cc: git

Drew Noakes <drew@drewnoakes.com> writes:

> 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.


	

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-07-27 22:12 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-27 20:20 Multiple consecutive null bytes with log -z --name-only Drew Noakes
2018-07-27 22:12 ` Junio C Hamano

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.