git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 04/10] builtin-fsck: reports missing parent commits

From
MKMartin Koegler <mkoegler@auto.tuwien.ac.at>
Date
Feb 25, 2008, 21:54 UTC
Message-ID
<12039765002219-git-send-email-mkoegler@auto.tuwien.ac.at>
In-Reply-To
<12039765003484-git-send-email-mkoegler@auto.tuwien.ac.at>

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>
---
 builtin-fsck.c |   24 ++++++++++++++++++++++++
 commit.c       |    2 +-
 commit.h       |    1 +
 3 files changed, 26 insertions(+), 1 deletions(-)
diff --git a/builtin-fsck.c b/builtin-fsck.c
index a2e6f53..198466c 100644
--- a/builtin-fsck.c
+++ b/builtin-fsck.c
@@ -398,6 +398,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",
@@ -415,6 +417,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");
diff --git a/commit.c b/commit.c
index 6684c4e..94d5b3d 100644
--- a/commit.c
+++ b/commit.c
@@ -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();
diff --git a/commit.h b/commit.h
index 10e2b5d..3ad3dd9 100644
--- a/commit.h
+++ b/commit.h
@@ -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);
 
-- 
1.5.4.3.g3c5f
Previous: Martin KoeglerNext: Martin Koegler
Message 4 of 13 in “add generic, type aware object chain walker”
  1. 01/10 add generic, type aware object chain walkerMartin Koegler, Feb 25, 2008
  2. 02/10 builtin-fsck: move away from object-refs to fsck_walkMartin Koegler, Feb 25, 2008
  3. 03/10 Remove unused object-ref codeMartin Koegler, Feb 25, 2008
  4. 04/10 builtin-fsck: reports missing parent commitsMartin Koegler, Feb 25, 2008
  5. 05/10 builtin-fsck: move common object checking code to fsck.cMartin Koegler, Feb 25, 2008
  6. 06/10 add common fsck error printing functionMartin Koegler, Feb 25, 2008
  7. 07/10 unpack-object: cache for non written objectsMartin Koegler, Feb 25, 2008
  8. 08/10 unpack-objects: prevent writing of inconsistent objectsMartin Koegler, Feb 25, 2008
  9. 09/10 index-pack: introduce checking modeMartin Koegler, Feb 25, 2008
  10. 10/10 receive-pack: use strict mode for unpacking objectsMartin Koegler, Feb 25, 2008
  11. Junio C HamanoFeb 26, 2008
  12. Martin KoeglerFeb 26, 2008
  13. Junio C HamanoFeb 27, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.