commit: ignore multiple author fields

Some tools create multiple author fields. git is rather lax when parsing
them, although fsck does complain about them. This means that they exist
in the wild.

As it's not too taxing to check for them, and there shouldn't be a
noticeable slowdown when dealing with correct commits, add logic to skip
over these extra fields when parsing the commit.
This commit is contained in:
Carlos Martín Nieto 2015-06-11 08:24:58 +02:00
parent fa934fabf7
commit 65d69fe854
2 changed files with 17 additions and 0 deletions

View File

@ -309,6 +309,7 @@ int git_commit__parse(void *_commit, git_odb_object *odb_obj)
const char *buffer_end = buffer_start + git_odb_object_size(odb_obj); const char *buffer_end = buffer_start + git_odb_object_size(odb_obj);
git_oid parent_id; git_oid parent_id;
size_t header_len; size_t header_len;
git_signature dummy_sig;
buffer = buffer_start; buffer = buffer_start;
@ -337,6 +338,15 @@ int git_commit__parse(void *_commit, git_odb_object *odb_obj)
if (git_signature__parse(commit->author, &buffer, buffer_end, "author ", '\n') < 0) if (git_signature__parse(commit->author, &buffer, buffer_end, "author ", '\n') < 0)
return -1; return -1;
/* Some tools create multiple author fields, ignore the extra ones */
while ((size_t)(buffer_end - buffer) >= strlen("author ") && !git__prefixcmp(buffer, "author ")) {
if (git_signature__parse(&dummy_sig, &buffer, buffer_end, "author ", '\n') < 0)
return -1;
git__free(dummy_sig.name);
git__free(dummy_sig.email);
}
/* Always parse the committer; we need the commit time */ /* Always parse the committer; we need the commit time */
commit->committer = git__malloc(sizeof(git_signature)); commit->committer = git__malloc(sizeof(git_signature));
GITERR_CHECK_ALLOC(commit->committer); GITERR_CHECK_ALLOC(commit->committer);

View File

@ -262,6 +262,13 @@ gpgsig -----BEGIN PGP SIGNATURE-----\n\
-----END PGP SIGNATURE-----\n\ -----END PGP SIGNATURE-----\n\
\n\ \n\
a simple commit which works\n", a simple commit which works\n",
/* some tools create two author entries */
"tree 1810dff58d8a660512d4832e740f692884338ccd\n\
author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
author Helpful Coworker <helpful@coworker> 1273848544 +0200\n\
committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
\n\
a simple commit which works",
}; };
static int parse_commit(git_commit **out, const char *buffer) static int parse_commit(git_commit **out, const char *buffer)