- pos = -pos-1;
-
- if (rel_allocs == nr_rels) {
- rel_allocs = alloc_nr(rel_allocs);
- rels = realloc(rels, rel_allocs * sizeof(struct relationship *));
- }
- n = malloc(sizeof(struct relationship));
-
- memmove(rels + pos + 1, rels + pos, (nr_rels - pos) * sizeof(struct relationship *));
- rels[pos] = n;
- nr_rels++;
- memcpy(n->sha1, sha1, 20);
- memcpy(n->parent, parent, 20);
- return 1;
-}
-
-static int already_seen(unsigned char *sha1)
-{
- static char null_sha[20];
- int pos = find_relationship(sha1, null_sha);
-
- if (pos < 0)
- pos = -pos-1;
- if (pos < nr_rels && !memcmp(sha1, rels[pos]->sha1, 20))
- return 1;
- return 0;
-}
-
-static int parse_commit(unsigned char *sha1)
-{
- if (!already_seen(sha1)) {
- void *buffer;
- unsigned long size;
- char type[20];
- unsigned char parent[20];
-
- 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(sha1, parent);
- parse_commit(parent);
- buffer += 48; /* "parent " + "hex sha1" + "\n" */