@@ -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,
@@ -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 *);
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@google.com> --- object-file.c | 29 ++++++++++++++++++----------- object-store.h | 9 +++++++++ 2 files changed, 27 insertions(+), 11 deletions(-)