diff --git a/Makefile b/Makefile index 2fea115919..e0a1308c09 100644 --- a/Makefile +++ b/Makefile @@ -301,8 +301,8 @@ LIB_OBJS = \ interpolate.o \ lockfile.o \ patch-ids.o \ - object.o pack-check.o patch-delta.o path.o pkt-line.o sideband.o \ - reachable.o reflog-walk.o \ + object.o pack-check.o pack-write.o patch-delta.o path.o pkt-line.o \ + sideband.o reachable.o reflog-walk.o \ quote.o read-cache.o refs.o run-command.o dir.o object-refs.o \ server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \ tag.o tree.o usage.o config.o environment.o ctype.o copy.o \ diff --git a/fast-import.c b/fast-import.c index b4cbcd9011..3a2d5ed8e6 100644 --- a/fast-import.c +++ b/fast-import.c @@ -651,42 +651,6 @@ static void start_packfile(void) all_packs[pack_id] = p; } -static void fixup_header_footer(void) -{ - static const int buf_sz = 128 * 1024; - int pack_fd = pack_data->pack_fd; - 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", pack_data->pack_name); - 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 (;;) { - ssize_t n = xread(pack_fd, buf, buf_sz); - if (!n) - break; - if (n < 0) - die("Failed to checksum %s", pack_data->pack_name); - SHA1_Update(&c, buf, n); - } - free(buf); - - SHA1_Final(pack_data->sha1, &c); - write_or_die(pack_fd, pack_data->sha1, sizeof(pack_data->sha1)); - close(pack_fd); -} - static int oecmp (const void *a_, const void *b_) { struct object_entry *a = *((struct object_entry**)a_); @@ -802,7 +766,9 @@ static void end_packfile(void) struct branch *b; struct tag *t; - fixup_header_footer(); + fixup_pack_header_footer(pack_data->pack_fd, pack_data->sha1, + pack_data->pack_name, object_count); + close(pack_data->pack_fd); idx_name = keep_pack(create_index()); /* Register the packfile with core git's machinary. */ diff --git a/pack-write.c b/pack-write.c new file mode 100644 index 0000000000..de72f44dc8 --- /dev/null +++ b/pack-write.c @@ -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); +} diff --git a/pack.h b/pack.h index d4d412ccbb..d667fb8d5a 100644 --- a/pack.h +++ b/pack.h @@ -44,6 +44,7 @@ struct pack_idx_header { extern int verify_pack(struct packed_git *, int); +extern void fixup_pack_header_footer(int, unsigned char *, const char *, uint32_t); #define PH_ERROR_EOF (-1) #define PH_ERROR_PACK_SIGNATURE (-2)