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

[PATCH v2 10/13] commit-graph: don't store file hashes as struct object_id

From
brian m. carlson <sandals@crustytoothpaste.net>
Date
Apr 26, 2021, 01:02 UTC
Message-ID
<20210426010301.1093562-11-sandals@crustytoothpaste.net>
In-Reply-To
<20210426010301.1093562-1-sandals@crustytoothpaste.net>

The idea behind struct object_id is that it is supposed to represent the identifier of a standard Git object or a special pseudo-object like the all-zeros object ID. In this case, we have file hashes, which, while similar, are distinct from the identifiers of objects.

Switch these code paths to use an unsigned char array. This is both more logically consistent and it means that we need not set the algorithm identifier for the struct object_id.

Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
---
 commit-graph.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/commit-graph.c b/commit-graph.c
index 23fef56d31..2bcb4e0f89 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -1793,8 +1793,8 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 	struct lock_file lk = LOCK_INIT;
 	const unsigned hashsz = the_hash_algo->rawsz;
 	struct strbuf progress_title = STRBUF_INIT;
-	struct object_id file_hash;
 	struct chunkfile *cf;
+	unsigned char file_hash[GIT_MAX_RAWSZ];
 
 	if (ctx->split) {
 		struct strbuf tmp_file = STRBUF_INIT;
@@ -1909,7 +1909,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 	}
 
 	close_commit_graph(ctx->r->objects);
-	finalize_hashfile(f, file_hash.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
+	finalize_hashfile(f, file_hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC);
 	free_chunkfile(cf);
 
 	if (ctx->split) {
@@ -1945,7 +1945,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 			unlink(graph_name);
 		}
 
-		ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1] = xstrdup(oid_to_hex(&file_hash));
+		ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1] = xstrdup(hash_to_hex(file_hash));
 		final_graph_name = get_split_graph_filename(ctx->odb,
 					ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1]);
 		ctx->commit_graph_filenames_after[ctx->num_commit_graphs_after - 1] = final_graph_name;
@@ -2425,7 +2425,8 @@ static void graph_report(const char *fmt, ...)
 int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
 {
 	uint32_t i, cur_fanout_pos = 0;
-	struct object_id prev_oid, cur_oid, checksum;
+	struct object_id prev_oid, cur_oid;
+	unsigned char checksum[GIT_MAX_HEXSZ];
 	int generation_zero = 0;
 	struct hashfile *f;
 	int devnull;
@@ -2444,8 +2445,8 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
 	devnull = open("/dev/null", O_WRONLY);
 	f = hashfd(devnull, NULL);
 	hashwrite(f, g->data, g->data_len - g->hash_len);
-	finalize_hashfile(f, checksum.hash, CSUM_CLOSE);
-	if (!hasheq(checksum.hash, g->data + g->data_len - g->hash_len)) {
+	finalize_hashfile(f, checksum, CSUM_CLOSE);
+	if (!hasheq(checksum, g->data + g->data_len - g->hash_len)) {
 		graph_report(_("the commit-graph file has incorrect checksum and is likely corrupt"));
 		verify_commit_graph_error = VERIFY_COMMIT_GRAPH_ERROR_HASH;
 	}
Previous: brian m. carlsonNext: brian m. carlson
Message 9 of 16 in “SHA-256 / SHA-1 interop, part 1”
  1. 00/13 SHA-256 / SHA-1 interop, part 1brian m. carlson, Apr 26, 2021
  2. 01/13 hash: add an algo member to struct object_idbrian m. carlson, Apr 26, 2021
  3. Matheus Tavares BernardinoMay 7, 2021
  4. brian m. carlsonMay 7, 2021
  5. 03/13 http-push: set algorithm when reading object IDbrian m. carlson, Apr 26, 2021
  6. 06/13 builtin/pack-redundant: avoid casting buffers to struct object_idbrian m. carlson, Apr 26, 2021
  7. 02/13 Always use oidread to read into struct object_idbrian m. carlson, Apr 26, 2021
  8. 07/13 hash: set, copy, and use algo field in struct object_idbrian m. carlson, Apr 26, 2021
  9. 10/13 commit-graph: don't store file hashes as struct object_idbrian m. carlson, Apr 26, 2021
  10. 11/13 builtin/pack-objects: avoid using struct object_id for pack hashbrian m. carlson, Apr 26, 2021
  11. 13/13 hex: print objects using the hash algorithm memberbrian m. carlson, Apr 26, 2021
  12. 04/13 hash: add a function to finalize object IDsbrian m. carlson, Apr 26, 2021
  13. 05/13 Use the final_oid_fn to finalize hashing of object IDsbrian m. carlson, Apr 26, 2021
  14. 08/13 hash: provide per-algorithm null OIDsbrian m. carlson, Apr 26, 2021
  15. 09/13 builtin/show-index: set the algorithm for object IDsbrian m. carlson, Apr 26, 2021
  16. 12/13 hex: default to the_hash_algo on zero algorithm valuebrian m. carlson, Apr 26, 2021

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.