Code

Clean up git-ls-file directory walking library interface
authorLinus Torvalds <torvalds@osdl.org>
Wed, 17 May 2006 02:46:16 +0000 (19:46 -0700)
committerJunio C Hamano <junkio@cox.net>
Wed, 17 May 2006 08:56:55 +0000 (01:56 -0700)
This moves the code to add the per-directory ignore files for the base
directory into the library routine.

That not only allows us to turn the function push_exclude_per_directory()
static again, it also simplifies the library interface a lot (the caller
no longer needs to worry about any of the per-directory exclude files at
all).

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
dir.c
dir.h
ls-files.c

diff --git a/dir.c b/dir.c
index 3f41a5dfea7fa99177e5549985ec7f6609e6c02c..d40b62e1c19c342dfddeb157b295d8188f9a1f20 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -78,7 +78,7 @@ void add_excludes_from_file(struct dir_struct *dir, const char *fname)
                die("cannot use %s as an exclude file", fname);
 }
 
-int push_exclude_per_directory(struct dir_struct *dir, const char *base, int baselen)
+static int push_exclude_per_directory(struct dir_struct *dir, const char *base, int baselen)
 {
        char exclude_file[PATH_MAX];
        struct exclude_list *el = &dir->exclude_list[EXC_DIRS];
@@ -289,6 +289,32 @@ static int cmp_name(const void *p1, const void *p2)
 
 int read_directory(struct dir_struct *dir, const char *path, const char *base, int baselen)
 {
+       /*
+        * Make sure to do the per-directory exclude for all the
+        * directories leading up to our base.
+        */
+       if (baselen) {
+               if (dir->exclude_per_dir) {
+                       char *p, *pp = xmalloc(baselen+1);
+                       memcpy(pp, base, baselen+1);
+                       p = pp;
+                       while (1) {
+                               char save = *p;
+                               *p = 0;
+                               push_exclude_per_directory(dir, pp, p-pp);
+                               *p++ = save;
+                               if (!save)
+                                       break;
+                               p = strchr(p, '/');
+                               if (p)
+                                       p++;
+                               else
+                                       p = pp + baselen;
+                       }
+                       free(pp);
+               }
+       }
+
        read_directory_recursive(dir, path, base, baselen);
        qsort(dir->entries, dir->nr, sizeof(struct dir_entry *), cmp_name);
        return dir->nr;
diff --git a/dir.h b/dir.h
index e8fc441e7fcc4d53af30881a643853a0ab96f7aa..4f65f570852f417f70f1dadc80cc51be484454f1 100644 (file)
--- a/dir.h
+++ b/dir.h
@@ -44,7 +44,5 @@ extern int excluded(struct dir_struct *, const char *);
 extern void add_excludes_from_file(struct dir_struct *, const char *fname);
 extern void add_exclude(const char *string, const char *base,
                        int baselen, struct exclude_list *which);
-extern int push_exclude_per_directory(struct dir_struct *,
-                                     const char *base, int baselen);
 
 #endif
index 89941a3ff8baa023840c092f2b6964cb2b33cce4..dfe1481a353cb216e6967c172fe3426b76e4cedf 100644 (file)
@@ -215,28 +215,8 @@ static void show_files(struct dir_struct *dir)
                const char *path = ".", *base = "";
                int baselen = prefix_len;
 
-               if (baselen) {
+               if (baselen)
                        path = base = prefix;
-                       if (dir->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(dir, pp, p-pp);
-                                       *p++ = save;
-                                       if (!save)
-                                               break;
-                                       p = strchr(p, '/');
-                                       if (p)
-                                               p++;
-                                       else
-                                               p = pp + baselen;
-                               }
-                               free(pp);
-                       }
-               }
                read_directory(dir, path, base, baselen);
                if (show_others)
                        show_other_files(dir);