diff --git a/fsck-cache.c b/fsck-cache.c index 301cc67b76..abdec92ffc 100644 --- a/fsck-cache.c +++ b/fsck-cache.c @@ -100,6 +100,28 @@ static int fsck_tree(struct tree *item) if (strchr(entry->name, '/')) has_full_path = 1; + switch (entry->mode) { + /* + * Standard modes.. + */ + case S_IFREG | 0755: + case S_IFREG | 0644: + case S_IFLNK: + case S_IFDIR: + break; + /* + * This is nonstandard, but we had a few of these + * early on when we honored the full set of mode + * bits.. + */ + case S_IFREG | 0664: + break; + default: + printf("tree %s has entry %o %s\n", + sha1_to_hex(item->object.sha1), + entry->mode, entry->name); + } + if (last) { if (verify_ordered(last, entry) < 0) { fprintf(stderr, "tree %s not ordered\n", diff --git a/tree.c b/tree.c index 4a26603f6e..468f99e494 100644 --- a/tree.c +++ b/tree.c @@ -122,8 +122,10 @@ int parse_tree(struct tree *item) entry = xmalloc(sizeof(struct tree_entry_list)); entry->name = strdup(path + 1); - entry->directory = S_ISDIR(mode); - entry->executable = mode & S_IXUSR; + entry->directory = S_ISDIR(mode) != 0; + entry->executable = (mode & S_IXUSR) != 0; + entry->symlink = S_ISLNK(mode) != 0; + entry->mode = mode; entry->next = NULL; bufptr += len + 20; diff --git a/tree.h b/tree.h index 96cf4291d1..e1c94c090c 100644 --- a/tree.h +++ b/tree.h @@ -9,6 +9,8 @@ struct tree_entry_list { struct tree_entry_list *next; unsigned directory : 1; unsigned executable : 1; + unsigned symlink : 1; + unsigned int mode; char *name; union { struct tree *tree;