Subject: [GSoC PATCH v3 0/2] repo: add -z and objects.format

From: Lucas Seiki Oshiro <[email-masked]>
Date: Mon, 1 Sep 2025 14:27:30 -0300

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)