ls-files --others --directory: fix a bug with index entry ordering
authorJunio C Hamano <junkio@cox.net>
Sat, 7 Jan 2006 22:32:09 +0000 (14:32 -0800)
committerJunio C Hamano <junkio@cox.net>
Sun, 8 Jan 2006 05:34:02 +0000 (21:34 -0800)
When both howto-index.sh and howto/make-dist.txt exist under
Documentation/ directory, dir_exists() mistakenly checked it
without the trailing slash to see if there was something under
Documentation/howto directory, and did not realize there was,
because '-' sorts earlier than '/' and cache_name_pos() finds
howto-index.sh, which is not under howto/ directory.  This
caused --others --directory to show it which was incorrect.

Check the directory name with the trailing slash, because having
an entry that has such as a prefix is what we are looking for.

Signed-off-by: Junio C Hamano <junkio@cox.net>
ls-files.c

index 841c98a710d6fbe58f21e8ab2e9b613fb592d7f3..cc5b32e8bac12105873ecee73a9fc9036d71b61b 100644 (file)
@@ -240,11 +240,9 @@ static int dir_exists(const char *dirname, int len)
        if (pos >= 0)
                return 1;
        pos = -pos-1;
-       if (pos >= active_nr)
+       if (pos >= active_nr) /* can't */
                return 0;
-       if (strncmp(active_cache[pos]->name, dirname, len))
-               return 0;
-       return active_cache[pos]->name[len] == '/';
+       return !strncmp(active_cache[pos]->name, dirname, len);
 }
 
 /*
@@ -294,11 +292,10 @@ static void read_directory(const char *path, const char *base, int baselen)
                                        continue;
                                /* fallthrough */
                        case DT_DIR:
-                               if (show_other_directories) {
-                                       if (!dir_exists(fullname, baselen + len))
-                                               break;
-                               }
                                memcpy(fullname + baselen + len, "/", 2);
+                               if (show_other_directories &&
+                                   !dir_exists(fullname, baselen + len + 1))
+                                       break;
                                read_directory(fullname, fullname,
                                               baselen + len + 1);
                                continue;