Skip to content

Commit

Permalink
log: grep author/committer using mailmap
Browse files Browse the repository at this point in the history
Currently you can use mailmap to display log authors and committers
but you can't use the mailmap to find commits with mapped values.

This commit allows you to run:

    git log --use-mailmap --author mapped_name_or_email
    git log --use-mailmap --committer mapped_name_or_email

Of course it only works if the --use-mailmap option is used.

The new name and email are copied only when necessary.

Signed-off-by: Antoine Pelisse <apelisse@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Antoine Pelisse authored and Junio C Hamano committed Jan 10, 2013
1 parent d207434 commit d72fbe8
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
54 changes: 54 additions & 0 deletions revision.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "decorate.h"
#include "log-tree.h"
#include "string-list.h"
#include "mailmap.h"

volatile show_early_output_fn_t show_early_output;

Expand Down Expand Up @@ -2219,6 +2220,51 @@ static int rewrite_parents(struct rev_info *revs, struct commit *commit)
return 0;
}

static int commit_rewrite_person(struct strbuf *buf, const char *what, struct string_list *mailmap)
{
char *person, *endp;
size_t len, namelen, maillen;
const char *name;
const char *mail;
struct ident_split ident;

person = strstr(buf->buf, what);
if (!person)
return 0;

person += strlen(what);
endp = strchr(person, '\n');
if (!endp)
return 0;

len = endp - person;

if (split_ident_line(&ident, person, len))
return 0;

mail = ident.mail_begin;
maillen = ident.mail_end - ident.mail_begin;
name = ident.name_begin;
namelen = ident.name_end - ident.name_begin;

if (map_user(mailmap, &mail, &maillen, &name, &namelen)) {
struct strbuf namemail = STRBUF_INIT;

strbuf_addf(&namemail, "%.*s <%.*s>",
(int)namelen, name, (int)maillen, mail);

strbuf_splice(buf, ident.name_begin - buf->buf,
ident.mail_end - ident.name_begin + 1,
namemail.buf, namemail.len);

strbuf_release(&namemail);

return 1;
}

return 0;
}

static int commit_match(struct commit *commit, struct rev_info *opt)
{
int retval;
Expand All @@ -2237,6 +2283,14 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
if (buf.len)
strbuf_addstr(&buf, commit->buffer);

if (opt->mailmap) {
if (!buf.len)
strbuf_addstr(&buf, commit->buffer);

commit_rewrite_person(&buf, "\nauthor ", opt->mailmap);
commit_rewrite_person(&buf, "\ncommitter ", opt->mailmap);
}

/* Append "fake" message parts as needed */
if (opt->show_notes) {
if (!buf.len)
Expand Down
18 changes: 18 additions & 0 deletions t/t4203-mailmap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -248,11 +248,29 @@ Author: Other Author <other@author.xx>
Author: Some Dude <some@dude.xx>
Author: A U Thor <author@example.com>
EOF

test_expect_success 'Log output with --use-mailmap' '
git log --use-mailmap | grep Author >actual &&
test_cmp expect actual
'

cat >expect <<\EOF
Author: Santa Claus <santa.claus@northpole.xx>
Author: Santa Claus <santa.claus@northpole.xx>
EOF

test_expect_success 'Grep author with --use-mailmap' '
git log --use-mailmap --author Santa | grep Author >actual &&
test_cmp expect actual
'

>expect

test_expect_success 'Only grep replaced author with --use-mailmap' '
git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
test_cmp expect actual
'

# git blame
cat >expect <<\EOF
^OBJI (A U Thor DATE 1) one
Expand Down

0 comments on commit d72fbe8

Please sign in to comment.