git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 7/9] commit-graph: stop using `the_hash_algo`

From
Patrick Steinhardt <ps@pks.im>
Date
Aug 4, 2025, 08:17 UTC
Message-ID
<20250804-b4-pks-commit-graph-wo-the-repository-v1-7-850d626eb2e8@pks.im>
In-Reply-To
<20250804-b4-pks-commit-graph-wo-the-repository-v1-0-850d626eb2e8@pks.im>

Stop using `the_hash_algo` as it implicitly relies on `the_repository`. Instead, we either use the hash algo provided via the context or, if there is no such hash algo, we use `the_repository` explicitly. Such uses will be removed in subsequent commits.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/commit-graph.c       |  3 ++-
 commit-graph.c               | 40 +++++++++++++++++++++-------------------
 commit-graph.h               |  4 +++-
 oss-fuzz/fuzz-commit-graph.c |  4 +++-
 4 files changed, 29 insertions(+), 22 deletions(-)
diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c
index 145802afb79..680b03a83a8 100644
--- a/builtin/commit-graph.c
+++ b/builtin/commit-graph.c
@@ -108,7 +108,8 @@ static int graph_verify(int argc, const char **argv, const char *prefix,
 		opened = OPENED_GRAPH;
 	else if (errno != ENOENT)
 		die_errno(_("Could not open commit-graph '%s'"), graph_name);
-	else if (open_commit_graph_chain(chain_name, &fd, &st))
+	else if (open_commit_graph_chain(chain_name, &fd, &st,
+					 the_repository->hash_algo))
 		opened = OPENED_CHAIN;
 	else if (errno != ENOENT)
 		die_errno(_("could not open commit-graph chain '%s'"), chain_name);
diff --git a/commit-graph.c b/commit-graph.c
index 9c2278dd7a1..b3feb6dfd77 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -263,7 +263,7 @@ struct commit_graph *load_commit_graph_one_fd_st(struct repository *r,
 
 	graph_size = xsize_t(st->st_size);
 
-	if (graph_size < graph_min_size(the_hash_algo)) {
+	if (graph_size < graph_min_size(r->hash_algo)) {
 		close(fd);
 		error(_("commit-graph file is too small"));
 		return NULL;
@@ -271,7 +271,7 @@ struct commit_graph *load_commit_graph_one_fd_st(struct repository *r,
 	graph_map = xmmap(NULL, graph_size, PROT_READ, MAP_PRIVATE, fd, 0);
 	close(fd);
 	prepare_repo_settings(r);
-	ret = parse_commit_graph(&r->settings, graph_map, graph_size);
+	ret = parse_commit_graph(&r->settings, r->hash_algo, graph_map, graph_size);
 
 	if (ret)
 		ret->odb_source = source;
@@ -319,7 +319,7 @@ static int graph_read_commit_data(const unsigned char *chunk_start,
 				  size_t chunk_size, void *data)
 {
 	struct commit_graph *g = data;
-	if (chunk_size / graph_data_width(the_hash_algo) != g->num_commits)
+	if (chunk_size / graph_data_width(g->hash_algo) != g->num_commits)
 		return error(_("commit-graph commit data chunk is wrong size"));
 	g->chunk_commit_data = chunk_start;
 	return 0;
@@ -373,6 +373,7 @@ static int graph_read_bloom_data(const unsigned char *chunk_start,
 }
 
 struct commit_graph *parse_commit_graph(struct repo_settings *s,
+					const struct git_hash_algo *hash_algo,
 					void *graph_map, size_t graph_size)
 {
 	const unsigned char *data;
@@ -384,7 +385,7 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
 	if (!graph_map)
 		return NULL;
 
-	if (graph_size < graph_min_size(the_hash_algo))
+	if (graph_size < graph_min_size(hash_algo))
 		return NULL;
 
 	data = (const unsigned char *)graph_map;
@@ -404,22 +405,22 @@ struct commit_graph *parse_commit_graph(struct repo_settings *s,
 	}
 
 	hash_version = *(unsigned char*)(data + 5);
-	if (hash_version != oid_version(the_hash_algo)) {
+	if (hash_version != oid_version(hash_algo)) {
 		error(_("commit-graph hash version %X does not match version %X"),
-		      hash_version, oid_version(the_hash_algo));
+		      hash_version, oid_version(hash_algo));
 		return NULL;
 	}
 
 	graph = alloc_commit_graph();
 
-	graph->hash_algo = the_hash_algo;
+	graph->hash_algo = hash_algo;
 	graph->num_chunks = *(unsigned char*)(data + 6);
 	graph->data = graph_map;
 	graph->data_len = graph_size;
 
 	if (graph_size < GRAPH_HEADER_SIZE +
 			 (graph->num_chunks + 1) * CHUNK_TOC_ENTRY_SIZE +
-			 GRAPH_FANOUT_SIZE + the_hash_algo->rawsz) {
+			 GRAPH_FANOUT_SIZE + hash_algo->rawsz) {
 		error(_("commit-graph file is too small to hold %u chunks"),
 		      graph->num_chunks);
 		free(graph);
@@ -618,7 +619,8 @@ static int add_graph_to_chain(struct commit_graph *g,
 }
 
 int open_commit_graph_chain(const char *chain_file,
-			    int *fd, struct stat *st)
+			    int *fd, struct stat *st,
+			    const struct git_hash_algo *hash_algo)
 {
 	*fd = git_open(chain_file);
 	if (*fd < 0)
@@ -627,7 +629,7 @@ 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) {
 		close(*fd);
 		if (!st->st_size) {
 			/* treat empty files the same as missing */
@@ -652,7 +654,7 @@ struct commit_graph *load_commit_graph_chain_fd_st(struct repository *r,
 	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);
 	CALLOC_ARRAY(oids, count);
 
 	odb_prepare_alternates(r->objects);
@@ -714,7 +716,7 @@ static struct commit_graph *load_commit_graph_chain(struct repository *r,
 	int fd;
 	struct commit_graph *g = NULL;
 
-	if (open_commit_graph_chain(chain_file, &fd, &st)) {
+	if (open_commit_graph_chain(chain_file, &fd, &st, r->hash_algo)) {
 		int incomplete;
 		/* ownership of fd is taken over by load function */
 		g = load_commit_graph_chain_fd_st(r, fd, &st, &incomplete);
@@ -906,7 +908,7 @@ static void fill_commit_graph_info(struct commit *item, struct commit_graph *g,
 		die(_("invalid commit position. commit-graph is likely corrupt"));
 
 	lex_index = pos - g->num_commits_in_base;
-	commit_data = g->chunk_commit_data + st_mult(graph_data_width(the_hash_algo), lex_index);
+	commit_data = g->chunk_commit_data + st_mult(graph_data_width(g->hash_algo), lex_index);
 
 	graph_data = commit_graph_data_at(item);
 	graph_data->graph_pos = pos;
@@ -1110,7 +1112,7 @@ static struct tree *load_tree_for_commit(struct repository *r,
 		g = g->base_graph;
 
 	commit_data = g->chunk_commit_data +
-			st_mult(graph_data_width(the_hash_algo),
+			st_mult(graph_data_width(g->hash_algo),
 				graph_pos - g->num_commits_in_base);
 
 	oidread(&oid, commit_data, the_repository->hash_algo);
@@ -1220,7 +1222,7 @@ static int write_graph_chunk_oids(struct hashfile *f,
 
 	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);
+		hashwrite(f, (*list)->object.oid.hash, f->algop->rawsz);
 	}
 
 	return 0;
@@ -1251,7 +1253,7 @@ static int write_graph_chunk_data(struct hashfile *f,
 			die(_("unable to parse commit %s"),
 				oid_to_hex(&(*list)->object.oid));
 		tree = get_commit_tree_oid(*list);
-		hashwrite(f, tree->hash, the_hash_algo->rawsz);
+		hashwrite(f, tree->hash, ctx->r->hash_algo->rawsz);
 
 		parent = (*list)->parents;
 
@@ -2033,7 +2035,7 @@ static size_t write_graph_chunk_base_1(struct hashfile *f,
 		return 0;
 
 	num = write_graph_chunk_base_1(f, g->base_graph);
-	hashwrite(f, g->oid.hash, the_hash_algo->rawsz);
+	hashwrite(f, g->oid.hash, g->hash_algo->rawsz);
 	return num + 1;
 }
 
@@ -2057,7 +2059,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 	struct hashfile *f;
 	struct tempfile *graph_layer; /* when ctx->split is non-zero */
 	struct lock_file lk = LOCK_INIT;
-	const unsigned hashsz = the_hash_algo->rawsz;
+	const unsigned hashsz = ctx->r->hash_algo->rawsz;
 	struct strbuf progress_title = STRBUF_INIT;
 	struct chunkfile *cf;
 	unsigned char file_hash[GIT_MAX_RAWSZ];
@@ -2145,7 +2147,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 	hashwrite_be32(f, GRAPH_SIGNATURE);
 
 	hashwrite_u8(f, GRAPH_VERSION);
-	hashwrite_u8(f, oid_version(the_hash_algo));
+	hashwrite_u8(f, oid_version(ctx->r->hash_algo));
 	hashwrite_u8(f, get_num_chunks(cf));
 	hashwrite_u8(f, ctx->num_commit_graphs_after - 1);
 
diff --git a/commit-graph.h b/commit-graph.h
index f20d28ff3a0..f26881849d6 100644
--- a/commit-graph.h
+++ b/commit-graph.h
@@ -32,7 +32,8 @@ struct string_list;
 char *get_commit_graph_filename(struct odb_source *source);
 char *get_commit_graph_chain_filename(struct odb_source *source);
 int open_commit_graph(const char *graph_file, int *fd, struct stat *st);
-int open_commit_graph_chain(const char *chain_file, int *fd, struct stat *st);
+int open_commit_graph_chain(const char *chain_file, int *fd, struct stat *st,
+			    const struct git_hash_algo *hash_algo);
 
 /*
  * Given a commit struct, try to fill the commit struct info, including:
@@ -129,6 +130,7 @@ struct repo_settings;
  * prior to calling parse_commit_graph().
  */
 struct commit_graph *parse_commit_graph(struct repo_settings *s,
+					const struct git_hash_algo *hash_algo,
 					void *graph_map, size_t graph_size);
 
 /*
diff --git a/oss-fuzz/fuzz-commit-graph.c b/oss-fuzz/fuzz-commit-graph.c
index fbb77fec197..879072f9d3c 100644
--- a/oss-fuzz/fuzz-commit-graph.c
+++ b/oss-fuzz/fuzz-commit-graph.c
@@ -5,6 +5,7 @@
 #include "repository.h"
 
 struct commit_graph *parse_commit_graph(struct repo_settings *s,
+					const struct git_hash_algo *hash_algo,
 					void *graph_map, size_t graph_size);
 
 int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
@@ -24,7 +25,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
 	repo_set_hash_algo(the_repository, GIT_HASH_SHA1);
 	the_repository->settings.commit_graph_generation_version = 2;
 	the_repository->settings.commit_graph_changed_paths_version = 1;
-	g = parse_commit_graph(&the_repository->settings, (void *)data, size);
+	g = parse_commit_graph(&the_repository->settings, the_repository->hash_algo,
+			       (void *)data, size);
 	repo_clear(the_repository);
 	free_commit_graph(g);
 
-- 
2.50.1.723.g3e08bea96f.dirty
Previous: Taylor BlauNext: Taylor Blau
Message 27 of 69 in “commit-graph: remove reliance on global state”
  1. 0/9 commit-graph: remove reliance on global statePatrick Steinhardt, Aug 4, 2025
  2. 1/9 trace2: introduce function to trace unsigned integersPatrick Steinhardt, Aug 4, 2025
  3. Taylor BlauAug 4, 2025
  4. 2/9 commit-graph: stop using signed integers to count bloom filtersPatrick Steinhardt, Aug 4, 2025
  5. Oswald BuddenhagenAug 4, 2025
  6. Patrick SteinhardtAug 4, 2025
  7. Junio C HamanoAug 4, 2025
  8. Taylor BlauAug 4, 2025
  9. Patrick SteinhardtAug 6, 2025
  10. Oswald BuddenhagenAug 6, 2025
  11. Junio C HamanoAug 6, 2025
  12. Junio C HamanoAug 6, 2025
  13. Patrick SteinhardtAug 7, 2025
  14. Junio C HamanoAug 7, 2025
  15. Patrick SteinhardtAug 11, 2025
  16. Junio C HamanoAug 5, 2025
  17. Taylor BlauAug 4, 2025
  18. 3/9 commit-graph: fix type for some write optionsPatrick Steinhardt, Aug 4, 2025
  19. Taylor BlauAug 4, 2025
  20. 4/9 commit-graph: fix sign comparison warningsPatrick Steinhardt, Aug 4, 2025
  21. Taylor BlauAug 4, 2025
  22. Patrick SteinhardtAug 6, 2025
  23. 5/9 commit-graph: stop using `the_hash_algo` via macrosPatrick Steinhardt, Aug 4, 2025
  24. Taylor BlauAug 4, 2025
  25. 6/9 commit-graph: store the hash algorithm instead of its lengthPatrick Steinhardt, Aug 4, 2025
  26. Taylor BlauAug 4, 2025
  27. 7/9 commit-graph: stop using `the_hash_algo`Patrick Steinhardt, Aug 4, 2025
  28. Taylor BlauAug 4, 2025
  29. Patrick SteinhardtAug 6, 2025
  30. 8/9 commit-graph: stop using `the_repository`Patrick Steinhardt, Aug 4, 2025
  31. Taylor BlauAug 4, 2025
  32. 9/9 commit-graph: stop passing in redundant repositoryPatrick Steinhardt, Aug 4, 2025
  33. Derrick StoleeAug 5, 2025
  34. Patrick SteinhardtAug 6, 2025
  35. 00/10 commit-graph: remove reliance on global statePatrick Steinhardt, Aug 6, 2025
  36. 01/10 trace2: introduce function to trace unsigned integersPatrick Steinhardt, Aug 6, 2025
  37. 02/10 commit-graph: stop using signed integers to count Bloom filtersPatrick Steinhardt, Aug 6, 2025
  38. 03/10 commit-graph: fix type for some write optionsPatrick Steinhardt, Aug 6, 2025
  39. Oswald BuddenhagenAug 6, 2025
  40. Junio C HamanoAug 6, 2025
  41. Patrick SteinhardtAug 7, 2025
  42. 04/10 commit-graph: fix sign comparison warningsPatrick Steinhardt, Aug 6, 2025
  43. 05/10 commit-graph: stop using `the_hash_algo` via macrosPatrick Steinhardt, Aug 6, 2025
  44. 06/10 commit-graph: store the hash algorithm instead of its lengthPatrick Steinhardt, Aug 6, 2025
  45. 07/10 commit-graph: refactor `parse_commit_graph()` to take a repositoryPatrick Steinhardt, Aug 6, 2025
  46. 08/10 commit-graph: stop using `the_hash_algo`Patrick Steinhardt, Aug 6, 2025
  47. 09/10 commit-graph: stop using `the_repository`Patrick Steinhardt, Aug 6, 2025
  48. 10/10 commit-graph: stop passing in redundant repositoryPatrick Steinhardt, Aug 6, 2025
  49. 00/10 commit-graph: remove reliance on global statePatrick Steinhardt, Aug 7, 2025
  50. 01/10 trace2: introduce function to trace unsigned integersPatrick Steinhardt, Aug 7, 2025
  51. 02/10 commit-graph: stop using signed integers to count Bloom filtersPatrick Steinhardt, Aug 7, 2025
  52. 03/10 commit-graph: fix type for some write optionsPatrick Steinhardt, Aug 7, 2025
  53. Junio C HamanoAug 7, 2025
  54. Patrick SteinhardtAug 11, 2025
  55. 04/10 commit-graph: fix sign comparison warningsPatrick Steinhardt, Aug 7, 2025
  56. 05/10 commit-graph: stop using `the_hash_algo` via macrosPatrick Steinhardt, Aug 7, 2025
  57. 06/10 commit-graph: store the hash algorithm instead of its lengthPatrick Steinhardt, Aug 7, 2025
  58. 07/10 commit-graph: refactor `parse_commit_graph()` to take a repositoryPatrick Steinhardt, Aug 7, 2025
  59. 08/10 commit-graph: stop using `the_hash_algo`Patrick Steinhardt, Aug 7, 2025
  60. 09/10 commit-graph: stop using `the_repository`Patrick Steinhardt, Aug 7, 2025
  61. 10/10 commit-graph: stop passing in redundant repositoryPatrick Steinhardt, Aug 7, 2025
  62. 0/6 commit-graph: remove reliance on global statePatrick Steinhardt, Aug 15, 2025
  63. 1/6 commit-graph: stop using `the_hash_algo` via macrosPatrick Steinhardt, Aug 15, 2025
  64. 2/6 commit-graph: store the hash algorithm instead of its lengthPatrick Steinhardt, Aug 15, 2025
  65. 3/6 commit-graph: refactor `parse_commit_graph()` to take a repositoryPatrick Steinhardt, Aug 15, 2025
  66. 4/6 commit-graph: stop using `the_hash_algo`Patrick Steinhardt, Aug 15, 2025
  67. 5/6 commit-graph: stop using `the_repository`Patrick Steinhardt, Aug 15, 2025
  68. 6/6 commit-graph: stop passing in redundant repositoryPatrick Steinhardt, Aug 15, 2025
  69. Derrick StoleeAug 15, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.