Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- builtin/index-pack.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 0dd7193..59b6c56 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -11,6 +11,7 @@ #include "exec_cmd.h" #include "streaming.h" #include "thread-utils.h" +#include "packv4-parse.h" static const char index_pack_usage[] = "git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])"; @@ -70,6 +71,8 @@ struct delta_entry { static struct object_entry *objects; static struct delta_entry *deltas; static struct thread_local nothread_data; +static unsigned char *sha1_table; +static struct packv4_dict *name_dict, *path_dict; static int nr_objects; static int nr_deltas; static int nr_resolved_deltas; @@ -81,6 +84,7 @@ static int do_fsck_object; static int verbose; static int show_stat; static int check_self_contained_and_connected; +static int packv4; static struct progress *progress; @@ -300,6 +304,21 @@ static uintmax_t read_varint(void) return val; } +static void *read_data(int size) +{ + const int max = sizeof(input_buffer); + void *buf; + char *p; + p = buf = xmalloc(size); + while (size) { + int to_fill = size > max ? max : size; + memcpy(p, fill_and_use(to_fill), to_fill); + p += to_fill; + size -= to_fill; + } + return buf; +} + static const char *open_pack_file(const char *pack_name) { if (from_stdin) { @@ -332,7 +351,9 @@ static void parse_pack_header(void) /* Header consistency check */ if (hdr->hdr_signature != htonl(PACK_SIGNATURE)) die(_("pack signature mismatch")); - if (!pack_version_ok(hdr->hdr_version)) + if (hdr->hdr_version == htonl(4)) + packv4 = 1; + else if (!pack_version_ok(hdr->hdr_version)) die(_("pack version %"PRIu32" unsupported"), ntohl(hdr->hdr_version)); @@ -1013,6 +1034,31 @@ static void *threaded_second_pass(void *data) } #endif +static struct packv4_dict *read_dict(void) +{ + unsigned long size; + unsigned char *data; + struct packv4_dict *dict; + + size = read_varint(); + data = xmallocz(size); + read_and_inflate(consumed_bytes, data, size, 0, NULL, NULL); + dict = pv4_create_dict(data, size); + if (!dict) + die("unable to parse dictionary"); + return dict; +} + +static void parse_dictionaries(void) +{ + if (!packv4) + return; + + sha1_table = read_data(20 * nr_objects); + name_dict = read_dict(); + path_dict = read_dict(); +} + /* * First pass: * - find locations of all objects; @@ -1651,6 +1697,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) parse_pack_header(); objects = xcalloc(nr_objects + 1, sizeof(struct object_entry)); deltas = xcalloc(nr_objects, sizeof(struct delta_entry)); + parse_dictionaries(); parse_pack_objects(pack_sha1); resolve_deltas(); conclude_pack(fix_thin_pack, curr_pack, pack_sha1); @@ -1661,6 +1708,9 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) if (show_stat) show_pack_info(stat_only); + if (packv4) + die("we're not there yet"); + idx_objects = xmalloc((nr_objects) * sizeof(struct pack_idx_entry *)); for (i = 0; i < nr_objects; i++) idx_objects[i] = &objects[i].idx; @@ -1677,6 +1727,15 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) free(objects); free(index_name_buf); free(keep_name_buf); + free(sha1_table); + if (name_dict) { + free((void*)name_dict->data); + free(name_dict); + } + if (path_dict) { + free((void*)path_dict->data); + free(path_dict); + } if (pack_name == NULL) free((void *) curr_pack); if (index_name == NULL) -- 1.8.2.83.gc99314b -- 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