midx: mark bad packed objects

When an object fails to decompress from a pack-file, we mark the object as 'bad' so we can retry with a different copy of the object (if such a copy exists). Before now, the multi-pack-index did not update the bad objects list for the pack-files it contains, and we did not check the bad objects list when reading an object. Now, do both. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Aug 20, 2018 at 16:51 UTC c39b02ae0ae90b9fda353f87502ace9ba36db839
1 file changed +10
midx.c
+10
@@ -280,6 +280,16 @@ static int nth_midxed_pack_entry(struct multi_pack_index *m, struct pack_entry *
280 if (!is_pack_valid(p))
281 return 0;
282
283 + if (p->num_bad_objects) {
284 + uint32_t i;
285 + struct object_id oid;
286 + nth_midxed_object_oid(&oid, m, pos);
287 + for (i = 0; i < p->num_bad_objects; i++)
288 + if (!hashcmp(oid.hash,
289 + p->bad_object_sha1 + the_hash_algo->rawsz * i))
290 + return 0;
291 + }
292 +
293 e->offset = nth_midxed_offset(m, pos);
294 e->p = p;
295