summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2006-05-16 19:46:16 -0700
committerJunio C Hamano <junkio@cox.net>2006-05-17 01:56:55 -0700
commitb4189aa84873718f80c62846cd53e803b5f72362 (patch)
tree72943b160cbe8d377baf5a5cc78f73d587cc5b15 /dir.c
parent453ec4bdf403c2e89892266a0a660c21680d3f9d (diff)
downloadgit-b4189aa84873718f80c62846cd53e803b5f72362.tar.gz
Clean up git-ls-file directory walking library interface
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>
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/dir.c b/dir.c
index 3f41a5dfea..d40b62e1c1 100644
--- 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;