diff options
author | Nicolas Pitre <nico@cam.org> | 2008-07-16 10:31:38 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-07-16 20:33:28 +0400 |
commit | 3339e9f686bd4c17e3575c71327c4ccf1e8e077b (patch) | |
tree | 7905b69c7b53b30bdb8350670377f65d62ed79c0 | |
parent | 852f96b816ea8967e799a35b91ea4e941cd0d2ae (diff) |
pack-objects: learn about pack index version 2
This is the reading part only. No creation of index v2 is provided.
(extracted from commit c553ca25bd60dc9fd50b8bc7bd329601b81cee66)
Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin-pack-objects.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index b9c3da2cd1..5198563afc 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -172,13 +172,33 @@ static void prepare_pack_revindex(struct pack_revindex *rix) int i; const char *index = p->index_data; - index += 4 * 256; rix->revindex = xmalloc(sizeof(*rix->revindex) * (num_ent + 1)); - for (i = 0; i < num_ent; i++) { - uint32_t hl = *((uint32_t *)(index + 24 * i)); - rix->revindex[i].offset = ntohl(hl); - rix->revindex[i].nr = i; + index += 4 * 256; + + if (p->index_version > 1) { + const uint32_t *off_32 = + (uint32_t *)(index + 8 + p->num_objects * (20 + 4)); + const uint32_t *off_64 = off_32 + p->num_objects; + for (i = 0; i < num_ent; i++) { + uint32_t off = ntohl(*off_32++); + if (!(off & 0x80000000)) { + rix->revindex[i].offset = off; + } else { + rix->revindex[i].offset = + ((uint64_t)ntohl(*off_64++)) << 32; + rix->revindex[i].offset |= + ntohl(*off_64++); + } + rix->revindex[i].nr = i; + } + } else { + for (i = 0; i < num_ent; i++) { + uint32_t hl = *((uint32_t *)(index + 24 * i)); + rix->revindex[i].offset = ntohl(hl); + rix->revindex[i].nr = i; + } } + /* This knows the pack format -- the 20-byte trailer * follows immediately after the last object data. */ |