[PATCH] Switch implementations of merge-base, port to parsing
[gitweb.git] / revision.h
index 4f140ca611236bdc4dd32c436616cafe7ef02249..f965f3fc5f66827759223dc9caf63d9abf40ae15 100644 (file)
@@ -97,18 +97,62 @@ static struct revision *add_relationship(struct revision *rev, unsigned char *ne
        return parent_rev;
 }
 
-static void mark_reachable(struct revision *rev)
+static void mark_reachable(struct revision *rev, unsigned int mask)
 {
        struct parent *p = rev->parent;
 
        /* If we've been here already, don't bother */
-       if (rev->flags & REACHABLE)
+       if (rev->flags & mask)
                return;
-       rev->flags |= REACHABLE | USED;
+       rev->flags |= mask | USED;
        while (p) {
-               mark_reachable(p->parent);
+               mark_reachable(p->parent, mask);
                p = p->next;
        }
 }
 
+static unsigned long parse_commit_date(const char *buf)
+{
+       unsigned long date;
+
+       if (memcmp(buf, "author", 6))
+               return 0;
+       while (*buf++ != '\n')
+               /* nada */;
+       if (memcmp(buf, "committer", 9))
+               return 0;
+       while (*buf++ != '>')
+               /* nada */;
+       date = strtoul(buf, NULL, 10);
+       if (date == ULONG_MAX)
+               date = 0;
+       return date;
+}
+
+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];
+
+               rev->flags |= SEEN;
+               buffer = bufptr = read_sha1_file(sha1, type, &size);
+               if (!buffer || strcmp(type, "commit"))
+                       return -1;
+               bufptr += 46; /* "tree " + "hex sha1" + "\n" */
+               while (!memcmp(bufptr, "parent ", 7) && !get_sha1_hex(bufptr+7, parent)) {
+                       add_relationship(rev, parent);
+                       parse_commit(parent);
+                       bufptr += 48;   /* "parent " + "hex sha1" + "\n" */
+               }
+               rev->date = parse_commit_date(bufptr);
+               free(buffer);
+       }
+       return 0;       
+}
+
 #endif /* REVISION_H */