builtin-fsck: reports missing parent commits
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>
This commit is contained in:
parent
7914053ba9
commit
4516338243
@ -397,6 +397,8 @@ static int fsck_commit(struct commit *commit)
|
|||||||
{
|
{
|
||||||
char *buffer = commit->buffer;
|
char *buffer = commit->buffer;
|
||||||
unsigned char tree_sha1[20], sha1[20];
|
unsigned char tree_sha1[20], sha1[20];
|
||||||
|
struct commit_graft *graft;
|
||||||
|
int parents = 0;
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "Checking commit %s\n",
|
fprintf(stderr, "Checking commit %s\n",
|
||||||
@ -411,6 +413,28 @@ static int fsck_commit(struct commit *commit)
|
|||||||
if (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\n')
|
if (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\n')
|
||||||
return objerror(&commit->object, "invalid 'parent' line format - bad sha1");
|
return objerror(&commit->object, "invalid 'parent' line format - bad sha1");
|
||||||
buffer += 48;
|
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))
|
if (memcmp(buffer, "author ", 7))
|
||||||
return objerror(&commit->object, "invalid format - expected 'author' line");
|
return objerror(&commit->object, "invalid format - expected 'author' line");
|
||||||
|
2
commit.c
2
commit.c
@ -193,7 +193,7 @@ static void prepare_commit_graft(void)
|
|||||||
commit_graft_prepared = 1;
|
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;
|
int pos;
|
||||||
prepare_commit_graft();
|
prepare_commit_graft();
|
||||||
|
1
commit.h
1
commit.h
@ -101,6 +101,7 @@ struct commit_graft {
|
|||||||
struct commit_graft *read_graft_line(char *buf, int len);
|
struct commit_graft *read_graft_line(char *buf, int len);
|
||||||
int register_commit_graft(struct commit_graft *, int);
|
int register_commit_graft(struct commit_graft *, int);
|
||||||
int read_graft_file(const char *graft_file);
|
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);
|
extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user