[PATCH v4 0/6] commit-graph: remove reliance on global state
- From
Patrick Steinhardt <ps@pks.im>
- Date
- Aug 15, 2025, 05:49 UTC
- Message-ID
- <20250815-b4-pks-commit-graph-wo-the-repository-v4-0-b6b651178cce@pks.im>
- In-Reply-To
- <20250804-b4-pks-commit-graph-wo-the-repository-v1-0-850d626eb2e8@pks.im>
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@pks.imChanges 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@pks.im
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@pks.im
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 repositorybuiltin/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