t4008: abstract away SHA-1-specific constants
[gitweb.git] / commit-graph.c
index 70472840a3bfb99fb0e1c63978f49d464df1fdb1..3fc1e0da2768d3f209da08b6b4c71df133a3ec88 100644 (file)
@@ -9,6 +9,7 @@
 #include "revision.h"
 #include "sha1-lookup.h"
 #include "commit-graph.h"
+#include "object-store.h"
 
 #define GRAPH_SIGNATURE 0x43475048 /* "CGPH" */
 #define GRAPH_CHUNKID_OIDFANOUT 0x4f494446 /* "OIDF" */
@@ -206,8 +207,10 @@ static void prepare_commit_graph(void)
 
        obj_dir = get_object_directory();
        prepare_commit_graph_one(obj_dir);
-       prepare_alt_odb();
-       for (alt = alt_odb_list; !commit_graph && alt; alt = alt->next)
+       prepare_alt_odb(the_repository);
+       for (alt = the_repository->objects->alt_odb_list;
+            !commit_graph && alt;
+            alt = alt->next)
                prepare_commit_graph_one(alt->path);
 }
 
@@ -551,7 +554,10 @@ static void close_reachable(struct packed_oid_list *oids)
 
 void write_commit_graph(const char *obj_dir,
                        const char **pack_indexes,
-                       int nr_packs)
+                       int nr_packs,
+                       const char **commit_hex,
+                       int nr_commits,
+                       int append)
 {
        struct packed_oid_list oids;
        struct packed_commit_list commits;
@@ -569,10 +575,24 @@ void write_commit_graph(const char *obj_dir,
        oids.nr = 0;
        oids.alloc = approximate_object_count() / 4;
 
+       if (append) {
+               prepare_commit_graph_one(obj_dir);
+               if (commit_graph)
+                       oids.alloc += commit_graph->num_commits;
+       }
+
        if (oids.alloc < 1024)
                oids.alloc = 1024;
        ALLOC_ARRAY(oids.list, oids.alloc);
 
+       if (append && commit_graph) {
+               for (i = 0; i < commit_graph->num_commits; i++) {
+                       const unsigned char *hash = commit_graph->chunk_oid_lookup +
+                               commit_graph->hash_len * i;
+                       hashcpy(oids.list[oids.nr++].hash, hash);
+               }
+       }
+
        if (pack_indexes) {
                struct strbuf packname = STRBUF_INIT;
                int dirlen;
@@ -591,7 +611,28 @@ void write_commit_graph(const char *obj_dir,
                        close_pack(p);
                }
                strbuf_release(&packname);
-       } else
+       }
+
+       if (commit_hex) {
+               for (i = 0; i < nr_commits; i++) {
+                       const char *end;
+                       struct object_id oid;
+                       struct commit *result;
+
+                       if (commit_hex[i] && parse_oid_hex(commit_hex[i], &oid, &end))
+                               continue;
+
+                       result = lookup_commit_reference_gently(&oid, 1);
+
+                       if (result) {
+                               ALLOC_GROW(oids.list, oids.nr + 1, oids.alloc);
+                               oidcpy(&oids.list[oids.nr], &(result->object.oid));
+                               oids.nr++;
+                       }
+               }
+       }
+
+       if (!pack_indexes && !commit_hex)
                for_each_packed_object(add_packed_commits, &oids, 0);
 
        close_reachable(&oids);