ls-files: --others should not say unmerged paths are unknown.
authorJunio C Hamano <junkio@cox.net>
Mon, 7 Nov 2005 01:26:31 +0000 (17:26 -0800)
committerJunio C Hamano <junkio@cox.net>
Mon, 7 Nov 2005 01:26:31 +0000 (17:26 -0800)
Jon Loeliger noticed that an unmerged path appears as
"Untracked" in git-status output, even though we show the same
path as updated/changed.  Since --others means "we have not told
git about that path", we should not show unmerged paths --
obviously, git knows about them; it just does not know what we
want to do about them yet.

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

index d9c8b215f1dcc48ebd7de9f92713f43a09a80e66..f7653e7d32aa6fa72d9c0e3fb1ad618b9536538c 100644 (file)
@@ -348,6 +348,29 @@ static void show_dir_entry(const char *tag, struct nond_on_fs *ent)
        putchar(line_terminator);
 }
 
+static void show_other_files(void)
+{
+       int i;
+       for (i = 0; i < nr_dir; i++) {
+               /* We should not have a matching entry, but we
+                * may have an unmerged entry for this path.
+                */
+               struct nond_on_fs *ent = dir[i];
+               int pos = cache_name_pos(ent->name, ent->len);
+               struct cache_entry *ce;
+               if (0 <= pos)
+                       die("bug in show-other-files");
+               pos = -pos - 1;
+               if (pos < active_nr) { 
+                       ce = active_cache[pos];
+                       if (ce_namelen(ce) == ent->len &&
+                           !memcmp(ce->name, ent->name, ent->len))
+                               continue; /* Yup, this one exists unmerged */
+               }
+               show_dir_entry(tag_other, ent);
+       }
+}
+
 static void show_killed_files(void)
 {
        int i;
@@ -438,8 +461,7 @@ static void show_files(void)
                read_directory(path, base, baselen);
                qsort(dir, nr_dir, sizeof(struct nond_on_fs *), cmp_name);
                if (show_others)
-                       for (i = 0; i < nr_dir; i++)
-                               show_dir_entry(tag_other, dir[i]);
+                       show_other_files();
                if (show_killed)
                        show_killed_files();
        }