repo: add the flag -z as an alias for --format=nul

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 <karthik.188@gmail.com>
Mentored-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Lucas Seiki Oshiro <lucasseikioshiro@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Lucas Seiki Oshiro
2025-09-04 10:40:16 -03:00
committed by Junio C Hamano
parent c8f660a7ca
commit a92f5ca0d5
3 changed files with 42 additions and 14 deletions

View File

@@ -8,7 +8,7 @@ git-repo - Retrieve information about the repository
SYNOPSIS SYNOPSIS
-------- --------
[synopsis] [synopsis]
git repo info [--format=(keyvalue|nul)] [<key>...] git repo info [--format=(keyvalue|nul)] [-z] [<key>...]
DESCRIPTION DESCRIPTION
----------- -----------
@@ -18,7 +18,7 @@ THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
COMMANDS COMMANDS
-------- --------
`info [--format=(keyvalue|nul)] [<key>...]`:: `info [--format=(keyvalue|nul)] [-z] [<key>...]`::
Retrieve metadata-related information about the current repository. Only Retrieve metadata-related information about the current repository. Only
the requested data will be returned based on their keys (see "INFO KEYS" the requested data will be returned based on their keys (see "INFO KEYS"
section below). section below).
@@ -40,6 +40,8 @@ supported:
between the key and the value and using a NUL character after each value. 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 This format is better suited for being parsed by another applications than
`keyvalue`. Unlike in the `keyvalue` format, the values are never quoted. `keyvalue`. Unlike in the `keyvalue` format, the values are never quoted.
+
`-z` is an alias for `--format=nul`.
INFO KEYS INFO KEYS
--------- ---------

View File

@@ -9,7 +9,7 @@
#include "shallow.h" #include "shallow.h"
static const char *const repo_usage[] = { static const char *const repo_usage[] = {
"git repo info [--format=(keyvalue|nul)] [<key>...]", "git repo info [--format=(keyvalue|nul)] [-z] [<key>...]",
NULL NULL
}; };
@@ -112,26 +112,40 @@ static int print_fields(int argc, const char **argv,
return ret; return ret;
} }
static int parse_format_cb(const struct option *opt,
const char *arg, int unset UNUSED)
{
enum output_format *format = opt->value;
if (opt->short_name == 'z')
*format = FORMAT_NUL_TERMINATED;
else if (!strcmp(arg, "nul"))
*format = FORMAT_NUL_TERMINATED;
else if (!strcmp(arg, "keyvalue"))
*format = FORMAT_KEYVALUE;
else
die(_("invalid format '%s'"), arg);
return 0;
}
static int repo_info(int argc, const char **argv, const char *prefix, static int repo_info(int argc, const char **argv, const char *prefix,
struct repository *repo) struct repository *repo)
{ {
const char *format_str = "keyvalue"; enum output_format format = FORMAT_KEYVALUE;
enum output_format format;
struct option options[] = { struct option options[] = {
OPT_STRING(0, "format", &format_str, N_("format"), OPT_CALLBACK_F(0, "format", &format, N_("format"),
N_("output format")), N_("output format"),
PARSE_OPT_NONEG, parse_format_cb),
OPT_CALLBACK_F('z', NULL, &format, NULL,
N_("synonym for --format=nul"),
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
parse_format_cb),
OPT_END() OPT_END()
}; };
argc = parse_options(argc, argv, prefix, options, repo_usage, 0); argc = parse_options(argc, argv, prefix, options, repo_usage, 0);
if (!strcmp(format_str, "keyvalue"))
format = FORMAT_KEYVALUE;
else if (!strcmp(format_str, "nul"))
format = FORMAT_NUL_TERMINATED;
else
die(_("invalid format '%s'"), format_str);
return print_fields(argc, argv, repo, format); return print_fields(argc, argv, repo, format);
} }

View File

@@ -92,4 +92,16 @@ test_expect_success 'git-repo-info aborts when requesting an invalid format' '
test_cmp expect actual 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 uses the last requested format' '
echo "layout.bare=false" >expected &&
git repo info --format=nul -z --format=keyvalue layout.bare >actual &&
test_cmp expected actual
'
test_done test_done