[PATCH 36/38] pack v4: get tree objects
From: Nicolas Pitre <nico@fluxnic.net>
Date: 2016-06-15 22:58:38
Subsystem:
the rest · Maintainer:
Linus Torvalds
Signed-off-by: Nicolas Pitre <nico@fluxnic.net> --- packv4-parse.c | 25 +++++++++++++++++++++++++ packv4-parse.h | 2 ++ sha1_file.c | 2 +- 3 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/packv4-parse.c b/packv4-parse.c
index 04eab46..4c218d2 100644
--- a/packv4-parse.c
+++ b/packv4-parse.c@@ -365,3 +365,28 @@ static int decode_entries(struct packed_git *p, struct pack_window **w_curs, return 0; } + +void *pv4_get_tree(struct packed_git *p, struct pack_window **w_curs, + off_t offset, unsigned long size) +{ + unsigned long avail; + unsigned int nb_entries; + unsigned char *dst, *dcp; + const unsigned char *src, *scp; + int ret; + + src = use_pack(p, w_curs, offset, &avail); + scp = src; + nb_entries = decode_varint(&scp); + if (scp == src) + return NULL; + + dst = xmallocz(size); + dcp = dst; + ret = decode_entries(p, w_curs, offset, 0, nb_entries, &dcp, &size, 0); + if (ret < 0 || size != 0) { + free(dst); + return NULL; + } + return dst; +}
diff --git a/packv4-parse.h b/packv4-parse.h
index 40aa75a..5f9d809 100644
--- a/packv4-parse.h
+++ b/packv4-parse.h@@ -3,5 +3,7 @@ void *pv4_get_commit(struct packed_git *p, struct pack_window **w_curs, off_t offset, unsigned long size); +void *pv4_get_tree(struct packed_git *p, struct pack_window **w_curs, + off_t offset, unsigned long size); #endif
diff --git a/sha1_file.c b/sha1_file.c
index b57d9f8..79e1293 100644
--- a/sha1_file.c
+++ b/sha1_file.c@@ -2177,7 +2177,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset, if (type == OBJ_COMMIT) { data = pv4_get_commit(p, &w_curs, curpos, size); } else { - die("no pack v4 tree parsing yet"); + data = pv4_get_tree(p, &w_curs, curpos, size); } break; }
--
1.8.4.38.g317e65b