-static struct revision *add_relationship(struct revision *rev, unsigned char *needs)
-{
- struct revision *parent_rev = lookup_rev(needs);
- struct parent **pp = &rev->parent, *p;
-
- while ((p = *pp) != NULL) {
- if (p->parent == parent_rev)
- return parent_rev;
- pp = &p->next;
- }
-
- p = malloc(sizeof(*p));
- p->parent = parent_rev;
- p->next = NULL;
- *pp = p;
- return parent_rev;
-}
-
-static void mark_reachable(struct revision *rev)
-{
- struct parent *p = rev->parent;
-
- /* If we've been here already, don't bother */
- if (rev->flags & REACHABLE)
- return;
- rev->flags |= REACHABLE | USED;
- while (p) {
- mark_reachable(p->parent);
- p = p->next;
- }
-}
-
-static unsigned long parse_commit_date(const char *buf)
-{
- if (memcmp(buf, "author", 6))
- return 0;
- while (*buf++ != '\n')
- /* nada */;
- if (memcmp(buf, "committer", 9))
- return 0;
- while (*buf++ != '>')
- /* nada */;
-
- return strtoul(buf, NULL, 10);
-}
-
-static int parse_commit(unsigned char *sha1)
-{
- struct revision *rev = lookup_rev(sha1);
-
- if (!(rev->flags & SEEN)) {
- void *buffer, *bufptr;
- unsigned long size;
- char type[20];
- unsigned char parent[20];