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 <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									eea591373e
								
							
						
					
					
						commit
						77583e7739
					
				|  | @ -200,8 +200,13 @@ static unsigned check_object(struct object *obj) | |||
| 	if (!(obj->flags & FLAG_CHECKED)) { | ||||
| 		unsigned long size; | ||||
| 		int type = sha1_object_info(obj->sha1, &size); | ||||
| 		if (type != obj->type || type <= 0) | ||||
| 			die(_("object of unexpected type")); | ||||
| 		if (type <= 0) | ||||
| 			die(_("did not receive expected object %s"), | ||||
| 			      sha1_to_hex(obj->sha1)); | ||||
| 		if (type != obj->type) | ||||
| 			die(_("object %s: expected type %s, found %s"), | ||||
| 			    sha1_to_hex(obj->sha1), | ||||
| 			    typename(obj->type), typename(type)); | ||||
| 		obj->flags |= FLAG_CHECKED; | ||||
| 		return 1; | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Jeff King
						Jeff King