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

[PATCH 12/17] pack-objects: do not add type OBJ_NONE to objects[] 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-13-git-send-email-pclouds@gmail.com>
In-Reply-To
<1379771883-10278-1-git-send-email-pclouds@gmail.com>

This is a longer explation of what is noted in the patch. When object names are received from stdin, we lazily put OBJ_NONE as type to objects[]. check_object() is called for each entry in objects[] later, when it checks for ref-delta and ofs-delta for straight copy to the pack later.

In pack v4, we don't store commits and trees as ref-delta and we need a way to know those are delta objects in pack v2 sources are actually commits or trees. We detect that with "type" field in struct object_entry, which is correctly filled when --revs is passed. Without --revs, the "type" field would be OBJ_NONE and we would need another sha1_object_info() or similar call to detect the true object type.

Because we need object type anyway in this code path for building up ident and path dictionaries, fill correct type as well.

Without this, the condition "pack_version < 4 || entry->type != OBJ_TREE" in check_object() is always true when --revs is not used, and we will encode trees as OBJ_REF_DELTA with the base either OBJ_TREE or OBJ_PV4_TREE. That kills pv4 tree format advantages.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 builtin/pack-objects.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 1e0c2e6..01954cb 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -1496,6 +1496,7 @@ static void check_object(struct object_entry *entry)
 			 */
 			if (pack_version < 4 || entry->type != OBJ_TREE)
 				entry->type = entry->in_pack_type;
+			assert(entry->type != OBJ_NONE);
 			entry->delta = base_entry;
 			entry->delta_size = entry->size;
 			entry->delta_sibling = base_entry->delta_child;
@@ -2361,7 +2362,6 @@ static void read_object_list_from_stdin(void)
 			die("expected sha1, got garbage:\n %s", line);
 
 		add_preferred_base_object(line+41);
-		add_object_entry(sha1, 0, line+41, 0);
 
 		if (pack_version == 4) {
 			void *data;
@@ -2370,7 +2370,17 @@ static void read_object_list_from_stdin(void)
 			int (*add_dict_entries)(struct dict_table *, void *, unsigned long);
 			struct dict_table *dict;
 
-			switch (sha1_object_info(sha1, &size)) {
+			type = sha1_object_info(sha1, &size);
+			/*
+			 * In v2, we can afford to keep entry->type ==
+			 * OBJ_NONE and check_object() will fill it
+			 * later. In v4, we need to know the type
+			 * right now, don't waste time looking for
+			 * type again later in check_object() when the
+			 * in-pack type is ref-delta.
+			 */
+			add_object_entry(sha1, type, line+41, 0);
+			switch (type) {
 			case OBJ_COMMIT:
 				add_dict_entries = add_commit_dict_entries;
 				dict = v4.commit_ident_table;
@@ -2389,7 +2399,8 @@ static void read_object_list_from_stdin(void)
 				die("can't process %s object %s",
 				    typename(type), sha1_to_hex(sha1));
 			free(data);
-		}
+		} else
+			add_object_entry(sha1, 0, line+41, 0);
 	}
 }
 
-- 
1.8.2.83.gc99314b
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 14 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.