mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
csum-file: store the hash algorithm as a struct field
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>
This commit is contained in:
committed by
Junio C Hamano
parent
d9213e4716
commit
48524fac64
20
csum-file.c
20
csum-file.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user