]> git.ipfire.org Git - thirdparty/git.git/commitdiff
csum-file: store the hash algorithm as a struct field
authorTaylor Blau <me@ttaylorr.com>
Thu, 23 Jan 2025 17:34:23 +0000 (12:34 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 23 Jan 2025 18:28:16 +0000 (10:28 -0800)
Throughout the hashfile API, we rely on a reference to 'the_hash_algo',
and call its _unsafe function variants directly.

Prepare for a future change where we may use a different 'git_hash_algo'
pointer (instead of just relying on 'the_hash_algo' throughout) by
making the 'git_hash_algo' pointer a member of the 'hashfile' structure
itself.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
csum-file.c
csum-file.h

index 5716016e12eec8c35f6495141fb2fcc250732803..b28cd047e3f4862bcd4d7483ebdc6c8d641a454f 100644 (file)
@@ -50,7 +50,7 @@ void hashflush(struct hashfile *f)
 
        if (offset) {
                if (!f->skip_hash)
-                       the_hash_algo->unsafe_update_fn(&f->ctx, f->buffer, offset);
+                       f->algop->unsafe_update_fn(&f->ctx, f->buffer, offset);
                flush(f, f->buffer, offset);
                f->offset = 0;
        }
@@ -71,14 +71,14 @@ int finalize_hashfile(struct hashfile *f, unsigned char *result,
        hashflush(f);
 
        if (f->skip_hash)
-               hashclr(f->buffer, the_repository->hash_algo);
+               hashclr(f->buffer, f->algop);
        else
-               the_hash_algo->unsafe_final_fn(f->buffer, &f->ctx);
+               f->algop->unsafe_final_fn(f->buffer, &f->ctx);
 
        if (result)
-               hashcpy(result, f->buffer, the_repository->hash_algo);
+               hashcpy(result, f->buffer, f->algop);
        if (flags & CSUM_HASH_IN_STREAM)
-               flush(f, f->buffer, the_hash_algo->rawsz);
+               flush(f, f->buffer, f->algop->rawsz);
        if (flags & CSUM_FSYNC)
                fsync_component_or_die(component, f->fd, f->name);
        if (flags & CSUM_CLOSE) {
@@ -128,7 +128,7 @@ void hashwrite(struct hashfile *f, const void *buf, unsigned int count)
                         * f->offset is necessarily zero.
                         */
                        if (!f->skip_hash)
-                               the_hash_algo->unsafe_update_fn(&f->ctx, buf, nr);
+                               f->algop->unsafe_update_fn(&f->ctx, buf, nr);
                        flush(f, buf, nr);
                } else {
                        /*
@@ -174,7 +174,9 @@ static struct hashfile *hashfd_internal(int fd, const char *name,
        f->name = name;
        f->do_crc = 0;
        f->skip_hash = 0;
-       the_hash_algo->unsafe_init_fn(&f->ctx);
+
+       f->algop = the_hash_algo;
+       f->algop->unsafe_init_fn(&f->ctx);
 
        f->buffer_len = buffer_len;
        f->buffer = xmalloc(buffer_len);
@@ -208,7 +210,7 @@ void hashfile_checkpoint(struct hashfile *f, struct hashfile_checkpoint *checkpo
 {
        hashflush(f);
        checkpoint->offset = f->total;
-       the_hash_algo->unsafe_clone_fn(&checkpoint->ctx, &f->ctx);
+       f->algop->unsafe_clone_fn(&checkpoint->ctx, &f->ctx);
 }
 
 int hashfile_truncate(struct hashfile *f, struct hashfile_checkpoint *checkpoint)
@@ -219,7 +221,7 @@ int hashfile_truncate(struct hashfile *f, struct hashfile_checkpoint *checkpoint
            lseek(f->fd, offset, SEEK_SET) != offset)
                return -1;
        f->total = offset;
-       the_hash_algo->unsafe_clone_fn(&f->ctx, &checkpoint->ctx);
+       f->algop->unsafe_clone_fn(&f->ctx, &checkpoint->ctx);
        f->offset = 0; /* hashflush() was called in checkpoint */
        return 0;
 }
index 7c73da0a40a9f342be766db4360eb2a236817c2b..2b45f4673a21f07d8827675197b1c655e703f9c9 100644 (file)
@@ -20,6 +20,7 @@ struct hashfile {
        size_t buffer_len;
        unsigned char *buffer;
        unsigned char *check_buffer;
+       const struct git_hash_algo *algop;
 
        /**
         * If non-zero, skip_hash indicates that we should