diff options
author | Jan Janak <jan@ryngle.com> | 2009-11-25 04:30:22 +0100 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2009-11-26 07:06:41 -0800 |
commit | 5a447b00ac3a3c0c23a28d281c330590320af099 (patch) | |
tree | e066a156458d13670ca77e324067552c8d1056c9 /notmuch-search-tags.c | |
parent | 523a6f67ecc94efd37dcdf570d66edc62497a8fb (diff) |
search-tags: Add support for search-terms.
This patch adds support for search-terms to 'notmuch search-tags'. If
no search-term is provided then the command returns a list of all tags
from the database.
If the user provides one or more search-terms as arguments then the
command collects tags from matching messages only.
This could be used by functions in the Emacs mode to further limit the
list of tags offered for completion. For example, functions that remove
tags from message(s) could offer only tags present in the message(s).
Signed-off-by: Jan Janak <jan@ryngle.com>
Diffstat (limited to 'notmuch-search-tags.c')
-rw-r--r-- | notmuch-search-tags.c | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/notmuch-search-tags.c b/notmuch-search-tags.c index 1201165..7a1305e 100644 --- a/notmuch-search-tags.c +++ b/notmuch-search-tags.c @@ -21,34 +21,31 @@ #include "notmuch-client.h" -static int -list_all_tags (notmuch_database_t* db) +static void +print_tags (notmuch_tags_t *tags) { - notmuch_tags_t* tags; - const char* t; + const char *t; - if ((tags = notmuch_database_get_all_tags (db)) == NULL) { - fprintf (stderr, "Error while obtaining tags from the database.\n"); - return 1; - } - - while((t = notmuch_tags_get (tags))) { + while ((t = notmuch_tags_get (tags))) { printf ("%s\n", t); notmuch_tags_advance (tags); } - - notmuch_tags_destroy (tags); - return 0; } int notmuch_search_tags_command (void *ctx, int argc, char *argv[]) { + notmuch_messages_t *msgs; + notmuch_tags_t *tags; notmuch_config_t *config; notmuch_database_t *db; + notmuch_query_t *query; + char *query_str; + tags = NULL; config = NULL; db = NULL; + query = NULL; if ((config = notmuch_config_open (ctx, NULL, NULL)) == NULL) { goto error; @@ -60,12 +57,42 @@ notmuch_search_tags_command (void *ctx, int argc, char *argv[]) goto error; } - if (list_all_tags (db) != 0) goto error; + if (argc > 0) { + if ((query_str = query_string_from_args (ctx, argc, argv)) == NULL) { + fprintf (stderr, "Out of memory.\n"); + goto error; + } + + if (*query_str == '\0') { + fprintf (stderr, "Error: Invalid search string.\n"); + goto error; + } + + if ((query = notmuch_query_create (db, query_str)) == NULL) { + fprintf (stderr, "Out of memory\n"); + goto error; + } + + + msgs = notmuch_query_search_messages (query); + if ((tags = notmuch_messages_collect_tags (msgs)) == NULL) goto error; + } else { + if ((tags = notmuch_database_get_all_tags (db)) == NULL) { + fprintf (stderr, "Error while getting tags from the database.\n"); + goto error; + } + } + + print_tags (tags); + notmuch_tags_destroy (tags); + if (query) notmuch_query_destroy (query); notmuch_database_close (db); return 0; error: + if (tags) notmuch_tags_destroy (tags); + if (query) notmuch_query_destroy (query); if (db) notmuch_database_close (db); return 1; } |