Skip to content

Commit

Permalink
builtin-fsck: reports missing parent commits
Browse files Browse the repository at this point in the history
parse_commit ignores parent commits with certain errors
(eg. a non commit object is already loaded under the sha1 of
the parent). To make fsck reports such errors, it has to compare
the nummer of parent commits returned by parse commit with the
number of parent commits in the object or in the graft/shallow file.

Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Martin Koegler authored and Junio C Hamano committed Feb 26, 2008
1 parent 7914053 commit 4516338
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
24 changes: 24 additions & 0 deletions builtin-fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,8 @@ static int fsck_commit(struct commit *commit)
{
char *buffer = commit->buffer;
unsigned char tree_sha1[20], sha1[20];
struct commit_graft *graft;
int parents = 0;

if (verbose)
fprintf(stderr, "Checking commit %s\n",
Expand All @@ -411,6 +413,28 @@ static int fsck_commit(struct commit *commit)
if (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\n')
return objerror(&commit->object, "invalid 'parent' line format - bad sha1");
buffer += 48;
parents++;
}
graft = lookup_commit_graft(commit->object.sha1);
if (graft) {
struct commit_list *p = commit->parents;
parents = 0;
while (p) {
p = p->next;
parents++;
}
if (graft->nr_parent == -1 && !parents)
; /* shallow commit */
else if (graft->nr_parent != parents)
return objerror(&commit->object, "graft objects missing");
} else {
struct commit_list *p = commit->parents;
while (p && parents) {
p = p->next;
parents--;
}
if (p || parents)
return objerror(&commit->object, "parent objects missing");
}
if (memcmp(buffer, "author ", 7))
return objerror(&commit->object, "invalid format - expected 'author' line");
Expand Down
2 changes: 1 addition & 1 deletion commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ static void prepare_commit_graft(void)
commit_graft_prepared = 1;
}

static struct commit_graft *lookup_commit_graft(const unsigned char *sha1)
struct commit_graft *lookup_commit_graft(const unsigned char *sha1)
{
int pos;
prepare_commit_graft();
Expand Down
1 change: 1 addition & 0 deletions commit.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ struct commit_graft {
struct commit_graft *read_graft_line(char *buf, int len);
int register_commit_graft(struct commit_graft *, int);
int read_graft_file(const char *graft_file);
struct commit_graft *lookup_commit_graft(const unsigned char *sha1);

extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup);

Expand Down

0 comments on commit 4516338

Please sign in to comment.