# HG changeset patch # User Kristian H?gsberg # Date 1193119059 14400 # Node ID 9e3907688d78bc6548865d1a3e154ceb9953e69c # Parent a73c2ac05cbecb9b6df47a3b2df9fbcf6718acc0 Add fnmatch() filtering to output to improve tab-completion. diff -r a73c2ac05cbe -r 9e3907688d78 bash-completion.sh --- a/bash-completion.sh Mon Oct 22 22:55:06 2007 -0400 +++ b/bash-completion.sh Tue Oct 23 01:57:39 2007 -0400 @@ -1,17 +1,19 @@ __razor_commands () { - COMPREPLY=($(compgen -W "list-requires list-provides list-files list-file-packages what-requires what-provides import-yum import-rpmdb validate update diff" -- $1)) + local IFS=$'\n' + COMPREPLY=($(IFS=: compgen -S' ' -W "list-requires:list-provides:list-files:list-file-packages:what-requires:what-provides:import-yum:import-rpmdb:validate:update:diff" -- $1)) } __razor_packages () { - COMPREPLY=($(compgen -W "$(./razor list)" -- $1)) + local IFS=$'\n' + + COMPREPLY=($(./razor list "$1*" | while read p; do echo "$p "; done)) } __razor_files() { - COMPREPLY=($(compgen -W "$(./razor list-files)" -- $1)) + COMPREPLY=($(./razor list-files "$1*")) } __razor_requires() { - echo requires COMPREPLY=($(compgen -W "$(./razor list-requires)" -- $1)) } @@ -34,4 +36,4 @@ fi } -complete -F __razor razor +complete -o nospace -F __razor razor diff -r a73c2ac05cbe -r 9e3907688d78 main.c --- a/main.c Mon Oct 22 22:55:06 2007 -0400 +++ b/main.c Tue Oct 23 01:57:39 2007 -0400 @@ -16,7 +16,7 @@ struct razor_set *set; set = razor_set_open(repo_filename); - razor_set_list(set); + razor_set_list(set, argv[0]); razor_set_destroy(set); return 0; diff -r a73c2ac05cbe -r 9e3907688d78 razor.c --- a/razor.c Mon Oct 22 22:55:06 2007 -0400 +++ b/razor.c Tue Oct 23 01:57:39 2007 -0400 @@ -11,6 +11,7 @@ #include #include #include +#include #include "razor.h" @@ -834,56 +835,74 @@ array_release(&importer->files); } -static struct razor_entry * -find_entry(struct razor_set *set, struct razor_entry *dir, const char *name) +static const char * +find_dir(struct razor_set *set, struct razor_entry **dir, const char *pattern) +{ + struct razor_entry *e, *end; + const char *n, *pool = set->string_pool.data; + int len; + + e = (struct razor_entry *) set->file_tree.data + (*dir)->start; + end = e + (*dir)->count; + + while (e < end) { + n = pool + e->name; + len = strlen(n); + if (len == 0) { + /* FIXME: Shouldn't have 0-length entries... */ + e++; + continue; + } + + if (strncmp(pattern + 1, n, len) == 0 && + pattern[len + 1] == '/') { + *dir = e; + return find_dir(set, dir, pattern + len + 1); + } + e++; + } + + return pattern + 1; +} + +static void +list_dir(struct razor_set *set, struct razor_entry *dir, + const char *pattern, const char *base) { 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) -{ - struct razor_entry *c; - char *pool = set->string_pool.data; - int i; - - for (i = 0; i < indent; i++) - putchar(' '); - printf("%s\n", pool + e->name); - for (i = 0; i < e->count; i++) { - c = (struct razor_entry *) set->file_tree.data + e->start + i; - list_dir(set, c, indent + 2); + for ( ; e < end; e++) { + if (base && base[0] && fnmatch(base, &pool[e->name], 0) != 0) + continue; + if (base && pattern) + printf("%.*s%s%s\n", + base - pattern, pattern, pool + e->name, + e->count > 0 ? "/" : ""); + else + printf("%s%s\n", pool + e->name, + e->count > 0 ? "/" : ""); + } } void -razor_set_list_files(struct razor_set *set, const char *prefix) +razor_set_list_files(struct razor_set *set, const char *pattern) { struct razor_entry *e; + const char *base; - e = find_entry(set, set->file_tree.data, prefix); - if (e == NULL) + if (pattern == NULL) + pattern = "/"; + + e = set->file_tree.data; + base = find_dir(set, &e, pattern); + if (base == NULL) return; - list_dir(set, e, 2); + list_dir(set, e, pattern, base); } void @@ -891,11 +910,12 @@ { struct razor_entry *e; struct razor_package *packages, *p; - const char *pool; + const char *pool, *base; unsigned long *r; - e = find_entry(set, set->file_tree.data, filename); - if (e == NULL) + e = set->file_tree.data; + base = find_dir(set, &e, filename); + if (base == NULL) return; r = (unsigned long *) set->package_pool.data + e->packages; @@ -946,15 +966,22 @@ } void -razor_set_list(struct razor_set *set) +razor_set_list(struct razor_set *set, const char *pattern) { struct razor_package *p, *end; + int with_version = 0; char *pool; pool = set->string_pool.data; end = set->packages.data + set->packages.size; - for (p = set->packages.data; p < end; p++) - printf("%s %s\n", &pool[p->name], &pool[p->version]); + for (p = set->packages.data; p < end; p++) { + if (pattern && fnmatch(pattern, &pool[p->name], 0) != 0) + continue; + if (with_version) + printf("%s %s\n", &pool[p->name], &pool[p->version]); + else + printf("%s\n", &pool[p->name]); + } } struct razor_set *bsearch_set; diff -r a73c2ac05cbe -r 9e3907688d78 razor.h --- a/razor.h Mon Oct 22 22:55:06 2007 -0400 +++ b/razor.h Tue Oct 23 01:57:39 2007 -0400 @@ -9,7 +9,7 @@ void razor_set_destroy(struct razor_set *set); int razor_set_write(struct razor_set *set, const char *filename); -void razor_set_list(struct razor_set *set); +void razor_set_list(struct razor_set *set, const char *pattern); void razor_set_list_requires(struct razor_set *set, const char *name); void razor_set_list_provides(struct razor_set *set, const char *name); void razor_set_list_requires_packages(struct razor_set *set,