static char *replace_idents_using_mailmap(char *, size_t *);
+static void load_mailmap(void)
+{
+ if (mailmap.strdup_strings)
+ return;
+
+ read_mailmap(the_repository, &mailmap);
+}
+
static char *replace_idents_using_mailmap(char *object_buf, size_t *size)
{
struct strbuf sb = STRBUF_INIT;
batch_one_object(line, output, opt, data);
}
+static void parse_cmd_mailmap(struct batch_options *opt UNUSED,
+ const char *line,
+ struct strbuf *output UNUSED,
+ struct expand_data *data UNUSED)
+{
+ int value = git_parse_maybe_bool(line);
+
+ if (value < 0)
+ die(_("mailmap: invalid boolean '%s'"), line);
+
+ if (value > 0)
+ load_mailmap();
+ use_mailmap = value;
+}
+
static void dispatch_calls(struct batch_options *opt,
struct strbuf *output,
struct expand_data *data,
parse_cmd_fn_t fn;
unsigned takes_args;
} commands[] = {
- { "contents", parse_cmd_contents, 1},
- { "info", parse_cmd_info, 1},
- { "flush", NULL, 0},
+ { "contents", parse_cmd_contents, 1 },
+ { "info", parse_cmd_info, 1 },
+ { "flush", NULL, 0 },
+ { "mailmap", parse_cmd_mailmap, 1 },
};
static void batch_objects_command(struct batch_options *opt,
opt_epts = (opt == 'e' || opt == 'p' || opt == 't' || opt == 's');
if (use_mailmap)
- read_mailmap(the_repository, &mailmap);
+ load_mailmap();
switch (batch.objects_filter.choice) {
case LOFC_DISABLED:
test_cmp expect actual
'
+test_expect_success 'git cat-file --batch-command mailmap yes enables mailmap mid-stream' '
+ test_when_finished "rm .mailmap" &&
+ cat >.mailmap <<-\EOF &&
+ C O Mitter <committer@example.com> Orig <orig@example.com>
+ EOF
+ commit_sha=$(git rev-parse HEAD) &&
+ git cat-file commit HEAD >commit_no_mailmap.out &&
+ git cat-file --use-mailmap commit HEAD >commit_mailmap.out &&
+ size_no_mailmap=$(wc -c <commit_no_mailmap.out) &&
+ size_mailmap=$(wc -c <commit_mailmap.out) &&
+ printf "info HEAD\nmailmap yes\ninfo HEAD\n" | git cat-file --batch-command >actual &&
+ echo $commit_sha commit $size_no_mailmap >expect &&
+ echo $commit_sha commit $size_mailmap >>expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git cat-file --batch-command mailmap no disables mailmap mid-stream' '
+ test_when_finished "rm .mailmap" &&
+ cat >.mailmap <<-\EOF &&
+ C O Mitter <committer@example.com> Orig <orig@example.com>
+ EOF
+ commit_sha=$(git rev-parse HEAD) &&
+ git cat-file commit HEAD >commit_no_mailmap.out &&
+ git cat-file --use-mailmap commit HEAD >commit_mailmap.out &&
+ size_no_mailmap=$(wc -c <commit_no_mailmap.out) &&
+ size_mailmap=$(wc -c <commit_mailmap.out) &&
+ printf "mailmap yes\ninfo HEAD\nmailmap no\ninfo HEAD\n" | git cat-file --batch-command >actual &&
+ echo $commit_sha commit $size_mailmap >expect &&
+ echo $commit_sha commit $size_no_mailmap >>expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git cat-file --batch-command mailmap works in --buffer mode' '
+ test_when_finished "rm .mailmap" &&
+ cat >.mailmap <<-\EOF &&
+ C O Mitter <committer@example.com> Orig <orig@example.com>
+ EOF
+ commit_sha=$(git rev-parse HEAD) &&
+ git cat-file commit HEAD >commit_no_mailmap.out &&
+ git cat-file --use-mailmap commit HEAD >commit_mailmap.out &&
+ size_no_mailmap=$(wc -c <commit_no_mailmap.out) &&
+ size_mailmap=$(wc -c <commit_mailmap.out) &&
+ printf "mailmap yes\ninfo HEAD\nmailmap no\ninfo HEAD\nflush\n" | git cat-file --batch-command --buffer >actual &&
+ echo $commit_sha commit $size_mailmap >expect &&
+ echo $commit_sha commit $size_no_mailmap >>expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git cat-file --batch-command mailmap no overrides startup --mailmap' '
+ test_when_finished "rm .mailmap" &&
+ cat >.mailmap <<-\EOF &&
+ C O Mitter <committer@example.com> Orig <orig@example.com>
+ EOF
+ commit_sha=$(git rev-parse HEAD) &&
+ git cat-file --use-mailmap commit HEAD >commit_mailmap.out &&
+ size_mailmap=$(wc -c <commit_mailmap.out) &&
+ git cat-file commit HEAD >commit_no_mailmap.out &&
+ size_no_mailmap=$(wc -c <commit_no_mailmap.out) &&
+ printf "info HEAD\nmailmap no\ninfo HEAD\n" | \
+ git cat-file --mailmap --batch-command >actual &&
+ echo $commit_sha commit $size_mailmap >expect &&
+ echo $commit_sha commit $size_no_mailmap >>expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git cat-file --batch-command mailmap yes overrides startup --no-mailmap' '
+ test_when_finished "rm .mailmap" &&
+ cat >.mailmap <<-\EOF &&
+ C O Mitter <committer@example.com> Orig <orig@example.com>
+ EOF
+ commit_sha=$(git rev-parse HEAD) &&
+ git cat-file commit HEAD >commit_no_mailmap.out &&
+ size_no_mailmap=$(wc -c <commit_no_mailmap.out) &&
+ git cat-file --use-mailmap commit HEAD >commit_mailmap.out &&
+ size_mailmap=$(wc -c <commit_mailmap.out) &&
+ printf "info HEAD\nmailmap yes\ninfo HEAD\n" | \
+ git cat-file --no-mailmap --batch-command >actual &&
+ echo $commit_sha commit $size_no_mailmap >expect &&
+ echo $commit_sha commit $size_mailmap >>expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git cat-file --batch-command mailmap accepts true/false' '
+ test_when_finished "rm .mailmap" &&
+ cat >.mailmap <<-\EOF &&
+ C O Mitter <committer@example.com> Orig <orig@example.com>
+ EOF
+ commit_sha=$(git rev-parse HEAD) &&
+ git cat-file commit HEAD >commit_no_mailmap.out &&
+ size_no_mailmap=$(wc -c <commit_no_mailmap.out) &&
+ git cat-file --use-mailmap commit HEAD >commit_mailmap.out &&
+ size_mailmap=$(wc -c <commit_mailmap.out) &&
+ printf "mailmap true\ninfo HEAD\nmailmap false\ninfo HEAD\n" | \
+ git cat-file --batch-command >actual &&
+ echo $commit_sha commit $size_mailmap >expect &&
+ echo $commit_sha commit $size_no_mailmap >>expect &&
+ test_cmp expect actual
+'
+
+test_expect_success 'git cat-file --batch-command mailmap rejects invalid boolean' '
+ echo "mailmap maybe" >in &&
+ test_must_fail git cat-file --batch-command <in 2>err &&
+ test_grep "mailmap: invalid boolean .*maybe" err
+'
+
test_expect_success 'git cat-file --mailmap works with different author and committer' '
test_when_finished "rm .mailmap" &&
cat >.mailmap <<-\EOF &&