Implement listing only files in a subdirectory.
authorKristian Høgsberg <krh@redhat.com>
Mon, 22 Oct 2007 02:41:02 +0000 (22:41 -0400)
committerKristian Høgsberg <krh@redhat.com>
Mon, 22 Oct 2007 02:41:14 +0000 (22:41 -0400)
main.c
razor.c
razor.h

diff --git a/main.c b/main.c
index 9bc7cc4..dbbd854 100644 (file)
--- a/main.c
+++ b/main.c
@@ -54,7 +54,7 @@ command_list_files(int argc, const char *argv[])
        set = razor_set_open(repo_filename);
        if (set == NULL)
                return 1;
-       razor_set_list_files(set);
+       razor_set_list_files(set, argv[0]);
        razor_set_destroy(set);
 
        return 0;
diff --git a/razor.c b/razor.c
index 8dfad97..9d12f92 100644 (file)
--- a/razor.c
+++ b/razor.c
@@ -815,6 +815,31 @@ build_file_tree(struct razor_importer *importer)
        array_release(&importer->files);
 }
 
+static struct razor_entry *
+find_entry(struct razor_set *set, struct razor_entry *dir, const char *name)
+{
+       struct razor_entry *e, *end;
+       char *pool = set->string_pool.data;
+       char *p, *n;
+
+       if (name == NULL)
+               return dir;
+
+       p = strchr(name + 1, '/');
+       e = (struct razor_entry *) set->file_tree.data + dir->start;
+       end = e + dir->count;
+
+       while (e < end) {
+               n = pool + e->name;
+               if ((p != NULL && strncmp(n, name + 1, p - (name + 1)) == 0) ||
+                   (p == NULL && strcmp(n, name + 1) == 0))
+                       return find_entry(set, e, p);
+               e++;
+       }
+
+       return NULL;
+}
+
 static void
 list_dir(struct razor_set *set, struct razor_entry *e, int indent)
 {
@@ -832,9 +857,14 @@ list_dir(struct razor_set *set, struct razor_entry *e, int indent)
 }
 
 void
-razor_set_list_files(struct razor_set *set)
+razor_set_list_files(struct razor_set *set, const char *prefix)
 {
-       list_dir(set, set->file_tree.data, 2);
+       struct razor_entry *e;
+
+       e = find_entry(set, set->file_tree.data, prefix);
+       if (e == NULL)
+               return;
+       list_dir(set, e, 2);
 }
 
 struct razor_set *
diff --git a/razor.h b/razor.h
index e4b305b..553afac 100644 (file)
--- a/razor.h
+++ b/razor.h
@@ -18,7 +18,7 @@ void razor_set_list_requires_packages(struct razor_set *set,
 void razor_set_list_provides_packages(struct razor_set *set,
                                      const char *name,
                                      const char *version);
-void razor_set_list_files(struct razor_set *set);
+void razor_set_list_files(struct razor_set *set, const char *prefix);
 
 void razor_set_list_unsatisfied(struct razor_set *set);
 struct razor_set *razor_set_update(struct razor_set *set,