]> git.ipfire.org Git - thirdparty/git.git/commitdiff
shortlog: parse trailer idents
authorJeff King <peff@peff.net>
Sun, 27 Sep 2020 08:40:11 +0000 (04:40 -0400)
committerJunio C Hamano <gitster@pobox.com>
Sun, 27 Sep 2020 19:21:05 +0000 (12:21 -0700)
Trailers don't necessarily contain name/email identity values, so
shortlog has so far treated them as opaque strings. However, since many
trailers do contain identities, it's useful to treat them as such when
they can be parsed. That lets "-e" work as usual, as well as mailmap.

When they can't be parsed, we'll continue with the old behavior of
treating them as a single string (there's no new test for that here,
since the existing tests cover a trailer like this).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-shortlog.txt
builtin/shortlog.c
t/t4201-shortlog.sh

index 9e94613e13d96ac1cc8584c14cb72ea84df6d5e9..3db0db2da038aad90e8b6f8c7e393cb76f672cde 100644 (file)
@@ -64,9 +64,10 @@ Likewise, commits with multiple trailers (e.g., multiple signoffs) may
 be counted more than once (but only once per unique trailer value in
 that commit).
 +
-The contents of each trailer value are taken literally and completely.
-No mailmap is applied, and the `-e` option has no effect (if the trailer
-contains a username and email, they are both always shown).
+Shortlog will attempt to parse each trailer value as a `name <email>`
+identity. If successful, the mailmap is applied and the email is omitted
+unless the `--email` option is specified. If the value cannot be parsed
+as an identity, it will be taken literally and completely.
 
 -c::
 --committer::
index e6f4faec7c251e89c344da9f683e31ce838164e5..28133aec6854084bd12d112f8f2382c7198bda3a 100644 (file)
@@ -228,6 +228,7 @@ static void insert_records_from_trailers(struct shortlog *log,
        struct trailer_iterator iter;
        const char *commit_buffer, *body;
        struct strset dups = STRSET_INIT;
+       struct strbuf ident = STRBUF_INIT;
 
        /*
         * Using format_commit_message("%B") would be simpler here, but
@@ -245,12 +246,17 @@ static void insert_records_from_trailers(struct shortlog *log,
                if (strcasecmp(iter.key.buf, log->trailer))
                        continue;
 
+               strbuf_reset(&ident);
+               if (!parse_ident(log, &ident, value))
+                       value = ident.buf;
+
                if (strset_check_and_add(&dups, value))
                        continue;
                insert_one_record(log, value, oneline);
        }
        trailer_iterator_release(&iter);
 
+       strbuf_release(&ident);
        strset_clear(&dups);
        unuse_commit_buffer(commit, commit_buffer);
 }
index 83dbbc44e8ade97db32efbeea60375d9aeda98a4..a62ee9ed55e7b6401b7d971a57b7939a7282443e 100755 (executable)
@@ -230,10 +230,30 @@ test_expect_success 'shortlog --group=trailer:signed-off-by' '
             2  C O Mitter <committer@example.com>
             1  SOB One <sob@example.com>
        EOF
+       git shortlog -nse --group=trailer:signed-off-by HEAD >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'trailer idents are split' '
+       cat >expect <<-\EOF &&
+            2  C O Mitter
+            1  SOB One
+       EOF
        git shortlog -ns --group=trailer:signed-off-by HEAD >actual &&
        test_cmp expect actual
 '
 
+test_expect_success 'trailer idents are mailmapped' '
+       cat >expect <<-\EOF &&
+            2  C O Mitter
+            1  Another Name
+       EOF
+       echo "Another Name <sob@example.com>" >mail.map &&
+       git -c mailmap.file=mail.map shortlog -ns \
+               --group=trailer:signed-off-by HEAD >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success 'shortlog de-duplicates trailers in a single commit' '
        git commit --allow-empty -F - <<-\EOF &&
        subject one