Browse Source
Include a generalized fixup_pack_header_footer() in this new file. Needed by git-repack --max-pack-size feature in a later patchset. [sp: Moved close(pack_fd) to callers, to support index-pack, and changed name to better indicate it is for packfiles.] Signed-off-by: Dana L. How <danahow@gmail.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>maint
Dana L. How
18 years ago
committed by
Shawn O. Pearce
4 changed files with 45 additions and 39 deletions
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
#include "cache.h" |
||||
#include "pack.h" |
||||
|
||||
void fixup_pack_header_footer(int pack_fd, |
||||
unsigned char *pack_file_sha1, |
||||
const char *pack_name, |
||||
uint32_t object_count) |
||||
{ |
||||
static const int buf_sz = 128 * 1024; |
||||
SHA_CTX c; |
||||
struct pack_header hdr; |
||||
char *buf; |
||||
|
||||
if (lseek(pack_fd, 0, SEEK_SET) != 0) |
||||
die("Failed seeking to start: %s", strerror(errno)); |
||||
if (read_in_full(pack_fd, &hdr, sizeof(hdr)) != sizeof(hdr)) |
||||
die("Unable to reread header of %s: %s", pack_name, strerror(errno)); |
||||
if (lseek(pack_fd, 0, SEEK_SET) != 0) |
||||
die("Failed seeking to start: %s", strerror(errno)); |
||||
hdr.hdr_entries = htonl(object_count); |
||||
write_or_die(pack_fd, &hdr, sizeof(hdr)); |
||||
|
||||
SHA1_Init(&c); |
||||
SHA1_Update(&c, &hdr, sizeof(hdr)); |
||||
|
||||
buf = xmalloc(buf_sz); |
||||
for (;;) { |
||||
size_t n = xread(pack_fd, buf, buf_sz); |
||||
if (!n) |
||||
break; |
||||
if (n < 0) |
||||
die("Failed to checksum %s: %s", pack_name, strerror(errno)); |
||||
SHA1_Update(&c, buf, n); |
||||
} |
||||
free(buf); |
||||
|
||||
SHA1_Final(pack_file_sha1, &c); |
||||
write_or_die(pack_fd, pack_file_sha1, 20); |
||||
} |
Loading…
Reference in new issue