Change current mailmap usage to do matching on both name and email of author/committer.
Signed-off-by: Marius Storm-Olsen <marius@trolltech.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
0925ce4d49
commit
d20d654fe8
57
pretty.c
57
pretty.c
@ -305,23 +305,14 @@ static char *logmsg_reencode(const struct commit *commit,
|
||||
return out;
|
||||
}
|
||||
|
||||
static int mailmap_name(struct strbuf *sb, const char *email)
|
||||
static int mailmap_name(char *email, int email_len, char *name, int name_len)
|
||||
{
|
||||
static struct string_list *mail_map;
|
||||
char buffer[1024];
|
||||
|
||||
if (!mail_map) {
|
||||
mail_map = xcalloc(1, sizeof(*mail_map));
|
||||
read_mailmap(mail_map, NULL);
|
||||
}
|
||||
|
||||
if (!mail_map->nr)
|
||||
return -1;
|
||||
|
||||
if (!map_email(mail_map, email, buffer, sizeof(buffer)))
|
||||
return -1;
|
||||
strbuf_addstr(sb, buffer);
|
||||
return 0;
|
||||
return mail_map->nr && map_user(mail_map, email, email_len, name, name_len);
|
||||
}
|
||||
|
||||
static size_t format_person_part(struct strbuf *sb, char part,
|
||||
@ -332,6 +323,9 @@ static size_t format_person_part(struct strbuf *sb, char part,
|
||||
int start, end, tz = 0;
|
||||
unsigned long date = 0;
|
||||
char *ep;
|
||||
const char *name_start, *name_end, *mail_start, *mail_end, *msg_end = msg+len;
|
||||
char person_name[1024];
|
||||
char person_mail[1024];
|
||||
|
||||
/* advance 'end' to point to email start delimiter */
|
||||
for (end = 0; end < len && msg[end] != '<'; end++)
|
||||
@ -345,25 +339,34 @@ static size_t format_person_part(struct strbuf *sb, char part,
|
||||
if (end >= len - 2)
|
||||
goto skip;
|
||||
|
||||
/* Seek for both name and email part */
|
||||
name_start = msg;
|
||||
name_end = msg+end;
|
||||
while (name_end > name_start && isspace(*(name_end-1)))
|
||||
name_end--;
|
||||
mail_start = msg+end+1;
|
||||
mail_end = mail_start;
|
||||
while (mail_end < msg_end && *mail_end != '>')
|
||||
mail_end++;
|
||||
if (mail_end == msg_end)
|
||||
goto skip;
|
||||
end = mail_end-msg;
|
||||
|
||||
if (part == 'N' || part == 'E') { /* mailmap lookup */
|
||||
strlcpy(person_name, name_start, name_end-name_start+1);
|
||||
strlcpy(person_mail, mail_start, mail_end-mail_start+1);
|
||||
mailmap_name(person_mail, sizeof(person_mail), person_name, sizeof(person_name));
|
||||
name_start = person_name;
|
||||
name_end = name_start + strlen(person_name);
|
||||
mail_start = person_mail;
|
||||
mail_end = mail_start + strlen(person_mail);
|
||||
}
|
||||
if (part == 'n' || part == 'N') { /* name */
|
||||
while (end > 0 && isspace(msg[end - 1]))
|
||||
end--;
|
||||
if (part != 'N' || !msg[end] || !msg[end + 1] ||
|
||||
mailmap_name(sb, msg + end + 2) < 0)
|
||||
strbuf_add(sb, msg, end);
|
||||
strbuf_add(sb, name_start, name_end-name_start);
|
||||
return placeholder_len;
|
||||
}
|
||||
start = ++end; /* save email start position */
|
||||
|
||||
/* advance 'end' to point to email end delimiter */
|
||||
for ( ; end < len && msg[end] != '>'; end++)
|
||||
; /* do nothing */
|
||||
|
||||
if (end >= len)
|
||||
goto skip;
|
||||
|
||||
if (part == 'e') { /* email */
|
||||
strbuf_add(sb, msg + start, end - start);
|
||||
if (part == 'e' || part == 'E') { /* email */
|
||||
strbuf_add(sb, mail_start, mail_end-mail_start);
|
||||
return placeholder_len;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user