From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: Nicolas Pitre <nico@fluxnic.net>
Cc: git@vger.kernel.org, "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 13/17] index-pack: encode appended trees using v4 format in pack v4
Date: Sat, 21 Sep 2013 20:57:59 +0700 [thread overview]
Message-ID: <1379771883-10278-14-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1379771883-10278-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
builtin/index-pack.c | 43 ++++++++++++++++++++++++++++++++++++++++---
packv4-create.c | 20 ++++++++++++++++++++
packv4-create.h | 2 ++
3 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index db885b1..caec388 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -12,6 +12,7 @@
#include "streaming.h"
#include "thread-utils.h"
#include "packv4-parse.h"
+#include "packv4-create.h"
#include "varint.h"
#include "tree-walk.h"
@@ -76,6 +77,7 @@ 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 struct packv4_tables pv4_tables;
static int nr_objects;
static int nr_deltas;
static int nr_resolved_deltas;
@@ -1717,18 +1719,48 @@ static int write_compressed(struct sha1file *f, void *in, unsigned int size)
return size;
}
+static void initialize_packv4_tables(void)
+{
+ static int initialized;
+ int i, nr = nr_objects_final;
+ if (initialized)
+ return;
+ pv4_tables.commit_ident_table = pv4_dict_to_dict_table(name_dict);
+ pv4_tables.tree_path_table = pv4_dict_to_dict_table(path_dict);
+ pv4_tables.all_objs_nr = nr;
+ pv4_tables.all_objs = xmalloc(nr * sizeof(struct pack_idx_entry));
+ /* for pv4_encode_tree() pv4_tables[].offset is not needed */
+ for (i = 0; i < nr; i++)
+ hashcpy(pv4_tables.all_objs[i].sha1, sha1_table + i * 20);
+ initialized = 1;
+}
+
static struct object_entry *append_obj_to_pack(struct sha1file *f,
const unsigned char *sha1, void *buf,
unsigned long size, enum object_type type)
{
struct object_entry *obj = &objects[nr_objects++];
+ void *v4_data = NULL;
unsigned char header[10];
+ unsigned long v4_size;
+ enum object_type real_type = type;
int n;
if (packv4) {
if (nr_objects > nr_objects_final)
die(_("too many objects"));
- /* TODO: convert OBJ_TREE to OBJ_PV4_TREE using pv4_encode_tree */
+
+ if (type == OBJ_TREE) {
+ initialize_packv4_tables();
+ v4_size = size;
+ v4_data = pv4_encode_tree(&pv4_tables, buf, &v4_size,
+ NULL, 0, NULL);
+ if (v4_data)
+ type = OBJ_PV4_TREE;
+ }
+
+ /* TODO: convert OBJ_COMMIT to OBJ_PV4_COMMIT using pv4_encode_commit */
+
n = pv4_encode_object_header(type, size, header);
} else
n = encode_in_pack_object_header(type, size, header);
@@ -1737,12 +1769,17 @@ static struct object_entry *append_obj_to_pack(struct sha1file *f,
obj[0].size = size;
obj[0].hdr_size = n;
obj[0].type = type;
- obj[0].real_type = type;
+ obj[0].real_type = real_type;
obj[1].idx.offset = obj[0].idx.offset + n;
- obj[1].idx.offset += write_compressed(f, buf, size);
+ if (type != real_type) { /* must be v4 representation */
+ sha1write(f, v4_data, v4_size);
+ obj[1].idx.offset += v4_size;
+ } else
+ obj[1].idx.offset += write_compressed(f, buf, size);
obj[0].idx.crc32 = crc32_end(f);
sha1flush(f);
hashcpy(obj->idx.sha1, sha1);
+ free(v4_data);
return obj;
}
diff --git a/packv4-create.c b/packv4-create.c
index 3acd10f..14be867 100644
--- a/packv4-create.c
+++ b/packv4-create.c
@@ -15,6 +15,7 @@
#include "pack-revindex.h"
#include "progress.h"
#include "varint.h"
+#include "packv4-parse.h"
#include "packv4-create.h"
@@ -144,6 +145,25 @@ void sort_dict_entries_by_hits(struct dict_table *t)
rehash_entries(t);
}
+struct dict_table *pv4_dict_to_dict_table(struct packv4_dict *pv4dict)
+{
+ struct dict_table *dict;
+ int i;
+
+ dict = create_dict_table();
+ for (i = 0; i < pv4dict->nb_entries; i++) {
+ const unsigned char *mode_bytes;
+ const char *str;
+ int mode, str_len;
+ mode_bytes = pv4dict->data + pv4dict->offsets[i];
+ mode = (mode_bytes[0] << 8) | mode_bytes[1];
+ str = (const char *)mode_bytes + 2;
+ str_len = pv4dict->offsets[i+1] - pv4dict->offsets[i] - 2;
+ str_len--; /* for NUL, dict_add_entry will add one back */
+ dict_add_entry(dict, mode, str, str_len);
+ }
+ return dict;
+}
/*
* Parse the author/committer line from a canonical commit object.
* The 'from' argument points right after the "author " or "committer "
diff --git a/packv4-create.h b/packv4-create.h
index 4ac4d71..e0d4b1f 100644
--- a/packv4-create.h
+++ b/packv4-create.h
@@ -8,11 +8,13 @@ struct packv4_tables {
struct dict_table *tree_path_table;
};
+struct packv4_dict;
struct dict_table;
struct sha1file;
struct dict_table *create_dict_table(void);
int dict_add_entry(struct dict_table *t, int val, const char *str, int str_len);
+struct dict_table *pv4_dict_to_dict_table(struct packv4_dict *dict);
void destroy_dict_table(struct dict_table *t);
void dict_dump(struct packv4_tables *v4);
--
1.8.2.83.gc99314b
next prev parent reply other threads:[~2013-09-21 13:56 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-21 13:57 [PATCH 00/17] np/pack-v4 updates Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 01/17] fixup! index-pack: record all delta bases in v4 (tree and ref-delta) Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 02/17] fixup! packv4-parse.c: add tree offset caching Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 03/17] fixup! pack-objects: support writing pack v4 Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 04/17] fixup! pack-objects: recognize v4 as pack source Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 05/17] fixup! index-pack: support completing thin packs v4 Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 06/17] fixup! pack v4: move packv4-create.c to libgit.a Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 07/17] fixup! index-pack, pack-objects: allow creating .idx v2 with .pack v4 Nguyễn Thái Ngọc Duy
2013-09-22 1:39 ` Nicolas Pitre
2013-09-21 13:57 ` [PATCH 08/17] fixup! pack v4: code to obtain a SHA1 from a sha1ref Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 09/17] fixup! pack-objects: add --version to specify written pack version Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 10/17] test-lib.sh: add --packv4 for running the tests with pack v4 as default Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 11/17] packv4-parse: accept ref-delta as base of pv4-tree Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` [PATCH 12/17] pack-objects: do not add type OBJ_NONE to objects[] in pack v4 Nguyễn Thái Ngọc Duy
2013-09-21 13:57 ` Nguyễn Thái Ngọc Duy [this message]
2013-09-21 13:58 ` [PATCH 14/17] t5302: disable sealth corruption tests when run with --packv4 Nguyễn Thái Ngọc Duy
2013-09-22 2:13 ` Eric Sunshine
2013-09-21 13:58 ` [PATCH 15/17] t5300: avoid testing ofs-delta " Nguyễn Thái Ngọc Duy
2013-09-21 16:46 ` Nicolas Pitre
2013-09-22 1:48 ` Duy Nguyen
2013-09-22 2:13 ` Nicolas Pitre
2013-09-21 13:58 ` [PATCH 16/17] pack-objects: disable pack size limit feature on pack v4 Nguyễn Thái Ngọc Duy
2013-09-21 13:58 ` [PATCH 17/17] t5303: adapt the tests to run with --packv4 Nguyễn Thái Ngọc Duy
2013-09-21 16:07 ` [PATCH 00/17] np/pack-v4 updates Nicolas Pitre
2013-10-15 21:45 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1379771883-10278-14-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=nico@fluxnic.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.