ls-tree: major rewrite to do pathspec
[gitweb.git] / ls-files.c
index 3085b2fc8c7e8920ecca8e9c0657d6124b0fbfda..f3f1a6a6633881bf43887731fdcbe08af9ad2f4a 100644 (file)
@@ -97,7 +97,7 @@ static int add_excludes_from_file_1(const char *fname,
        for (i = 0; i < size; i++) {
                if (buf[i] == '\n') {
                        if (entry != buf + i && entry[0] != '#') {
-                               buf[i] = 0;
+                               buf[i - (i && buf[i-1] == '\r')] = 0;
                                add_exclude(entry, base, baselen, which);
                        }
                        entry = buf + i + 1;
@@ -344,10 +344,33 @@ static void show_dir_entry(const char *tag, struct nond_on_fs *ent)
                return;
 
        fputs(tag, stdout);
-       write_name_quoted("", ent->name + offset, line_terminator, stdout);
+       write_name_quoted("", 0, ent->name + offset, line_terminator, stdout);
        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;
@@ -410,7 +433,8 @@ static void show_ce_entry(const char *tag, struct cache_entry *ce)
 
        if (!show_stage) {
                fputs(tag, stdout);
-               write_name_quoted("", ce->name + offset, line_terminator, stdout);
+               write_name_quoted("", 0, ce->name + offset,
+                                 line_terminator, stdout);
                putchar(line_terminator);
        }
        else {
@@ -419,7 +443,8 @@ static void show_ce_entry(const char *tag, struct cache_entry *ce)
                       ntohl(ce->ce_mode),
                       sha1_to_hex(ce->sha1),
                       ce_stage(ce));
-               write_name_quoted("", ce->name + offset, line_terminator, stdout);
+               write_name_quoted("", 0, ce->name + offset,
+                                 line_terminator, stdout);
                putchar(line_terminator);
        }
 }
@@ -438,8 +463,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();
        }
@@ -548,6 +572,7 @@ int main(int argc, const char **argv)
        prefix = setup_git_directory();
        if (prefix)
                prefix_offset = strlen(prefix);
+       git_config(git_default_config);
 
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];