Carl and others, I implemented a new notmuch command that can be used to list all tags present in the database: $ notmuch list tags If you run this, you'll get an alphabetically sorted list of all tags--one tag per line. The main reason why I implemented this is because I am also working on adding the tag completion feature to the Emacs mode. This is very useful if you have a large collection of tags--it can save you some typing and, perhaps more importantly, it minimizes the risk of having typos in tag names. I'll send a patch for that later too. Let me know what do you think. -- Jan On Thu, Nov 19, 2009 at 12:34 PM, Jan Janak <jan@ryngle.com> wrote: > Here we create a new notmuch command called list. The purpose of the > command is to produce various lists from the notmuch database. > > At the moment we support only one command, notmuch list tags. This > command creates a list of all tags found in the database. > > Signed-off-by: Jan Janak <jan@ryngle.com> > --- > Makefile.local | 1 + > notmuch-client.h | 3 ++ > notmuch-list.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > notmuch.c | 10 +++++ > 4 files changed, 112 insertions(+), 0 deletions(-) > create mode 100644 notmuch-list.c > > diff --git a/Makefile.local b/Makefile.local > index 27e42ba..fb6d5c3 100644 > --- a/Makefile.local > +++ b/Makefile.local > @@ -12,6 +12,7 @@ notmuch_client_srcs = \ > notmuch-show.c \ > notmuch-tag.c \ > notmuch-time.c \ > + notmuch-list.c \ > gmime-filter-reply.c \ > query-string.c \ > show-message.c > diff --git a/notmuch-client.h b/notmuch-client.h > index b65aa77..ae876b5 100644 > --- a/notmuch-client.h > +++ b/notmuch-client.h > @@ -114,6 +114,9 @@ notmuch_show_command (void *ctx, int argc, char *argv[]); > int > notmuch_tag_command (void *ctx, int argc, char *argv[]); > > +int > +notmuch_list_command (void *ctx, int argc, char *argv[]); > + > const char * > notmuch_time_relative_date (const void *ctx, time_t then); > > diff --git a/notmuch-list.c b/notmuch-list.c > new file mode 100644 > index 0000000..fe71108 > --- /dev/null > +++ b/notmuch-list.c > @@ -0,0 +1,98 @@ > +/* notmuch - Not much of an email program, (just index and search) > + * > + * Copyright © 2009 Carl Worth > + * Copyright © 2009 Jan Janak > + * > + * This program is free software: you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation, either version 3 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program. If not, see http://www.gnu.org/licenses/ . > + * > + * Authors: Carl Worth <cworth@cworth.org> > + * Jan Janak <jan@ryngle.com> > + */ > + > +#include "notmuch-client.h" > + > +enum list_cmd { > + LIST_TAGS > +}; > + > + > +static int > +list_all_tags(notmuch_database_t* db) > +{ > + notmuch_tags_t* tags; > + const char* t; > + > + if ((tags = notmuch_database_get_tags(db)) == NULL) { > + fprintf(stderr, "Error while obtaining tags from the database.\n"); > + return 1; > + } > + > + while((t = notmuch_tags_get(tags))) { > + printf("%s\n", t); > + notmuch_tags_advance(tags); > + } > + > + notmuch_tags_destroy(tags); > + return 0; > +} > + > +int > +notmuch_list_command (void *ctx, int argc, char *argv[]) > +{ > + notmuch_config_t *config; > + notmuch_database_t *db; > + enum list_cmd cmd; > + > + config = NULL; > + db = NULL; > + > + if (argc < 1) { > + fprintf(stderr, "Error: notmuch list requires at least one parameter.\n"); > + fprintf(stderr, "(See notmuch help list)\n"); > + goto error; > + } > + > + if (!strcmp(argv[0], "tags")) { > + cmd = LIST_TAGS; > + } else { > + fprintf(stderr, "Sub-command '%s' not supported.\n", argv[0]); > + goto error; > + } > + > + if ((config = notmuch_config_open (ctx, NULL, NULL)) == NULL) { > + goto error; > + } > + > + db = notmuch_database_open (notmuch_config_get_database_path (config)); > + if (db == NULL) { > + goto error; > + } > + > + switch(cmd) { > + case LIST_TAGS: > + if (list_all_tags(db) != 0) goto error; > + break; > + > + default: > + fprintf(stderr, "Unsupported command: bug in notmuch_list_command.\n"); > + goto error; > + } > + > + notmuch_database_close (db); > + return 0; > + > +error: > + if (db) notmuch_database_close(db); > + return 1; > +} > diff --git a/notmuch.c b/notmuch.c > index 5cc8e4c..1baa22d 100644 > --- a/notmuch.c > +++ b/notmuch.c > @@ -230,6 +230,16 @@ command_t commands[] = { > "\t\tSo if you've previously been using sup for mail, then the\n" > "\t\t\"notmuch restore\" command provides you a way to import\n" > "\t\tall of your tags (or labels as sup calls them)." }, > + { "list", notmuch_list_command, > + "<what>", > + "\t\tShow additional information about the database.", > + "\t\tThe following sub-commands are supported:" > + "\n\n" > + "\t\ttags\n" > + "\n" > + "\t\t\tGenerate a list of all tags available in the database.\n" > + "\t\t\tThe list will be sorted alphabetically." > + }, > { "help", notmuch_help_command, > "[<command>]", > "\t\tThis message, or more detailed help for the named command.", > -- > 1.6.3.3 > > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch > >