commit-graph: read only from specific pack-indexes
[gitweb.git] / commit-graph.c
index f745186e7f5ebaaea7852e7c6bfa3a275762c343..70472840a3bfb99fb0e1c63978f49d464df1fdb1 100644 (file)
@@ -549,7 +549,9 @@ static void close_reachable(struct packed_oid_list *oids)
        }
 }
 
-void write_commit_graph(const char *obj_dir)
+void write_commit_graph(const char *obj_dir,
+                       const char **pack_indexes,
+                       int nr_packs)
 {
        struct packed_oid_list oids;
        struct packed_commit_list commits;
@@ -571,7 +573,27 @@ void write_commit_graph(const char *obj_dir)
                oids.alloc = 1024;
        ALLOC_ARRAY(oids.list, oids.alloc);
 
-       for_each_packed_object(add_packed_commits, &oids, 0);
+       if (pack_indexes) {
+               struct strbuf packname = STRBUF_INIT;
+               int dirlen;
+               strbuf_addf(&packname, "%s/pack/", obj_dir);
+               dirlen = packname.len;
+               for (i = 0; i < nr_packs; i++) {
+                       struct packed_git *p;
+                       strbuf_setlen(&packname, dirlen);
+                       strbuf_addstr(&packname, pack_indexes[i]);
+                       p = add_packed_git(packname.buf, packname.len, 1);
+                       if (!p)
+                               die("error adding pack %s", packname.buf);
+                       if (open_pack_index(p))
+                               die("error opening index for %s", packname.buf);
+                       for_each_object_in_pack(p, add_packed_commits, &oids);
+                       close_pack(p);
+               }
+               strbuf_release(&packname);
+       } else
+               for_each_packed_object(add_packed_commits, &oids, 0);
+
        close_reachable(&oids);
 
        QSORT(oids.list, oids.nr, commit_compare);