This functionality will be used from another file in a subsequent patch, so refactor it into a public function. Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- object-file.c | 29 ++++++++++++++++++----------- object-store.h | 9 +++++++++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/object-file.c b/object-file.c index 1cde477267..36f81c7958 100644 --- a/object-file.c +++ b/object-file.c @@ -1705,9 +1705,6 @@ void *read_object_file_extended(struct repository *r, int lookup_replace) { void *data; - const struct packed_git *p; - const char *path; - struct stat st; const struct object_id *repl = lookup_replace ? lookup_replace_object(r, oid) : oid; @@ -1715,26 +1712,36 @@ void *read_object_file_extended(struct repository *r, data = read_object(r, repl, type, size); if (data) return data; + die_if_corrupt(r, oid, repl); + + return NULL; +} + +void die_if_corrupt(struct repository *r, + const struct object_id *oid, + const struct object_id *real_oid) +{ + const struct packed_git *p; + const char *path; + struct stat st; obj_read_lock(); if (errno && errno != ENOENT) die_errno(_("failed to read object %s"), oid_to_hex(oid)); /* die if we replaced an object with one that does not exist */ - if (repl != oid) + if (!oideq(real_oid, oid)) die(_("replacement %s not found for %s"), - oid_to_hex(repl), oid_to_hex(oid)); + oid_to_hex(real_oid), oid_to_hex(oid)); - if (!stat_loose_object(r, repl, &st, &path)) + if (!stat_loose_object(r, real_oid, &st, &path)) die(_("loose object %s (stored in %s) is corrupt"), - oid_to_hex(repl), path); + oid_to_hex(real_oid), path); - if ((p = has_packed_and_bad(r, repl))) + if ((p = has_packed_and_bad(r, real_oid))) die(_("packed object %s (stored in %s) is corrupt"), - oid_to_hex(repl), p->pack_name); + oid_to_hex(real_oid), p->pack_name); obj_read_unlock(); - - return NULL; } void *read_object_with_reference(struct repository *r, diff --git a/object-store.h b/object-store.h index 1be57abaf1..88c879c61e 100644 --- a/object-store.h +++ b/object-store.h @@ -256,6 +256,15 @@ static inline void *repo_read_object_file(struct repository *r, #define read_object_file(oid, type, size) repo_read_object_file(the_repository, oid, type, size) #endif +/* + * Dies if real_oid is corrupt, not just missing. + * + * real_oid should be an oid that could not be read. + */ +void die_if_corrupt(struct repository *r, + const struct object_id *oid, + const struct object_id *real_oid); + /* Read and unpack an object file into memory, write memory to an object file */ int oid_object_info(struct repository *r, const struct object_id *, unsigned long *); -- 2.39.0.rc0.267.gcb52ba06e7-goog