Since 7146e66f086 (tree-walk: finally switch over tree descriptors to
contain a pre-parsed entry, 2014-02-06) the "mode" is validated such
that we'll never reach the "else" clause here.
Good for us that fsck_tree() has its own FSCK_MSG_BAD_FILEMODE check
which we can use, added way back in 64071805eda (git-fsck-cache: be
stricter about "tree" objects, 2005-07-27).
Except it really doesn't due to a regression in 7146e66f086. A
follow-up commit will address that, but for now we can simply rewrite
this code like the rest of the s/entry.mode/entry.object_type/g
changes I'm making.
Signed-off-by: Ævar Arnfjörð Bjarmason <redacted>
---
fsck.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/fsck.c b/fsck.c
index e3030f3b35..7c74c49d32 100644
--- a/fsck.c
+++ b/fsck.c
@@ -396,28 +396,25 @@ static int fsck_walk_tree(struct tree *tree, void *data, struct fsck_options *op
struct object *obj;
int result;
- if (S_ISGITLINK(entry.mode))
+ switch (entry.object_type) {
+ case OBJ_COMMIT:
continue;
-
- if (S_ISDIR(entry.mode)) {
+ case OBJ_TREE:
obj = (struct object *)lookup_tree(the_repository, &entry.oid);
if (name && obj)
fsck_put_object_name(options, &entry.oid, "%s%s/",
name, entry.path);
- result = options->walk(obj, OBJ_TREE, data, options);
- }
- else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode)) {
+ break;
+ case OBJ_BLOB:
obj = (struct object *)lookup_blob(the_repository, &entry.oid);
if (name && obj)
fsck_put_object_name(options, &entry.oid, "%s%s",
name, entry.path);
- result = options->walk(obj, OBJ_BLOB, data, options);
- }
- else {
- result = error("in tree %s: entry %s has bad mode %.6o",
- fsck_describe_object(options, &tree->object.oid),
- entry.path, entry.mode);
+ break;
+ default:
+ BUG("unreachable");
}
+ result = options->walk(obj, entry.object_type, data, options);
if (result < 0)
return result;
if (!res)--
2.31.0.256.gf0ddda3145