Show 27 quoted lines
> 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>
> ---
> 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..f2dc71193c 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>...]
>
Show 88 quoted lines
> 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..b2ec66e454 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)