commit-graph: store the hash algorithm instead of its length

The commit-graph stores the length of the hash algorithm it uses. In subsequent commits we'll need to pass the whole hash algorithm around though, which we currently don't have access to. Refactor the code so that we store the hash algorithm instead of only its size. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Aug 15, 2025 at 07:49 UTC e45402bb199e869c223f575bf2f44db679d00279
2 files changed +19 -19
commit-graph.c
+18 -18
@@ -312,7 +312,7 @@ static int graph_read_oid_lookup(const unsigned char *chunk_start,
312 {
313 struct commit_graph *g = data;
314 g->chunk_oid_lookup = chunk_start;
315 - if (chunk_size / g->hash_len != g->num_commits)
315 + if (chunk_size / g->hash_algo->rawsz != g->num_commits)
316 return error(_("commit-graph OID lookup chunk is the wrong size"));
317 return 0;
318 }
@@ -414,7 +414,7 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
414
415 graph = alloc_commit_graph();
416
417 - graph->hash_len = the_hash_algo->rawsz;
417 + graph->hash_algo = the_hash_algo;
418 graph->num_chunks = *(unsigned char*)(data + 6);
419 graph->data = graph_map;
420 graph->data_len = graph_size;
@@ -479,7 +479,7 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
479 FREE_AND_NULL(graph->bloom_filter_settings);
480 }
481
482 - oidread(&graph->oid, graph->data + graph->data_len - graph->hash_len,
482 + oidread(&graph->oid, graph->data + graph->data_len - graph->hash_algo->rawsz,
483 the_repository->hash_algo);
484
485 free_chunkfile(cf);
@@ -585,7 +585,7 @@ static int add_graph_to_chain(struct commit_graph *g,
585 return 0;
586 }
587
588 - if (g->chunk_base_graphs_size / g->hash_len < n) {
588 + if (g->chunk_base_graphs_size / g->hash_algo->rawsz < n) {
589 warning(_("commit-graph base graphs chunk is too small"));
590 return 0;
591 }
@@ -595,7 +595,7 @@ static int add_graph_to_chain(struct commit_graph *g,
595
596 if (!cur_g ||
597 !oideq(&oids[n], &cur_g->oid) ||
598 - !hasheq(oids[n].hash, g->chunk_base_graphs + st_mult(g->hash_len, n),
598 + !hasheq(oids[n].hash, g->chunk_base_graphs + st_mult(g->hash_algo->rawsz, n),
599 the_repository->hash_algo)) {
600 warning(_("commit-graph chain does not match"));
601 return 0;
@@ -806,7 +806,7 @@ int generation_numbers_enabled(struct repository *r)
806 return 0;
807
808 first_generation = get_be32(g->chunk_commit_data +
809 - g->hash_len + 8) >> 2;
809 + g->hash_algo->rawsz + 8) >> 2;
810
811 return !!first_generation;
812 }
@@ -850,7 +850,7 @@ void close_commit_graph(struct object_database *o)
850 static int bsearch_graph(struct commit_graph *g, const struct object_id *oid, uint32_t *pos)
851 {
852 return bsearch_hash(oid->hash, g->chunk_oid_fanout,
853 - g->chunk_oid_lookup, g->hash_len, pos);
853 + g->chunk_oid_lookup, g->hash_algo->rawsz, pos);
854 }
855
856 static void load_oid_from_graph(struct commit_graph *g,
@@ -870,7 +870,7 @@ static void load_oid_from_graph(struct commit_graph *g,
870
871 lex_index = pos - g->num_commits_in_base;
872
873 - oidread(oid, g->chunk_oid_lookup + st_mult(g->hash_len, lex_index),
873 + oidread(oid, g->chunk_oid_lookup + st_mult(g->hash_algo->rawsz, lex_index),
874 the_repository->hash_algo);
875 }
876
@@ -912,8 +912,8 @@ static void fill_commit_graph_info(struct commit *item, struct commit_graph *g,
912 graph_data = commit_graph_data_at(item);
913 graph_data->graph_pos = pos;
914
915 - date_high = get_be32(commit_data + g->hash_len + 8) & 0x3;
916 - date_low = get_be32(commit_data + g->hash_len + 12);
915 + date_high = get_be32(commit_data + g->hash_algo->rawsz + 8) & 0x3;
916 + date_low = get_be32(commit_data + g->hash_algo->rawsz + 12);
917 item->date = (timestamp_t)((date_high << 32) | date_low);
918
919 if (g->read_generation_data) {
@@ -931,10 +931,10 @@ static void fill_commit_graph_info(struct commit *item, struct commit_graph *g,
931 } else
932 graph_data->generation = item->date + offset;
933 } else
934 - graph_data->generation = get_be32(commit_data + g->hash_len + 8) >> 2;
934 + graph_data->generation = get_be32(commit_data + g->hash_algo->rawsz + 8) >> 2;
935
936 if (g->topo_levels)
937 - *topo_level_slab_at(g->topo_levels, item) = get_be32(commit_data + g->hash_len + 8) >> 2;
937 + *topo_level_slab_at(g->topo_levels, item) = get_be32(commit_data + g->hash_algo->rawsz + 8) >> 2;
938 }
939
940 static inline void set_commit_tree(struct commit *c, struct tree *t)
@@ -958,7 +958,7 @@ static int fill_commit_in_graph(struct repository *r,
958 fill_commit_graph_info(item, g, pos);
959
960 lex_index = pos - g->num_commits_in_base;
961 - commit_data = g->chunk_commit_data + st_mult(g->hash_len + 16, lex_index);
961 + commit_data = g->chunk_commit_data + st_mult(g->hash_algo->rawsz + 16, lex_index);
962
963 item->object.parsed = 1;
964
@@ -966,12 +966,12 @@ static int fill_commit_in_graph(struct repository *r,
966
967 pptr = &item->parents;
968
969 - edge_value = get_be32(commit_data + g->hash_len);
969 + edge_value = get_be32(commit_data + g->hash_algo->rawsz);
970 if (edge_value == GRAPH_PARENT_NONE)
971 return 1;
972 pptr = insert_parent_or_die(r, g, edge_value, pptr);
973
974 - edge_value = get_be32(commit_data + g->hash_len + 4);
974 + edge_value = get_be32(commit_data + g->hash_algo->rawsz + 4);
975 if (edge_value == GRAPH_PARENT_NONE)
976 return 1;
977 if (!(edge_value & GRAPH_EXTRA_EDGES_NEEDED)) {
@@ -2624,7 +2624,7 @@ int write_commit_graph(struct odb_source *source,
2624 struct commit_graph *g = ctx.r->objects->commit_graph;
2625 for (i = 0; i < g->num_commits; i++) {
2626 struct object_id oid;
2627 - oidread(&oid, g->chunk_oid_lookup + st_mult(g->hash_len, i),
2627 + oidread(&oid, g->chunk_oid_lookup + st_mult(g->hash_algo->rawsz, i),
2628 the_repository->hash_algo);
2629 oid_array_append(&ctx.oids, &oid);
2630 }
@@ -2755,7 +2755,7 @@ static int verify_one_commit_graph(struct repository *r,
2755 for (i = 0; i < g->num_commits; i++) {
2756 struct commit *graph_commit;
2757
2758 - oidread(&cur_oid, g->chunk_oid_lookup + st_mult(g->hash_len, i),
2758 + oidread(&cur_oid, g->chunk_oid_lookup + st_mult(g->hash_algo->rawsz, i),
2759 the_repository->hash_algo);
2760
2761 if (i && oidcmp(&prev_oid, &cur_oid) >= 0)
@@ -2800,7 +2800,7 @@ static int verify_one_commit_graph(struct repository *r,
2800 timestamp_t generation;
2801
2802 display_progress(progress, ++(*seen));
2803 - oidread(&cur_oid, g->chunk_oid_lookup + st_mult(g->hash_len, i),
2803 + oidread(&cur_oid, g->chunk_oid_lookup + st_mult(g->hash_algo->rawsz, i),
2804 the_repository->hash_algo);
2805
2806 graph_commit = lookup_commit(r, &cur_oid);
commit-graph.h
+1 -1
@@ -84,7 +84,7 @@ struct commit_graph {
84 const unsigned char *data;
85 size_t data_len;
86
87 - unsigned char hash_len;
87 + const struct git_hash_algo *hash_algo;
88 unsigned char num_chunks;
89 uint32_t num_commits;
90 struct object_id oid;