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 <nico@xxxxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html