- struct revision *rev = lookup_rev(sha1);
-
- if (!(rev->flags & SEEN)) {
- void *buffer;
- unsigned long size;
- char type[20];
- unsigned char parent[20];
-
- rev->flags |= SEEN;
- buffer = read_sha1_file(sha1, type, &size);
- if (!buffer || strcmp(type, "commit"))
- return -1;
- buffer += 46; /* "tree " + "hex sha1" + "\n" */
- while (!memcmp(buffer, "parent ", 7) && !get_sha1_hex(buffer+7, parent)) {
- add_relationship(rev, parent);
- parse_commit(parent);
- buffer += 48; /* "parent " + "hex sha1" + "\n" */
- }
+ struct commit_list *parents;
+ struct commit *obj = lookup_commit(sha1);
+
+ if (obj && obj->object.parsed)
+ return;
+ if (!obj || parse_commit(obj))
+ die("unable to parse commit (%s)", sha1_to_hex(sha1));
+
+ parents = obj->parents;
+ while (parents) {
+ process_commit(parents->item->object.sha1);
+ parents = parents->next;