Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
---
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html