1
0
Fork 0

Use split_ident_line() in parse_user()

Use Git's built-in ident line splitting algorithm instead of
reimplementing it. This does not only simplify the code but also makes
sure that cgit is consistent with Git when it comes to author parsing.

Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de>
Dieser Commit ist enthalten in:
Lukas Fleischer 2014-12-24 08:50:11 +01:00 committet von Jason A. Donenfeld
Ursprung 2159414a39
Commit 6f9e8a9659
1 geänderte Dateien mit 17 neuen und 28 gelöschten Zeilen

Datei anzeigen

@ -71,36 +71,25 @@ static char *substr(const char *head, const char *tail)
static const char *parse_user(const char *t, char **name, char **email, unsigned long *date)
{
const char *p = t;
int mode = 1;
const char *line_end = strchrnul(t, '\n');
struct ident_split ident;
unsigned email_len;
while (p && *p) {
if (mode == 1 && *p == '<') {
*name = substr(t, p - 1);
t = p;
mode++;
} else if (mode == 1 && *p == '\n') {
*name = substr(t, p);
p++;
break;
} else if (mode == 2 && *p == '>') {
*email = substr(t, p + 1);
t = p;
mode++;
} else if (mode == 2 && *p == '\n') {
*email = substr(t, p);
p++;
break;
} else if (mode == 3 && isdigit(*p)) {
*date = atol(p);
mode++;
} else if (*p == '\n') {
p++;
break;
}
p++;
if (!split_ident_line(&ident, t, line_end - t)) {
*name = substr(ident.name_begin, ident.name_end);
email_len = ident.mail_end - ident.mail_begin;
*email = xmalloc(strlen("<") + email_len + strlen(">") + 1);
sprintf(*email, "<%.*s>", email_len, ident.mail_begin);
if (ident.date_begin)
*date = strtoul(ident.date_begin, NULL, 10);
}
return p;
if (*line_end)
return line_end + 1;
else
return line_end;
}
#ifdef NO_ICONV