]> git.ipfire.org Git - thirdparty/git.git/commitdiff
commit-graph: don't store file hashes as struct object_id
authorbrian m. carlson <sandals@crustytoothpaste.net>
Mon, 26 Apr 2021 01:02:58 +0000 (01:02 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 27 Apr 2021 07:31:39 +0000 (16:31 +0900)
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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
commit-graph.c

index 23fef56d3112dc5701754fbea5fe821ba3100a96..2bcb4e0f89e839f7666a3c2cd85522ebcb9c596d 100644 (file)
@@ -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;
        }