diff --git a/builtin/fsck.c b/builtin/fsck.c index 3d5ced2d3a..140357b6fc 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -60,6 +60,12 @@ static const char *printable_type(struct object *obj) { const char *ret; + if (obj->type == OBJ_NONE) { + enum object_type type = sha1_object_info(obj->oid.hash, NULL); + if (type > 0) + object_as_type(obj, type, 0); + } + ret = typename(obj->type); if (!ret) ret = "unknown"; @@ -595,57 +601,7 @@ static int fsck_cache_tree(struct cache_tree *it) static void mark_object_for_connectivity(const unsigned char *sha1) { - struct object *obj = lookup_object(sha1); - - /* - * Setting the object type here isn't strictly necessary for a - * connectivity check. In most cases, our walk will expect a certain - * type (e.g., a tree referencing a blob) and will use lookup_blob() to - * assign the type. But doing it here has two advantages: - * - * 1. When the fsck_walk code looks at objects that _don't_ come from - * links (e.g., the tip of a ref), it may complain about the - * "unknown object type". - * - * 2. This serves as a nice cross-check that the graph links are - * sane. So --connectivity-only does not check that the bits of - * blobs are not corrupted, but it _does_ check that 100644 tree - * entries point to blobs, and so forth. - * - * Unfortunately we can't just use parse_object() here, because the - * whole point of --connectivity-only is to avoid reading the object - * data more than necessary. - */ - if (!obj || obj->type == OBJ_NONE) { - enum object_type type = sha1_object_info(sha1, NULL); - switch (type) { - case OBJ_BAD: - error("%s: unable to read object type", - sha1_to_hex(sha1)); - break; - case OBJ_COMMIT: - obj = (struct object *)lookup_commit(sha1); - break; - case OBJ_TREE: - obj = (struct object *)lookup_tree(sha1); - break; - case OBJ_BLOB: - obj = (struct object *)lookup_blob(sha1); - break; - case OBJ_TAG: - obj = (struct object *)lookup_tag(sha1); - break; - default: - error("%s: unknown object type %d", - sha1_to_hex(sha1), type); - } - - if (!obj || obj->type == OBJ_NONE) { - errors_found |= ERROR_OBJECT; - return; - } - } - + struct object *obj = lookup_unknown_object(sha1); obj->flags |= HAS_OBJ; } diff --git a/fsck.c b/fsck.c index 4a3069e204..939792752b 100644 --- a/fsck.c +++ b/fsck.c @@ -458,6 +458,10 @@ int fsck_walk(struct object *obj, void *data, struct fsck_options *options) { if (!obj) return -1; + + if (obj->type == OBJ_NONE) + parse_object(obj->oid.hash); + switch (obj->type) { case OBJ_BLOB: return 0;