Hi! The major change in this v3 is that it's now possible to use --format and -z together. If the user uses a combination of two or more --format or -z, only the last one will be considered. Here's the range-diff versus v2: 1: 3ea40b1572 ! 1: 0323f1fa75 repo: add the flag -z as an alias for --format=nul @@ Documentation/git-repo.adoc: git-repo - Retrieve information about the repositor -------- [synopsis] -git repo info [--format=(keyvalue|nul)] [<key>...] -+git repo info [--format=(keyvalue|nul) | -z] [<key>...] ++git repo info [--format=(keyvalue|nul)] [-z] [<key>...] DESCRIPTION ----------- @@ Documentation/git-repo.adoc: THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHAN COMMANDS -------- -`info [--format=(keyvalue|nul)] [<key>...]`:: -+`info [--format=(keyvalue|nul) | -z] [<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). @@ builtin/repo.c static const char *const repo_usage[] = { - "git repo info [--format=(keyvalue|nul)] [<key>...]", -+ "git repo info [--format=(keyvalue|nul) | -z] [<key>...]", ++ "git repo info [--format=(keyvalue|nul)] [-z] [<key>...]", NULL }; @@ builtin/repo.c: static int print_fields(int argc, const char **argv, + 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, struct repository *repo) { - const char *format_str = "keyvalue"; -+ const char *format_str = NULL; - enum output_format format; -+ int format_nul = 0; +- enum output_format format; ++ enum output_format format = FORMAT_KEYVALUE; 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_STRING(0, "format", &format_str, N_("format"), +- N_("output format")), ++ OPT_CALLBACK_F(0, "format", &format, N_("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() }; @@ builtin/repo.c: static int print_fields(int argc, const char **argv, - 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); +- format = FORMAT_NUL_TERMINATED; +- else +- die(_("invalid format '%s'"), format_str); +- + return print_fields(argc, argv, repo, format); + } ## t/t1900-repo.sh ## @@ t/t1900-repo.sh: test_expect_success 'git-repo-info aborts when requesting an in + 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_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 +' + 2: 1d062e690e = 2: b2b241f401 repo: add the field objects.format Lucas Seiki Oshiro (2): repo: add the flag -z as an alias for --format=nul repo: add the field objects.format Documentation/git-repo.adoc | 9 ++++++-- builtin/repo.c | 44 +++++++++++++++++++++++++++---------- t/t1900-repo.sh | 18 +++++++++++++++ 3 files changed, 57 insertions(+), 14 deletions(-) -- 2.39.5 (Apple Git-154)