verify_packfile(): check as many object as possible in a pack

verify_packfile() checks for whole pack integerity first, then each
object individually. Once we get past whole pack check, we can
identify all objects in the pack. If there's an error with one object,
we should continue to check the next objects to salvage as many
objects as possible instead of stopping the process.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2011-11-07 09:59:24 +07:00 committed by Junio C Hamano
parent a3ed7552d6
commit 473935188c

View File

@ -113,18 +113,13 @@ static int verify_packfile(struct packed_git *p,
p->pack_name, (uintmax_t)offset); p->pack_name, (uintmax_t)offset);
} }
data = unpack_entry(p, entries[i].offset, &type, &size); data = unpack_entry(p, entries[i].offset, &type, &size);
if (!data) { if (!data)
err = error("cannot unpack %s from %s at offset %"PRIuMAX"", err = error("cannot unpack %s from %s at offset %"PRIuMAX"",
sha1_to_hex(entries[i].sha1), p->pack_name, sha1_to_hex(entries[i].sha1), p->pack_name,
(uintmax_t)entries[i].offset); (uintmax_t)entries[i].offset);
break; else if (check_sha1_signature(entries[i].sha1, data, size, typename(type)))
}
if (check_sha1_signature(entries[i].sha1, data, size, typename(type))) {
err = error("packed %s from %s is corrupt", err = error("packed %s from %s is corrupt",
sha1_to_hex(entries[i].sha1), p->pack_name); sha1_to_hex(entries[i].sha1), p->pack_name);
free(data);
break;
}
free(data); free(data);
} }
free(entries); free(entries);