- offset = unpack_object_header(p, e->offset, &kind, size);
- pack = (unsigned char *) p->pack_base + offset;
- if (kind != OBJ_DELTA)
- *delta_chain_length = 0;
- else {
- unsigned int chain_length = 0;
- if (p->pack_size <= offset + 20)
- die("pack file %s records an incomplete delta base",
- p->pack_name);
- hashcpy(base_sha1, pack);
- do {
- struct pack_entry base_ent;
- unsigned long junk;
-
- find_pack_entry_one(pack, &base_ent, p);
- offset = unpack_object_header(p, base_ent.offset,
- &kind, &junk);
- pack = (unsigned char *) p->pack_base + offset;
- chain_length++;
- } while (kind == OBJ_DELTA);
- *delta_chain_length = chain_length;
- }
- switch (kind) {
- case OBJ_COMMIT:
- case OBJ_TREE:
- case OBJ_BLOB:
- case OBJ_TAG:
- strcpy(type, type_names[kind]);
- break;
- default:
- die("corrupted pack file %s containing object of kind %d",
- p->pack_name, kind);
+ *delta_chain_length = 0;
+ offset = unpack_object_header(p, offset, &kind, size);
+
+ for (;;) {
+ switch (kind) {
+ default:
+ die("corrupted pack file %s containing object of kind %d",
+ p->pack_name, kind);
+ case OBJ_COMMIT:
+ case OBJ_TREE:
+ case OBJ_BLOB:
+ case OBJ_TAG:
+ strcpy(type, type_names[kind]);
+ *store_size = 0; /* notyet */
+ return;
+ case OBJ_DELTA:
+ if (p->pack_size <= offset + 20)
+ die("pack file %s records an incomplete delta base",
+ p->pack_name);
+ next_sha1 = (unsigned char *) p->pack_base + offset;
+ if (*delta_chain_length == 0)
+ hashcpy(base_sha1, next_sha1);
+ offset = find_pack_entry_one(next_sha1, p);
+ break;
+ }
+ offset = unpack_object_header(p, offset, &kind, &val);
+ (*delta_chain_length)++;