Here's the code to dump a table into a pack.  Table entries are written
according to the current sort order. This is important as objects use
this order to index into the table.

Signed-off-by: Nicolas Pitre <n...@fluxnic.net>
---
 packv4-create.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/packv4-create.c b/packv4-create.c
index f46fbd9..2956fda 100644
--- a/packv4-create.c
+++ b/packv4-create.c
@@ -556,6 +556,55 @@ static int create_pack_dictionaries(struct packed_git *p,
        return 0;
 }
 
+static unsigned long write_dict_table(struct sha1file *f, struct dict_table *t)
+{
+       unsigned char buffer[1024], *end;
+       unsigned hdrlen;
+       unsigned long size, datalen;
+       z_stream stream;
+       int i, status;
+
+       /*
+        * Stored dict table format: uncompressed data length followed by
+        * compressed content.
+        */
+
+       datalen = t->ptr;
+       end = add_number(buffer, datalen);
+       hdrlen = end - buffer;
+       sha1write(f, buffer, hdrlen);
+
+       memset(&stream, 0, sizeof(stream));
+       deflateInit(&stream, pack_compression_level);
+
+       for (i = 0; i < t->nb_entries; i++) {
+               stream.next_in = t->data + t->entry[i].offset;
+               stream.avail_in = 2 + strlen((char *)t->data + 
t->entry[i].offset + 2) + 1;
+               do {
+                       stream.next_out = (unsigned char *)buffer;
+                       stream.avail_out = sizeof(buffer);
+                       status = deflate(&stream, 0);
+                       size = stream.next_out - (unsigned char *)buffer;
+                       sha1write(f, buffer, size);
+               } while (status == Z_OK);
+       }
+       do {
+               stream.next_out = (unsigned char *)buffer;
+               stream.avail_out = sizeof(buffer);
+               status = deflate(&stream, Z_FINISH);
+               size = stream.next_out - (unsigned char *)buffer;
+               sha1write(f, buffer, size);
+       } while (status == Z_OK);
+       if (status != Z_STREAM_END)
+               die("unable to deflate dictionary table (%d)", status);
+       if (stream.total_in != datalen)
+               die("dict data size mismatch (%ld vs %ld)",
+                   stream.total_in, datalen);
+       deflateEnd(&stream);
+
+       return hdrlen + datalen;
+}
+
 static struct packed_git *open_pack(const char *path)
 {
        char arg[PATH_MAX];
-- 
1.8.4.22.g54757b7

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to