Skip to content

Commit 77583e7

Browse files
peffgitster
authored andcommitted
index-pack: distinguish missing objects from type errors
When we fetch a pack that does not contain an object we expected to receive, we get an error like: $ git init --bare tmp.git && cd tmp.git $ git fetch ../parent.git [...] error: Could not read 964953ec7bcc0245cb1d0db4095455edd21a2f2e fatal: Failed to traverse parents of commit b8247b40caf6704fe52736cdece6d6aae87471aa error: ../parent.git did not send all necessary objects This comes from the check_everything_connected rev-list. If we try cloning the same repo (rather than a fetch), we end up using index-pack's --check-self-contained-and-connected option instead, which produces output like: $ git clone --no-local --bare parent.git tmp.git [...] fatal: object of unexpected type fatal: index-pack failed Not only is the sha1 missing, but it's a misleading message. There's no type problem, but rather a missing object problem; we don't notice the difference because we simply compare OBJ_BAD != OBJ_BLOB. Let's provide a different message for this case: $ git clone --no-local --bare parent.git tmp.git fatal: did not receive expected object 6b00a8c61ed379d5f925a72c1987c9c52129d364 fatal: index-pack failed While we're at it, let's also improve a true type mismatch error to look like fatal: object 6b00a8c61ed379d5f925a72c1987c9c52129d364: expected type blob, got tree Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent eea5913 commit 77583e7

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

builtin/index-pack.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,13 @@ static unsigned check_object(struct object *obj)
200200
if (!(obj->flags & FLAG_CHECKED)) {
201201
unsigned long size;
202202
int type = sha1_object_info(obj->sha1, &size);
203-
if (type != obj->type || type <= 0)
204-
die(_("object of unexpected type"));
203+
if (type <= 0)
204+
die(_("did not receive expected object %s"),
205+
sha1_to_hex(obj->sha1));
206+
if (type != obj->type)
207+
die(_("object %s: expected type %s, found %s"),
208+
sha1_to_hex(obj->sha1),
209+
typename(obj->type), typename(type));
205210
obj->flags |= FLAG_CHECKED;
206211
return 1;
207212
}

0 commit comments

Comments
 (0)