Merge branch 'jc/ls-files-o'
authorJunio C Hamano <junkio@cox.net>
Thu, 9 Feb 2006 08:21:27 +0000 (00:21 -0800)
committerJunio C Hamano <junkio@cox.net>
Thu, 9 Feb 2006 08:21:27 +0000 (00:21 -0800)
* jc/ls-files-o:
  ls-files: honour per-directory ignore file from higher directories.

1  2 
ls-files.c

diff --combined ls-files.c
@@@ -447,22 -447,6 +447,22 @@@ static void show_ce_entry(const char *t
        if (pathspec && !match(pathspec, ce->name, len))
                return;
  
 +      if (tag && *tag && (ce->ce_flags & htons(CE_VALID))) {
 +              static char alttag[4];
 +              memcpy(alttag, tag, 3);
 +              if (isalpha(tag[0]))
 +                      alttag[0] = tolower(tag[0]);
 +              else if (tag[0] == '?')
 +                      alttag[0] = '!';
 +              else {
 +                      alttag[0] = 'v';
 +                      alttag[1] = tag[0];
 +                      alttag[2] = ' ';
 +                      alttag[3] = 0;
 +              }
 +              tag = alttag;
 +      }
 +
        if (!show_stage) {
                fputs(tag, stdout);
                write_name_quoted("", 0, ce->name + offset,
@@@ -490,8 -474,28 +490,28 @@@ static void show_files(void
                const char *path = ".", *base = "";
                int baselen = prefix_len;
  
-               if (baselen)
+               if (baselen) {
                        path = base = prefix;
+                       if (exclude_per_dir) {
+                               char *p, *pp = xmalloc(baselen+1);
+                               memcpy(pp, prefix, baselen+1);
+                               p = pp;
+                               while (1) {
+                                       char save = *p;
+                                       *p = 0;
+                                       push_exclude_per_directory(pp, p-pp);
+                                       *p++ = save;
+                                       if (!save)
+                                               break;
+                                       p = strchr(p, '/');
+                                       if (p)
+                                               p++;
+                                       else
+                                               p = pp + baselen;
+                               }
+                               free(pp);
+                       }
+               }
                read_directory(path, base, baselen);
                qsort(dir, nr_dir, sizeof(struct nond_on_fs *), cmp_name);
                if (show_others)
                        err = lstat(ce->name, &st);
                        if (show_deleted && err)
                                show_ce_entry(tag_removed, ce);
 -                      if (show_modified && ce_modified(ce, &st))
 +                      if (show_modified && ce_modified(ce, &st, 0))
                                show_ce_entry(tag_modified, ce);
                }
        }