Hi, this patch series is another step on our long road towards not having global state. In addition to that, as commit-graphs are part of the object database layer, this is also another step towards pluggable object databases. Changes in v2: - Use `unsigned` instead of `size_t` to count number of Bloom filters. - Use `uint32_t` instead of `size_t` for number of commit graphs, as this type is also used to iterate through this count already. - Refactor `parse_commit_graph()` to take a repository instead of both repo settings and a hash algo. - Link to v1: https://lore.kernel.org/r/20250804-b4-pks-commit-graph-wo-the-repository-v1-0-850d626eb2e8@xxxxxx Changes in v3: - Use `unsigned` for commit-graph options instead of `size_t`. - Link to v2: https://lore.kernel.org/r/20250806-b4-pks-commit-graph-wo-the-repository-v2-0-911bae638e61@xxxxxx Changes in v4: - Drop the patches that fix `-Wsign-compare` warnings. - Link to v3: https://lore.kernel.org/r/20250807-b4-pks-commit-graph-wo-the-repository-v3-0-82edef830a1e@xxxxxx Thanks! Patrick --- Patrick Steinhardt (6): commit-graph: stop using `the_hash_algo` via macros commit-graph: store the hash algorithm instead of its length commit-graph: refactor `parse_commit_graph()` to take a repository commit-graph: stop using `the_hash_algo` commit-graph: stop using `the_repository` commit-graph: stop passing in redundant repository builtin/commit-graph.c | 9 +- builtin/commit.c | 2 +- builtin/merge.c | 2 +- commit-graph.c | 283 +++++++++++++++++++++---------------------- commit-graph.h | 21 ++-- oss-fuzz/fuzz-commit-graph.c | 6 +- t/helper/test-read-graph.c | 2 +- 7 files changed, 157 insertions(+), 168 deletions(-) Range-diff versus v3: 1: 26daf74e02 < -: ---------- trace2: introduce function to trace unsigned integers 2: 646805924e < -: ---------- commit-graph: stop using signed integers to count Bloom filters 3: 01e38f39cf < -: ---------- commit-graph: fix type for some write options 4: a362f63472 < -: ---------- commit-graph: fix sign comparison warnings 5: 041d9c07a0 = 1: f7083b7e3b commit-graph: stop using `the_hash_algo` via macros 6: 6c1fa6be4f = 2: 336e35e93b commit-graph: store the hash algorithm instead of its length 7: ed04f7b787 = 3: 1446e1d66f commit-graph: refactor `parse_commit_graph()` to take a repository 8: 1eb6316e8d ! 4: 368e5ada3e commit-graph: stop using `the_hash_algo` @@ commit-graph.c: int open_commit_graph_chain(const char *chain_file, close(*fd); return 0; } -- if (st->st_size < (ssize_t) the_hash_algo->hexsz) { -+ if (st->st_size < (ssize_t) hash_algo->hexsz) { +- if (st->st_size < the_hash_algo->hexsz) { ++ if (st->st_size < hash_algo->hexsz) { close(*fd); if (!st->st_size) { /* treat empty files the same as missing */ @@ commit-graph.c: struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r, + int i = 0, valid = 1, count; FILE *fp = xfdopen(fd, "r"); - size_t count; - count = st->st_size / (the_hash_algo->hexsz + 1); + count = st->st_size / (r->hash_algo->hexsz + 1); @@ commit-graph.c: static struct tree *load_tree_for_commit(struct repository *r, oidread(&oid, commit_data, the_repository->hash_algo); @@ commit-graph.c: static int write_graph_chunk_oids(struct hashfile *f, - + int count; for (count = 0; count < ctx->commits.nr; count++, list++) { display_progress(ctx->progress, ++ctx->progress_cnt); - hashwrite(f, (*list)->object.oid.hash, the_hash_algo->rawsz); @@ commit-graph.c: static int write_graph_chunk_data(struct hashfile *f, parent = (*list)->parents; -@@ commit-graph.c: static size_t write_graph_chunk_base_1(struct hashfile *f, +@@ commit-graph.c: static int write_graph_chunk_base_1(struct hashfile *f, return 0; num = write_graph_chunk_base_1(f, g->base_graph); 9: 8d599f5a37 ! 5: a51cccec0d commit-graph: stop using `the_repository` @@ builtin/merge.c: int cmd_merge(int argc, ## commit-graph.c ## @@ -#define USE_THE_REPOSITORY_VARIABLE -- + #define DISABLE_SIGN_COMPARE_WARNINGS + #include "git-compat-util.h" - #include "config.h" - #include "csum-file.h" @@ #include "tree.h" #include "chunk-format.h" 10: 41ccdd6da1 ! 6: 841d280105 commit-graph: stop passing in redundant repository @@ commit-graph.c: int open_commit_graph_chain(const char *chain_file, int *incomplete_chain) { @@ commit-graph.c: struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r, + int i = 0, valid = 1, count; FILE *fp = xfdopen(fd, "r"); - size_t count; - count = st->st_size / (r->hash_algo->hexsz + 1); + count = st->st_size / (odb->repo->hash_algo->hexsz + 1); @@ commit-graph.c: struct commit_graph *load_commit_graph_chain_fd_st(struct reposi - odb_prepare_alternates(r->objects); + odb_prepare_alternates(odb); - for (size_t i = 0; i < count; i++) { + for (i = 0; i < count; i++) { struct odb_source *source; @@ commit-graph.c: struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r, if (strbuf_getline_lf(&line, fp) == EOF) --- base-commit: e813a0200a7121b97fec535f0d0b460b0a33356c change-id: 20250717-b4-pks-commit-graph-wo-the-repository-1dc2cacbc8e3