diff --git a/fsck-cache.c b/fsck-cache.c index 301cc67b76e36b47f6d35be62334fb0e5acda677..abdec92ffcf3d85d7307c972e74cc2c69037bb77 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 4a26603f6e32866c0db8a01ac1c228be801f76c6..468f99e4944b139450ed5b1d2f84e6ef0b303e84 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 96cf4291d11453b4489d2bf5234938054fe6b7bd..e1c94c090c8d73268176e8f1ca97f4949cb537df 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;