Create pack-write.c for common pack writing code
authorDana L. How <danahow@gmail.com>
Wed, 2 May 2007 16:13:14 +0000 (12:13 -0400)
committerShawn O. Pearce <spearce@spearce.org>
Wed, 2 May 2007 17:24:18 +0000 (13:24 -0400)
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>
Makefile
fast-import.c
pack-write.c [new file with mode: 0644]
pack.h

index 2fea115..e0a1308 100644 (file)
--- 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 \
index b4cbcd9..3a2d5ed 100644 (file)
@@ -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 (file)
index 0000000..de72f44
--- /dev/null
@@ -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 d4d412c..d667fb8 100644 (file)
--- 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)