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:
Marius Storm-Olsen
2009-02-08 15:34:30 +01:00
committed by Junio C Hamano
parent 0925ce4d49
commit d20d654fe8
5 changed files with 186 additions and 51 deletions

View File

@ -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;
}