*  - zero for no
  *  - negative for "no, and no subsequent entries will be either"
  */
-static int tree_entry_interesting(struct tree_desc *desc, const char *base, int baselen, struct diff_options *opt)
+static int tree_entry_interesting(const struct name_entry *entry, const char *base, int baselen, const struct pathspec *ps)
 {
-       const char *path;
-       const unsigned char *sha1;
-       unsigned mode;
        int i;
        int pathlen;
        int never_interesting = -1;
 
-       if (!opt->pathspec.nr)
+       if (!ps || !ps->nr)
                return 2;
 
-       sha1 = tree_entry_extract(desc, &path, &mode);
-
-       pathlen = tree_entry_len(path, sha1);
+       pathlen = tree_entry_len(entry->path, entry->sha1);
 
-       for (i = 0; i < opt->pathspec.nr; i++) {
-               const struct pathspec_item *item = opt->pathspec.items+i;
+       for (i = 0; i < ps->nr; i++) {
+               const struct pathspec_item *item = ps->items+i;
                const char *match = item->match;
                int matchlen = item->len;
                int m = -1; /* signals that we haven't called strncmp() */
                         * Does match sort strictly earlier than path
                         * with their common parts?
                         */
-                       m = strncmp(match, path,
+                       m = strncmp(match, entry->path,
                                    (matchlen < pathlen) ? matchlen : pathlen);
                        if (m < 0)
                                continue;
                if (matchlen > pathlen) {
                        if (match[pathlen] != '/')
                                continue;
-                       if (!S_ISDIR(mode))
+                       if (!S_ISDIR(entry->mode))
                                continue;
                }
 
                         * we cheated and did not do strncmp(), so we do
                         * that here.
                         */
-                       m = strncmp(match, path, pathlen);
+                       m = strncmp(match, entry->path, pathlen);
 
                /*
                 * If common part matched earlier then it is a hit,
                if (all_interesting)
                        show = 1;
                else {
-                       show = tree_entry_interesting(desc, base, baselen,
-                                                     opt);
+                       show = tree_entry_interesting(&desc->entry, base, baselen, &opt->pathspec);
                        if (show == 2)
                                all_interesting = 1;
                }
 static void skip_uninteresting(struct tree_desc *t, const char *base, int baselen, struct diff_options *opt, int *all_interesting)
 {
        while (t->size) {
-               int show = tree_entry_interesting(t, base, baselen, opt);
+               int show = tree_entry_interesting(&t->entry, base, baselen, &opt->pathspec);
                if (show == 2)
                        *all_interesting = 1;
                if (!show) {