commit-graph: convert to using the_hash_algo
Instead of using hard-coded constants for object sizes, use the_hash_algo to look them up. In addition, use a function call to look up the object ID version and produce the correct value. For now, we use version 1, which means to use the default algorithm used in the rest of the repository. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
brian m. carlson committed
Nov 14, 2018 at 04:09 UTC
c166599862d10a273f61b834559eaa567c3dbfd9
1 file changed
+17
-16
commit-graph.c
+17
-16
@@ -20,16 +20,11 @@
20
#define GRAPH_CHUNKID_DATA 0x43444154 /* "CDAT" */
21
#define GRAPH_CHUNKID_LARGEEDGES 0x45444745 /* "EDGE" */
22
23
-#define GRAPH_DATA_WIDTH 36
23
+#define GRAPH_DATA_WIDTH (the_hash_algo->rawsz + 16)
24
25
#define GRAPH_VERSION_1 0x1
26
#define GRAPH_VERSION GRAPH_VERSION_1
27
28
-#define GRAPH_OID_VERSION_SHA1 1
29
-#define GRAPH_OID_LEN_SHA1 GIT_SHA1_RAWSZ
30
-#define GRAPH_OID_VERSION GRAPH_OID_VERSION_SHA1
31
-#define GRAPH_OID_LEN GRAPH_OID_LEN_SHA1
32
-
28
#define GRAPH_OCTOPUS_EDGES_NEEDED 0x80000000
29
#define GRAPH_PARENT_MISSING 0x7fffffff
30
#define GRAPH_EDGE_LAST_MASK 0x7fffffff
@@ -41,13 +36,18 @@
36
#define GRAPH_FANOUT_SIZE (4 * 256)
37
#define GRAPH_CHUNKLOOKUP_WIDTH 12
38
#define GRAPH_MIN_SIZE (GRAPH_HEADER_SIZE + 4 * GRAPH_CHUNKLOOKUP_WIDTH \
44
- + GRAPH_FANOUT_SIZE + GRAPH_OID_LEN)
39
+ + GRAPH_FANOUT_SIZE + the_hash_algo->rawsz)
40
41
char *get_commit_graph_filename(const char *obj_dir)
42
{
43
return xstrfmt("%s/info/commit-graph", obj_dir);
44
}
45
46
+static uint8_t oid_version(void)
47
+{
48
+ return 1;
49
+}
50
+
51
static struct commit_graph *alloc_commit_graph(void)
52
{
53
struct commit_graph *g = xcalloc(1, sizeof(*g));
@@ -100,15 +100,15 @@ struct commit_graph *load_commit_graph_one(const char *graph_file)
100
}
101
102
hash_version = *(unsigned char*)(data + 5);
103
- if (hash_version != GRAPH_OID_VERSION) {
103
+ if (hash_version != oid_version()) {
104
error(_("hash version %X does not match version %X"),
105
- hash_version, GRAPH_OID_VERSION);
105
+ hash_version, oid_version());
106
goto cleanup_fail;
107
}
108
109
graph = alloc_commit_graph();
110
111
- graph->hash_len = GRAPH_OID_LEN;
111
+ graph->hash_len = the_hash_algo->rawsz;
112
graph->num_chunks = *(unsigned char*)(data + 6);
113
graph->graph_fd = fd;
114
graph->data = graph_map;
@@ -124,7 +124,7 @@ struct commit_graph *load_commit_graph_one(const char *graph_file)
124
125
chunk_lookup += GRAPH_CHUNKLOOKUP_WIDTH;
126
127
- if (chunk_offset > graph_size - GIT_MAX_RAWSZ) {
127
+ if (chunk_offset > graph_size - the_hash_algo->rawsz) {
128
error(_("improper chunk offset %08x%08x"), (uint32_t)(chunk_offset >> 32),
129
(uint32_t)chunk_offset);
130
goto cleanup_fail;
@@ -711,6 +711,7 @@ void write_commit_graph(const char *obj_dir,
711
int num_chunks;
712
int num_extra_edges;
713
struct commit_list *parent;
714
+ const unsigned hashsz = the_hash_algo->rawsz;
715
716
oids.nr = 0;
717
oids.alloc = approximate_object_count() / 4;
@@ -831,7 +832,7 @@ void write_commit_graph(const char *obj_dir,
832
hashwrite_be32(f, GRAPH_SIGNATURE);
833
834
hashwrite_u8(f, GRAPH_VERSION);
834
- hashwrite_u8(f, GRAPH_OID_VERSION);
835
+ hashwrite_u8(f, oid_version());
836
hashwrite_u8(f, num_chunks);
837
hashwrite_u8(f, 0); /* unused padding byte */
838
@@ -846,8 +847,8 @@ void write_commit_graph(const char *obj_dir,
847
848
chunk_offsets[0] = 8 + (num_chunks + 1) * GRAPH_CHUNKLOOKUP_WIDTH;
849
chunk_offsets[1] = chunk_offsets[0] + GRAPH_FANOUT_SIZE;
849
- chunk_offsets[2] = chunk_offsets[1] + GRAPH_OID_LEN * commits.nr;
850
- chunk_offsets[3] = chunk_offsets[2] + (GRAPH_OID_LEN + 16) * commits.nr;
850
+ chunk_offsets[2] = chunk_offsets[1] + hashsz * commits.nr;
851
+ chunk_offsets[3] = chunk_offsets[2] + (hashsz + 16) * commits.nr;
852
chunk_offsets[4] = chunk_offsets[3] + 4 * num_extra_edges;
853
854
for (i = 0; i <= num_chunks; i++) {
@@ -860,8 +861,8 @@ void write_commit_graph(const char *obj_dir,
861
}
862
863
write_graph_chunk_fanout(f, commits.list, commits.nr);
863
- write_graph_chunk_oids(f, GRAPH_OID_LEN, commits.list, commits.nr);
864
- write_graph_chunk_data(f, GRAPH_OID_LEN, commits.list, commits.nr);
864
+ write_graph_chunk_oids(f, hashsz, commits.list, commits.nr);
865
+ write_graph_chunk_data(f, hashsz, commits.list, commits.nr);
866
write_graph_chunk_large_edges(f, commits.list, commits.nr);
867
868
close_commit_graph();