[PATCH 0/4] rev-list: introduce NUL-delimited output mode
- From
Justin Tobler <jltobler@gmail.com>
- Date
- Mar 10, 2025, 19:28 UTC
- Message-ID
- <20250310192829.661692-1-jltobler@gmail.com>
When walking objects, git-rev-list(1) prints each object entry on a separate line in the form:
<oid> LF
Some options, such as `--objects`, may print additional information about the object on the same line:
<oid> SP [<path>] LF
In this mode, if the object path contains a newline it is truncated at the newline.
When the `--missing={print,print-info}` option is provided, information about any missing objects encountered during the object walk are also printed in the form:
?<oid> [SP <token>=<value>]... LF
where values containing LF or SP are printed in a token specific fashion so that the resulting encoded value does not contain either of these two problematic bytes. For example, missing object paths are quoted in the C style so they contain LF or SP.
To make machine parsing easier, this series introduces a NUL-delimited output mode for git-rev-list(1) via a `-z` option following a suggestion from Junio in a previous thread[1]. In this mode, instead of LF, each object is delimited with two NUL bytes and any object metadata is separated with a single NUL byte. Examples:
<oid> NUL NUL
<oid> [NUL <path>] NUL NUL
?<oid> [NUL <token>=<value>]... NUL NULIn this mode, path and value info are printed as-is without any special encoding or truncation.
For now this series only adds support for use with the `--objects` and `--missing` options. Usage of `-z` with other options is rejected, so it can potentially be added in the future.
One idea I had, but did not implement in this version, was to also use the `<token>=<value>` format for regular non-missing object info while in the NUL-delimited mode. I could see this being a bit more flexible instead of relying strictly on order. Interested if anyone has thoughts on this. :)
This series is structured as follows:
- Patches 1 and 2 do some minor preparatory refactors.
- Patch 3 adds the `-z` option to git-rev-list(1) to print
objects in a NUL-delimited fashion. Printed object paths with
the `--objects` option are also handled. - Patch 4 teaches the `--missing` option how to print info in a
NUL-delimited fashion.Thanks for taking a look, -Justin
[1]: <xmqq5xlor0la.fsf@gitster.g>
Justin Tobler (4): rev-list: inline `show_object_with_name()` in `show_object()` rev-list: refactor early option parsing rev-list: support delimiting objects with NUL bytes rev-list: support NUL-delimited --missing option
Documentation/rev-list-options.adoc | 26 +++++++++ builtin/rev-list.c | 86 ++++++++++++++++++++++------- revision.c | 8 --- revision.h | 2 - t/t6000-rev-list-misc.sh | 34 ++++++++++++ t/t6022-rev-list-missing.sh | 30 ++++++++++ 6 files changed, 155 insertions(+), 31 deletions(-)
base-commit: 87a0bdbf0f72b7561f3cd50636eee33dcb7dbcc3
-- 2.49.0.rc2