Skip to content

Commit

Permalink
fsck: handle multiple authors in commits specially
Browse files Browse the repository at this point in the history
This problem has been detected in the wild, and is the primary reason
to introduce an option to demote certain fsck errors to warnings. Let's
offer to ignore this particular problem specifically.

Technically, we could handle such repositories by setting
receive.fsck.<msg-id> to missingCommitter=warn, but that could hide
missing tree objects in the same commit because we cannot continue
verifying any commit object after encountering a missing committer line,
while we can continue in the case of multiple author lines.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Jun 23, 2015
1 parent b358476 commit c9ad147
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
FUNC(MISSING_TREE, ERROR) \
FUNC(MISSING_TYPE, ERROR) \
FUNC(MISSING_TYPE_ENTRY, ERROR) \
FUNC(MULTIPLE_AUTHORS, ERROR) \
FUNC(NUL_IN_HEADER, ERROR) \
FUNC(TAG_OBJECT_NOT_TAG, ERROR) \
FUNC(TREE_NOT_SORTED, ERROR) \
Expand Down Expand Up @@ -529,7 +530,7 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
{
unsigned char tree_sha1[20], sha1[20];
struct commit_graft *graft;
unsigned parent_count, parent_line_count = 0;
unsigned parent_count, parent_line_count = 0, author_count;
int err;

if (require_end_of_header(buffer, size, &commit->object, options))
Expand Down Expand Up @@ -569,9 +570,17 @@ static int fsck_commit_buffer(struct commit *commit, const char *buffer,
return err;
}
}
if (!skip_prefix(buffer, "author ", &buffer))
return report(options, &commit->object, FSCK_MSG_MISSING_AUTHOR, "invalid format - expected 'author' line");
err = fsck_ident(&buffer, &commit->object, options);
author_count = 0;
while (skip_prefix(buffer, "author ", &buffer)) {
author_count++;
err = fsck_ident(&buffer, &commit->object, options);
if (err)
return err;
}
if (author_count < 1)
err = report(options, &commit->object, FSCK_MSG_MISSING_AUTHOR, "invalid format - expected 'author' line");
else if (author_count > 1)
err = report(options, &commit->object, FSCK_MSG_MULTIPLE_AUTHORS, "invalid format - multiple 'author' lines");
if (err)
return err;
if (!skip_prefix(buffer, "committer ", &buffer))
Expand Down

0 comments on commit c9ad147

Please sign in to comment.