[PATCH 29/38] pack v4: code to retrieve a name
From: Nicolas Pitre <nico@fluxnic.net>
Date: 2016-06-15 22:58:38
Subsystem:
the rest · Maintainer:
Linus Torvalds
The name dictionary is loaded if not already done. We know it is located right after the SHA1 table (20 bytes per object) which is itself right after the 12-byte header. Then the index is parsed from the input buffer and a pointer to the corresponding entry is returned. Signed-off-by: Nicolas Pitre <nico@fluxnic.net> --- cache.h | 3 +++ packv4-parse.c | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+)
diff --git a/cache.h b/cache.h
index 59d9ba7..6ce327e 100644
--- a/cache.h
+++ b/cache.h@@ -1015,6 +1015,8 @@ struct pack_window { unsigned int inuse_cnt; }; +struct packv4_dict; + extern struct packed_git { struct packed_git *next; struct pack_window *windows;
@@ -1027,6 +1029,7 @@ extern struct packed_git { unsigned char *bad_object_sha1; int version; int index_version; + struct packv4_dict *name_dict; time_t mtime; int pack_fd; unsigned pack_local:1,
diff --git a/packv4-parse.c b/packv4-parse.c
index 26894bc..074e107 100644
--- a/packv4-parse.c
+++ b/packv4-parse.c@@ -105,3 +105,27 @@ static struct packv4_dict *load_dict(struct packed_git *p, off_t *offset) *offset = curpos; return dict; } + +static void load_name_dict(struct packed_git *p) +{ + off_t offset = 12 + p->num_objects * 20; + struct packv4_dict *names = load_dict(p, &offset); + if (!names) + die("bad pack name dictionary in %s", p->pack_name); + p->name_dict = names; +} + +const unsigned char *get_nameref(struct packed_git *p, const unsigned char **srcp) +{ + unsigned int index; + + if (!p->name_dict) + load_name_dict(p); + + index = decode_varint(srcp); + if (index >= p->name_dict->nb_entries) { + error("%s: index overflow", __func__); + return NULL; + } + return p->name_dict->data + p->name_dict->offsets[index]; +}
--
1.8.4.38.g317e65b