summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 87b5054)
raw | patch | inline | side by side (parent: 87b5054)
author | Junio C Hamano <gitster@pobox.com> | |
Thu, 28 Oct 2010 18:13:06 +0000 (11:13 -0700) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Wed, 3 Nov 2010 16:24:47 +0000 (09:24 -0700) |
Clarify the error reporting logic by moving the normal codepath (i.e. we
read the object we wanted to read correctly) up and return early.
The logic to report the name of the packfile with a corrupt object,
introduced by e8b15e6 (sha1_file: Show the the type and path to corrupt
objects, 2010-06-10), was totally bogus. The function that knows which
bad object came from what packfile is has_packed_and_bad(); make it report
which packfile the problem was found.
"Corrupt" is already an adjective, e.g. an object is "corrupt"; we do not
have to say "corrupted object".
Signed-off-by: Junio C Hamano <gitster@pobox.com>
read the object we wanted to read correctly) up and return early.
The logic to report the name of the packfile with a corrupt object,
introduced by e8b15e6 (sha1_file: Show the the type and path to corrupt
objects, 2010-06-10), was totally bogus. The function that knows which
bad object came from what packfile is has_packed_and_bad(); make it report
which packfile the problem was found.
"Corrupt" is already an adjective, e.g. an object is "corrupt"; we do not
have to say "corrupted object".
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_file.c | patch | blob | history |
diff --git a/sha1_file.c b/sha1_file.c
index 0cd9435619f1e0637584289b45d52c1cdd8a9460..42517987a85df35115c03be0f1fc2ca525448dc9 100644 (file)
--- a/sha1_file.c
+++ b/sha1_file.c
p->num_bad_objects++;
}
-static int has_packed_and_bad(const unsigned char *sha1)
+static const struct packed_git *has_packed_and_bad(const unsigned char *sha1)
{
struct packed_git *p;
unsigned i;
for (p = packed_git; p; p = p->next)
for (i = 0; i < p->num_bad_objects; i++)
if (!hashcmp(sha1, p->bad_object_sha1 + 20 * i))
- return 1;
- return 0;
+ return p;
+ return NULL;
}
int check_sha1_signature(const unsigned char *sha1, void *map, unsigned long size, const char *type)
return read_packed_sha1(sha1, type, size);
}
+/*
+ * This function dies on corrupt objects; the callers who want to
+ * deal with them should arrange to call read_object() and give error
+ * messages themselves.
+ */
void *read_sha1_file_repl(const unsigned char *sha1,
enum object_type *type,
unsigned long *size,
const unsigned char *repl = lookup_replace_object(sha1);
void *data = read_object(repl, type, size);
char *path;
+ const struct packed_git *p;
+
+ if (data) {
+ if (replacement)
+ *replacement = repl;
+ return data;
+ }
/* die if we replaced an object with one that does not exist */
- if (!data && repl != sha1)
+ if (repl != sha1)
die("replacement %s not found for %s",
sha1_to_hex(repl), sha1_to_hex(sha1));
- /* legacy behavior is to die on corrupted objects */
- if (!data) {
- if (has_loose_object(repl)) {
- path = sha1_file_name(sha1);
- die("loose object %s (stored in %s) is corrupted", sha1_to_hex(repl), path);
- }
- if (has_packed_and_bad(repl)) {
- path = sha1_pack_name(sha1);
- die("packed object %s (stored in %s) is corrupted", sha1_to_hex(repl), path);
- }
+ if (has_loose_object(repl)) {
+ path = sha1_file_name(sha1);
+ die("loose object %s (stored in %s) is corrupt",
+ sha1_to_hex(repl), path);
}
- if (replacement)
- *replacement = repl;
+ if ((p = has_packed_and_bad(repl)) != NULL)
+ die("packed object %s (stored in %s) is corrupt",
+ sha1_to_hex(repl), p->pack_name);
- return data;
+ return NULL;
}
void *read_object_with_reference(const unsigned char *sha1,