pack-write: pass hash_algo to fixup_pack_header_footer()
The `fixup_pack_header_footer()` function uses the global `the_hash_algo` variable to access the repository's hash function. To avoid global variable usage, pass a hash_algo from the layers above. Altough the layers above could have access to the hash_algo internally, simply pass in `the_hash_algo`. This avoids any compatibility issues and bubbles up global variable usage to upper layers which can be eventually resolved. Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
fbe8d3079d
commit
8244d01de6
@@ -878,9 +878,10 @@ static void end_packfile(void)
|
|||||||
|
|
||||||
close_pack_windows(pack_data);
|
close_pack_windows(pack_data);
|
||||||
finalize_hashfile(pack_file, cur_pack_oid.hash, FSYNC_COMPONENT_PACK, 0);
|
finalize_hashfile(pack_file, cur_pack_oid.hash, FSYNC_COMPONENT_PACK, 0);
|
||||||
fixup_pack_header_footer(pack_data->pack_fd, pack_data->hash,
|
fixup_pack_header_footer(the_hash_algo, pack_data->pack_fd,
|
||||||
pack_data->pack_name, object_count,
|
pack_data->hash, pack_data->pack_name,
|
||||||
cur_pack_oid.hash, pack_size);
|
object_count, cur_pack_oid.hash,
|
||||||
|
pack_size);
|
||||||
|
|
||||||
if (object_count <= unpack_limit) {
|
if (object_count <= unpack_limit) {
|
||||||
if (!loosen_small_pack(pack_data)) {
|
if (!loosen_small_pack(pack_data)) {
|
||||||
|
|||||||
@@ -1387,7 +1387,7 @@ static void conclude_pack(int fix_thin_pack, const char *curr_pack, unsigned cha
|
|||||||
strbuf_release(&msg);
|
strbuf_release(&msg);
|
||||||
finalize_hashfile(f, tail_hash, FSYNC_COMPONENT_PACK, 0);
|
finalize_hashfile(f, tail_hash, FSYNC_COMPONENT_PACK, 0);
|
||||||
hashcpy(read_hash, pack_hash, the_repository->hash_algo);
|
hashcpy(read_hash, pack_hash, the_repository->hash_algo);
|
||||||
fixup_pack_header_footer(output_fd, pack_hash,
|
fixup_pack_header_footer(the_hash_algo, output_fd, pack_hash,
|
||||||
curr_pack, nr_objects,
|
curr_pack, nr_objects,
|
||||||
read_hash, consumed_bytes-the_hash_algo->rawsz);
|
read_hash, consumed_bytes-the_hash_algo->rawsz);
|
||||||
if (!hasheq(read_hash, tail_hash, the_repository->hash_algo))
|
if (!hasheq(read_hash, tail_hash, the_repository->hash_algo))
|
||||||
|
|||||||
@@ -1318,8 +1318,9 @@ static void write_pack_file(void)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int fd = finalize_hashfile(f, hash, FSYNC_COMPONENT_PACK, 0);
|
int fd = finalize_hashfile(f, hash, FSYNC_COMPONENT_PACK, 0);
|
||||||
fixup_pack_header_footer(fd, hash, pack_tmp_name,
|
fixup_pack_header_footer(the_hash_algo, fd, hash,
|
||||||
nr_written, hash, offset);
|
pack_tmp_name, nr_written,
|
||||||
|
hash, offset);
|
||||||
close(fd);
|
close(fd);
|
||||||
if (write_bitmap_index) {
|
if (write_bitmap_index) {
|
||||||
if (write_bitmap_index != WRITE_BITMAP_QUIET)
|
if (write_bitmap_index != WRITE_BITMAP_QUIET)
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state)
|
|||||||
CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
|
CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
|
||||||
} else {
|
} else {
|
||||||
int fd = finalize_hashfile(state->f, hash, FSYNC_COMPONENT_PACK, 0);
|
int fd = finalize_hashfile(state->f, hash, FSYNC_COMPONENT_PACK, 0);
|
||||||
fixup_pack_header_footer(fd, hash, state->pack_tmp_name,
|
fixup_pack_header_footer(the_hash_algo, fd, hash, state->pack_tmp_name,
|
||||||
state->nr_written, hash,
|
state->nr_written, hash,
|
||||||
state->offset);
|
state->offset);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|||||||
28
pack-write.c
28
pack-write.c
@@ -380,7 +380,8 @@ off_t write_pack_header(struct hashfile *f, uint32_t nr_entries)
|
|||||||
* partial_pack_sha1 can refer to the same buffer if the caller is not
|
* partial_pack_sha1 can refer to the same buffer if the caller is not
|
||||||
* interested in the resulting SHA1 of pack data above partial_pack_offset.
|
* interested in the resulting SHA1 of pack data above partial_pack_offset.
|
||||||
*/
|
*/
|
||||||
void fixup_pack_header_footer(int pack_fd,
|
void fixup_pack_header_footer(const struct git_hash_algo *hash_algo,
|
||||||
|
int pack_fd,
|
||||||
unsigned char *new_pack_hash,
|
unsigned char *new_pack_hash,
|
||||||
const char *pack_name,
|
const char *pack_name,
|
||||||
uint32_t object_count,
|
uint32_t object_count,
|
||||||
@@ -393,8 +394,8 @@ void fixup_pack_header_footer(int pack_fd,
|
|||||||
char *buf;
|
char *buf;
|
||||||
ssize_t read_result;
|
ssize_t read_result;
|
||||||
|
|
||||||
the_hash_algo->init_fn(&old_hash_ctx);
|
hash_algo->init_fn(&old_hash_ctx);
|
||||||
the_hash_algo->init_fn(&new_hash_ctx);
|
hash_algo->init_fn(&new_hash_ctx);
|
||||||
|
|
||||||
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
||||||
die_errno("Failed seeking to start of '%s'", pack_name);
|
die_errno("Failed seeking to start of '%s'", pack_name);
|
||||||
@@ -406,9 +407,9 @@ void fixup_pack_header_footer(int pack_fd,
|
|||||||
pack_name);
|
pack_name);
|
||||||
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
||||||
die_errno("Failed seeking to start of '%s'", pack_name);
|
die_errno("Failed seeking to start of '%s'", pack_name);
|
||||||
the_hash_algo->update_fn(&old_hash_ctx, &hdr, sizeof(hdr));
|
hash_algo->update_fn(&old_hash_ctx, &hdr, sizeof(hdr));
|
||||||
hdr.hdr_entries = htonl(object_count);
|
hdr.hdr_entries = htonl(object_count);
|
||||||
the_hash_algo->update_fn(&new_hash_ctx, &hdr, sizeof(hdr));
|
hash_algo->update_fn(&new_hash_ctx, &hdr, sizeof(hdr));
|
||||||
write_or_die(pack_fd, &hdr, sizeof(hdr));
|
write_or_die(pack_fd, &hdr, sizeof(hdr));
|
||||||
partial_pack_offset -= sizeof(hdr);
|
partial_pack_offset -= sizeof(hdr);
|
||||||
|
|
||||||
@@ -423,7 +424,7 @@ void fixup_pack_header_footer(int pack_fd,
|
|||||||
break;
|
break;
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
die_errno("Failed to checksum '%s'", pack_name);
|
die_errno("Failed to checksum '%s'", pack_name);
|
||||||
the_hash_algo->update_fn(&new_hash_ctx, buf, n);
|
hash_algo->update_fn(&new_hash_ctx, buf, n);
|
||||||
|
|
||||||
aligned_sz -= n;
|
aligned_sz -= n;
|
||||||
if (!aligned_sz)
|
if (!aligned_sz)
|
||||||
@@ -432,13 +433,12 @@ void fixup_pack_header_footer(int pack_fd,
|
|||||||
if (!partial_pack_hash)
|
if (!partial_pack_hash)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
the_hash_algo->update_fn(&old_hash_ctx, buf, n);
|
hash_algo->update_fn(&old_hash_ctx, buf, n);
|
||||||
partial_pack_offset -= n;
|
partial_pack_offset -= n;
|
||||||
if (partial_pack_offset == 0) {
|
if (partial_pack_offset == 0) {
|
||||||
unsigned char hash[GIT_MAX_RAWSZ];
|
unsigned char hash[GIT_MAX_RAWSZ];
|
||||||
the_hash_algo->final_fn(hash, &old_hash_ctx);
|
hash_algo->final_fn(hash, &old_hash_ctx);
|
||||||
if (!hasheq(hash, partial_pack_hash,
|
if (!hasheq(hash, partial_pack_hash, hash_algo))
|
||||||
the_repository->hash_algo))
|
|
||||||
die("Unexpected checksum for %s "
|
die("Unexpected checksum for %s "
|
||||||
"(disk corruption?)", pack_name);
|
"(disk corruption?)", pack_name);
|
||||||
/*
|
/*
|
||||||
@@ -446,7 +446,7 @@ void fixup_pack_header_footer(int pack_fd,
|
|||||||
* pack, which also means making partial_pack_offset
|
* pack, which also means making partial_pack_offset
|
||||||
* big enough not to matter anymore.
|
* big enough not to matter anymore.
|
||||||
*/
|
*/
|
||||||
the_hash_algo->init_fn(&old_hash_ctx);
|
hash_algo->init_fn(&old_hash_ctx);
|
||||||
partial_pack_offset = ~partial_pack_offset;
|
partial_pack_offset = ~partial_pack_offset;
|
||||||
partial_pack_offset -= MSB(partial_pack_offset, 1);
|
partial_pack_offset -= MSB(partial_pack_offset, 1);
|
||||||
}
|
}
|
||||||
@@ -454,9 +454,9 @@ void fixup_pack_header_footer(int pack_fd,
|
|||||||
free(buf);
|
free(buf);
|
||||||
|
|
||||||
if (partial_pack_hash)
|
if (partial_pack_hash)
|
||||||
the_hash_algo->final_fn(partial_pack_hash, &old_hash_ctx);
|
hash_algo->final_fn(partial_pack_hash, &old_hash_ctx);
|
||||||
the_hash_algo->final_fn(new_pack_hash, &new_hash_ctx);
|
hash_algo->final_fn(new_pack_hash, &new_hash_ctx);
|
||||||
write_or_die(pack_fd, new_pack_hash, the_hash_algo->rawsz);
|
write_or_die(pack_fd, new_pack_hash, hash_algo->rawsz);
|
||||||
fsync_component_or_die(FSYNC_COMPONENT_PACK, pack_fd, pack_name);
|
fsync_component_or_die(FSYNC_COMPONENT_PACK, pack_fd, pack_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4
pack.h
4
pack.h
@@ -91,7 +91,9 @@ int check_pack_crc(struct packed_git *p, struct pack_window **w_curs, off_t offs
|
|||||||
int verify_pack_index(struct packed_git *);
|
int verify_pack_index(struct packed_git *);
|
||||||
int verify_pack(struct repository *, struct packed_git *, verify_fn fn, struct progress *, uint32_t);
|
int verify_pack(struct repository *, struct packed_git *, verify_fn fn, struct progress *, uint32_t);
|
||||||
off_t write_pack_header(struct hashfile *f, uint32_t);
|
off_t write_pack_header(struct hashfile *f, uint32_t);
|
||||||
void fixup_pack_header_footer(int, unsigned char *, const char *, uint32_t, unsigned char *, off_t);
|
void fixup_pack_header_footer(const struct git_hash_algo *, int,
|
||||||
|
unsigned char *, const char *, uint32_t,
|
||||||
|
unsigned char *, off_t);
|
||||||
char *index_pack_lockfile(int fd, int *is_well_formed);
|
char *index_pack_lockfile(int fd, int *is_well_formed);
|
||||||
|
|
||||||
struct ref;
|
struct ref;
|
||||||
|
|||||||
Reference in New Issue
Block a user