git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 13/17] index-pack: encode appended trees using v4 format in pack v4

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Sep 21, 2013, 13:57 UTC
Message-ID
<1379771883-10278-14-git-send-email-pclouds@gmail.com>
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
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 15 of 25 in “np/pack-v4 updates”
  1. 00/17 np/pack-v4 updatesNguyễn Thái Ngọc Duy, Sep 21, 2013
  2. 01/17 fixup! index-pack: record all delta bases in v4 (tree and ref-delta)Nguyễn Thái Ngọc Duy, Sep 21, 2013
  3. 02/17 fixup! packv4-parse.c: add tree offset cachingNguyễn Thái Ngọc Duy, Sep 21, 2013
  4. 03/17 fixup! pack-objects: support writing pack v4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  5. 04/17 fixup! pack-objects: recognize v4 as pack sourceNguyễn Thái Ngọc Duy, Sep 21, 2013
  6. 05/17 fixup! index-pack: support completing thin packs v4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  7. 06/17 fixup! pack v4: move packv4-create.c to libgit.aNguyễn Thái Ngọc Duy, Sep 21, 2013
  8. 07/17 fixup! index-pack, pack-objects: allow creating .idx v2 with .pack v4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  9. Nicolas PitreSep 22, 2013
  10. 08/17 fixup! pack v4: code to obtain a SHA1 from a sha1refNguyễn Thái Ngọc Duy, Sep 21, 2013
  11. 09/17 fixup! pack-objects: add --version to specify written pack versionNguyễn Thái Ngọc Duy, Sep 21, 2013
  12. 10/17 test-lib.sh: add --packv4 for running the tests with pack v4 as defaultNguyễn Thái Ngọc Duy, Sep 21, 2013
  13. 11/17 packv4-parse: accept ref-delta as base of pv4-treeNguyễn Thái Ngọc Duy, Sep 21, 2013
  14. 12/17 pack-objects: do not add type OBJ_NONE to objects[] in pack v4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  15. 13/17 index-pack: encode appended trees using v4 format in pack v4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  16. 14/17 t5302: disable sealth corruption tests when run with --packv4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  17. Eric SunshineSep 22, 2013
  18. 15/17 t5300: avoid testing ofs-delta with --packv4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  19. Nicolas PitreSep 21, 2013
  20. Duy NguyenSep 22, 2013
  21. Nicolas PitreSep 22, 2013
  22. 16/17 pack-objects: disable pack size limit feature on pack v4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  23. 17/17 t5303: adapt the tests to run with --packv4Nguyễn Thái Ngọc Duy, Sep 21, 2013
  24. Nicolas PitreSep 21, 2013
  25. Junio C HamanoOct 15, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.