[GSoC PATCH v2 1/2] repo: add the flag -z as an alias for --format=nul
From: Lucas Seiki Oshiro <hidden>
Date: 2025-08-26 18:32:14
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
Other Git commands that have nul-terminated output (e.g. git-config, git-status, git-ls-files) have a flag `-z` for using the null character as the record separator. Add the `-z` flag to git-repo-info as an alias for `--format=nul`, making it consistent with the behavior of the other commands. Mentored-by: Karthik Nayak [off-list ref] Mentored-by: Patrick Steinhardt [off-list ref] Signed-off-by: Lucas Seiki Oshiro <redacted> --- Documentation/git-repo.adoc | 6 ++++-- builtin/repo.c | 17 ++++++++++++----- t/t1900-repo.sh | 12 ++++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc
index 2870828d93..8224a88bc8 100644
--- a/Documentation/git-repo.adoc
+++ b/Documentation/git-repo.adoc@@ -8,7 +8,7 @@ git-repo - Retrieve information about the repository SYNOPSIS -------- [synopsis] -git repo info [--format=(keyvalue|nul)] [<key>...] +git repo info [--format=(keyvalue|nul) | -z] [<key>...] DESCRIPTION -----------
@@ -18,7 +18,7 @@ THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE. COMMANDS -------- -`info [--format=(keyvalue|nul)] [<key>...]`:: +`info [--format=(keyvalue|nul) | -z] [<key>...]`:: Retrieve metadata-related information about the current repository. Only the requested data will be returned based on their keys (see "INFO KEYS" section below).
@@ -40,6 +40,8 @@ supported: between the key and the value and using a NUL character after each value. This format is better suited for being parsed by another applications than `keyvalue`. Unlike in the `keyvalue` format, the values are never quoted. ++ +`-z` is an alias for `--format=nul`. INFO KEYS ---------
diff --git a/builtin/repo.c b/builtin/repo.c
index 8c6e7f42ab..5df33de42e 100644
--- a/builtin/repo.c
+++ b/builtin/repo.c@@ -9,7 +9,7 @@ #include "shallow.h" static const char *const repo_usage[] = { - "git repo info [--format=(keyvalue|nul)] [<key>...]", + "git repo info [--format=(keyvalue|nul) | -z] [<key>...]", NULL };
@@ -115,20 +115,27 @@ static int print_fields(int argc, const char **argv, static int repo_info(int argc, const char **argv, const char *prefix, struct repository *repo) { - const char *format_str = "keyvalue"; + const char *format_str = NULL; enum output_format format; + int format_nul = 0; struct option options[] = { OPT_STRING(0, "format", &format_str, N_("format"), N_("output format")), + OPT_BOOL('z', NULL, &format_nul, N_("alias for --format=nul")), OPT_END() }; argc = parse_options(argc, argv, prefix, options, repo_usage, 0); - if (!strcmp(format_str, "keyvalue")) - format = FORMAT_KEYVALUE; - else if (!strcmp(format_str, "nul")) + die_for_incompatible_opt2(!!format_nul, "-z", + !!format_str, "--format"); + + format_str = format_str ? format_str : "keyvalue"; + + if (format_nul || !strcmp(format_str, "nul")) format = FORMAT_NUL_TERMINATED; + else if (!strcmp(format_str, "keyvalue")) + format = FORMAT_KEYVALUE; else die(_("invalid format '%s'"), format_str);
diff --git a/t/t1900-repo.sh b/t/t1900-repo.sh
index a69c715357..3df55dcc79 100755
--- a/t/t1900-repo.sh
+++ b/t/t1900-repo.sh@@ -92,4 +92,16 @@ test_expect_success 'git-repo-info aborts when requesting an invalid format' ' test_cmp expect actual ' +test_expect_success '-z uses nul-terminated format' ' + printf "layout.bare\nfalse\0layout.shallow\nfalse\0" >expected && + git repo info -z layout.bare layout.shallow >actual && + test_cmp expected actual +' + +test_expect_success 'git repo info fails when using --format and -z' ' + echo "fatal: options ${SQ}-z${SQ} and ${SQ}--format${SQ} cannot be used together" >expected && + test_must_fail git repo info -z --format=keyvalue 2>actual && + test_cmp expected actual +' + test_done
--
2.39.5 (Apple Git-154)