]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-search-tags.c
search-tags: Add support for search-terms.
[notmuch] / notmuch-search-tags.c
index 1201165067d2746ea0aaaba59c3b17efa99a012e..7a1305e2fed98368ae42995a1bf3f28fcaae997e 100644 (file)
 
 #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;
 }