From: Siddharth Asthana Date: Sun, 29 Mar 2026 08:28:07 GMT Subject: [PATCH v2 0/1] cat-file: add mailmap subcommand to --batch-command Message-ID: <20260329082808.12609-1-siddharthasthana31@gmail.com> In-Reply-To: <20260328203615.60402-1-siddharthasthana31@gmail.com> git-cat-file(1)'s --batch-command works with the --use-mailmap option, but this option needs to be set when the process is created. This means we cannot change this option mid-operation. At GitLab, Gitaly caches git-cat-file processes and it would be useful if --batch-command supported toggling mailmap dynamically with existing processes. This patch adds a `mailmap` subcommand to --batch-command that takes `yes` or `no` as its argument. When enabled, mailmap data is loaded from disk on first use and kept in memory so that toggling back on does not require reloading. The series is based on top of 5361983c07 (The 22nd batch, 2026-03-21). CI: https://gitlab.com/gitlab-org/git/-/pipelines/2416081861 Changes in v2: - Replace two separate `use-mailmap` / `no-use-mailmap` zero-argument subcommands with a single `mailmap` subcommand that takes `yes` or `no` as its argument. This reduces the dispatch table to one entry and the implementation to one function. - Link to v1: https://public-inbox.org/git/a4ec7bfa-f16b-4505-9b37-d3dd137e93cb@gmail.com/T/#m5c62fb6ad0fbcc99a706dba4c78b66359c247acd Thanks, Siddharth --- Siddharth Asthana (1): cat-file: add mailmap subcommand to --batch-command Documentation/git-cat-file.adoc | 7 +++++ builtin/cat-file.c | 30 ++++++++++++++++++--- t/t4203-mailmap.sh | 48 +++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 4 deletions(-) Range-diff versus v1: 1: 39f40e9cb7 ! 1: 936ca27419 cat-file: add use-mailmap/no-use-mailmap to --batch-command @@ Metadata Author: Siddharth Asthana ## Commit message ## - cat-file: add use-mailmap/no-use-mailmap to --batch-command + cat-file: add mailmap subcommand to --batch-command git-cat-file(1)'s --batch-command works with the --use-mailmap option, but this option needs to be set when the process is created. This means @@ Commit message if --batch-command supported toggling mailmap dynamically with existing processes. - Add `use-mailmap` and `no-use-mailmap` as new subcommands to - --batch-command. `use-mailmap` enables the mailmap mechanism for - subsequent `contents` and `info` commands, lazily loading the mailmap - data from disk on first invocation. `no-use-mailmap` disables it but - keeps the data in memory so re-enabling doesn't require reloading. - - The subcommand names mirror the existing --use-mailmap/--no-use-mailmap - CLI options to keep the interface consistent. + Add a `mailmap` subcommand to --batch-command that takes a single + argument: `yes` to enable mailmap and `no` to disable it. When enabled, + mailmap data is loaded from disk on first use and kept in memory so that + toggling back on does not require reloading. + Suggested-by: Junio C Hamano Signed-off-by: Siddharth Asthana @@ Documentation/git-cat-file.adoc: flush:: is used, no output will come until a `flush` is issued. When `--buffer` is not used, commands are flushed each time without issuing `flush`. + -+use-mailmap:: -+ Enable mailmap for subsequent `contents` and `info` commands. If the -+ mailmap has not been loaded yet, it is read from disk at this point. -+ -+no-use-mailmap:: -+ Disable mailmap for subsequent `contents` and `info` commands. The -+ mailmap data is kept in memory so that a later `use-mailmap` command -+ does not need to reload it from disk. ++mailmap :: ++ Enable or disable mailmap for subsequent `contents` and `info` ++ commands. When `yes` is given, mailmap data is loaded from disk on ++ first use and kept in memory; passing `yes` again does not reload it. ++ When `no` is given, mailmap is disabled but the data stays in memory ++ so that a later `mailmap yes` does not need to reload it from disk. -- @@ builtin/cat-file.c: static void parse_cmd_info(struct batch_options *opt, batch_one_object(line, output, opt, data); } -+static void parse_cmd_use_mailmap(struct batch_options *opt UNUSED, -+ const char *line UNUSED, -+ struct strbuf *output UNUSED, -+ struct expand_data *data UNUSED) ++static void parse_cmd_mailmap(struct batch_options *opt UNUSED, ++ const char *line, ++ struct strbuf *output UNUSED, ++ struct expand_data *data UNUSED) +{ -+ if (!mailmap_loaded) { -+ read_mailmap(the_repository, &mailmap); -+ mailmap_loaded = 1; ++ if (!strcmp(line, "yes")) { ++ if (!mailmap_loaded) { ++ read_mailmap(the_repository, &mailmap); ++ mailmap_loaded = 1; ++ } ++ use_mailmap = 1; ++ } else if (!strcmp(line, "no")) { ++ use_mailmap = 0; ++ } else { ++ die(_("mailmap: unknown argument '%s', expected 'yes' or 'no'"), line); + } -+ use_mailmap = 1; -+} -+ -+static void parse_cmd_disable_mailmap(struct batch_options *opt UNUSED, -+ const char *line UNUSED, -+ struct strbuf *output UNUSED, -+ struct expand_data *data UNUSED) -+{ -+ use_mailmap = 0; +} @@ builtin/cat-file.c: static const struct parse_cmd { + { "contents", parse_cmd_contents, 1 }, + { "info", parse_cmd_info, 1 }, + { "flush", NULL, 0 }, -+ { "use-mailmap", parse_cmd_use_mailmap, 0 }, -+ { "no-use-mailmap", parse_cmd_disable_mailmap, 0 }, ++ { "mailmap", parse_cmd_mailmap, 1 }, }; @@ t/t4203-mailmap.sh: test_expect_success 'git cat-file --batch-command returns co -+test_expect_success 'git cat-file --batch-command use-mailmap enables mailmap mid-stream' ' ++test_expect_success 'git cat-file --batch-command mailmap yes enables mailmap mid-stream' ' + ... -+ printf "info HEAD\nuse-mailmap\ninfo HEAD\n" | git cat-file --batch-command >actual && ++ printf "info HEAD\nmailmap yes\ninfo HEAD\n" | git cat-file --batch-command >actual && -+test_expect_success 'git cat-file --batch-command no-use-mailmap disables mailmap mid-stream' ' ++test_expect_success 'git cat-file --batch-command mailmap no disables mailmap mid-stream' ' + ... -+ printf "use-mailmap\ninfo HEAD\nno-use-mailmap\ninfo HEAD\n" | git cat-file --batch-command >actual && ++ printf "mailmap yes\ninfo HEAD\nmailmap no\ninfo HEAD\n" | git cat-file --batch-command >actual && -+test_expect_success 'git cat-file --batch-command use-mailmap works in --buffer mode' ' ++test_expect_success 'git cat-file --batch-command mailmap works in --buffer mode' ' + ... -+ printf "use-mailmap\ninfo HEAD\nno-use-mailmap\ninfo HEAD\nflush\n" | git cat-file --batch-command --buffer >actual && ++ printf "mailmap yes\ninfo HEAD\nmailmap no\ninfo HEAD\nflush\n" | git cat-file --batch-command --buffer >actual && base-commit: 5361983c075154725be47b65cca9a2421789e410 -- 2.51.0