Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- read-cache.c | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/read-cache.c b/read-cache.c index db5147d088..4accd8bb08 100644 --- a/read-cache.c +++ b/read-cache.c @@ -1694,8 +1694,26 @@ static int verify_hdr(const struct cache_header *hdr, unsigned long size) } static int read_index_extension(struct index_state *istate, - const char *ext, const char *data, unsigned long sz) + const char *map, + unsigned long *offset) { + int ret = 0; + const char *ext = map + *offset; + uint32_t sz = get_be32(ext + 4); + const char *data = ext + 8; + + if (istate->jw) { + char buf[5]; + + memcpy(buf, ext, 4); + buf[4] = '\0'; + jw_object_inline_begin_object(istate->jw, buf); + + jw_object_intmax(istate->jw, "file_offset", *offset); + jw_object_intmax(istate->jw, "ext_size", sz); + } + *offset += sz + 8; + switch (CACHE_EXT(ext)) { case CACHE_EXT_TREE: istate->cache_tree = cache_tree_read(data, sz); @@ -1704,8 +1722,7 @@ static int read_index_extension(struct index_state *istate, istate->resolve_undo = resolve_undo_read(data, sz); break; case CACHE_EXT_LINK: - if (read_link_extension(istate, data, sz)) - return -1; + ret = read_link_extension(istate, data, sz); break; case CACHE_EXT_UNTRACKED: istate->untracked = read_untracked_extension(data, sz); @@ -1719,12 +1736,14 @@ static int read_index_extension(struct index_state *istate, break; default: if (*ext < 'A' || 'Z' < *ext) - return error(_("index uses %.4s extension, which we do not understand"), + ret = error(_("index uses %.4s extension, which we do not understand"), ext); - fprintf_ln(stderr, _("ignoring %.4s extension"), ext); + else + fprintf_ln(stderr, _("ignoring %.4s extension"), ext); break; } - return 0; + jw_end_gently(istate->jw); + return ret; } static struct cache_entry *create_from_disk(struct mem_pool *ce_mem_pool, @@ -1930,25 +1949,27 @@ static void *load_index_extensions(void *_data) { struct load_index_extensions *p = _data; unsigned long src_offset = p->src_offset; + int dump_json = 0; while (src_offset <= p->mmap_size - the_hash_algo->rawsz - 8) { - /* After an array of active_nr index entries, + if (p->istate->jw && !dump_json) { + jw_object_inline_begin_object(p->istate->jw, "extensions"); + dump_json = 1; + } + /* + * After an array of active_nr index entries, * there can be arbitrary number of extended * sections, each of which is prefixed with * extension name (4-byte) and section length * in 4-byte network byte order. */ - uint32_t extsize = get_be32(p->mmap + src_offset + 4); - if (read_index_extension(p->istate, - p->mmap + src_offset, - p->mmap + src_offset + 8, - extsize) < 0) { + if (read_index_extension(p->istate, p->mmap, &src_offset) < 0) { munmap((void *)p->mmap, p->mmap_size); die(_("index file corrupt")); } - src_offset += 8; - src_offset += extsize; } + if (dump_json) + jw_end(p->istate->jw); return NULL; } -- 2.22.0.rc0.322.g2b0371e29a