mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
make pack-objects a bit more resilient to repo corruption
Right now, packing valid objects could fail when creating a thin pack simply because a pack edge object used as a preferred base is corrupted. Since preferred base objects are not strictly needed to produce a valid pack, let's not consider the inability to read them as a fatal error. Delta compression may well be attempted against other objects in the search window. To avoid warning storms (we are in the inner loop of the delta search window) a warning is emitted only on the first occurrence. Signed-off-by: Nicolas Pitre <nico@fluxnic.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8a90438506
commit
71064a956b
|
@ -1298,9 +1298,23 @@ static int try_delta(struct unpacked *trg, struct unpacked *src,
|
|||
read_lock();
|
||||
src->data = read_sha1_file(src_entry->idx.sha1, &type, &sz);
|
||||
read_unlock();
|
||||
if (!src->data)
|
||||
if (!src->data) {
|
||||
if (src_entry->preferred_base) {
|
||||
static int warned = 0;
|
||||
if (!warned++)
|
||||
warning("object %s cannot be read",
|
||||
sha1_to_hex(src_entry->idx.sha1));
|
||||
/*
|
||||
* Those objects are not included in the
|
||||
* resulting pack. Be resilient and ignore
|
||||
* them if they can't be read, in case the
|
||||
* pack could be created nevertheless.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
die("object %s cannot be read",
|
||||
sha1_to_hex(src_entry->idx.sha1));
|
||||
}
|
||||
if (sz != src_size)
|
||||
die("object %s inconsistent object length (%lu vs %lu)",
|
||||
sha1_to_hex(src_entry->idx.sha1), sz, src_size);
|
||||
|
|
Loading…
Reference in a new issue