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 at 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 at 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 at cworth.org>
> + * ? ? ? ? ?Jan Janak <jan at 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 at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
>
>

Reply via email to