[GSoC PATCH v3 0/2] repo: add -z and objects.format
From: Lucas Seiki Oshiro <hidden>
Date: 2025-09-01 17:27:52
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)