]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-restore.c
cli: move config open/close to main() from subcommands
[notmuch] / notmuch-restore.c
index fc5d1fb89f6b11191c41a982d711c8bf4bc8cf2a..1419621cf7045af9b61616c3dc4832136e770199 100644 (file)
@@ -120,9 +120,8 @@ parse_sup_line (void *ctx, char *line,
 }
 
 int
-notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
+notmuch_restore_command (notmuch_config_t *config, int argc, char *argv[])
 {
-    notmuch_config_t *config;
     notmuch_database_t *notmuch;
     notmuch_bool_t accumulate = FALSE;
     tag_op_flag_t flags = 0;
@@ -139,10 +138,6 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
     int opt_index;
     int input_format = DUMP_FORMAT_AUTO;
 
-    config = notmuch_config_open (ctx, NULL, NULL);
-    if (config == NULL)
-       return 1;
-
     if (notmuch_database_open (notmuch_config_get_database_path (config),
                               NOTMUCH_DATABASE_MODE_READ_WRITE, &notmuch))
        return 1;
@@ -187,7 +182,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
        return 1;
     }
 
-    tag_ops = tag_op_list_create (ctx);
+    tag_ops = tag_op_list_create (config);
     if (tag_ops == NULL) {
        fprintf (stderr, "Out of memory.\n");
        return 1;
@@ -221,12 +216,12 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
            INTERNAL_ERROR ("compile time constant regex failed.");
 
     do {
-       char *query_string;
+       char *query_string, *prefix, *term;
 
        if (line_ctx != NULL)
            talloc_free (line_ctx);
 
-       line_ctx = talloc_new (ctx);
+       line_ctx = talloc_new (config);
        if (input_format == DUMP_FORMAT_SUP) {
            ret = parse_sup_line (line_ctx, line, &query_string, tag_ops);
        } else {
@@ -234,19 +229,22 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
                                  &query_string, tag_ops);
 
            if (ret == 0) {
-               if (strncmp ("id:", query_string, 3) != 0) {
-                   fprintf (stderr, "Warning: unsupported query: %s\n", query_string);
+               ret = parse_boolean_term (line_ctx, query_string,
+                                         &prefix, &term);
+               if (ret && errno == EINVAL) {
+                   fprintf (stderr, "Warning: cannot parse query: %s (skipping)\n", query_string);
+                   continue;
+               } else if (ret) {
+                   /* This is more fatal (e.g., out of memory) */
+                   fprintf (stderr, "Error parsing query: %s\n",
+                            strerror (errno));
+                   ret = 1;
+                   break;
+               } else if (strcmp ("id", prefix) != 0) {
+                   fprintf (stderr, "Warning: not an id query: %s (skipping)\n", query_string);
                    continue;
                }
-               /* delete id: from front of string; tag_message
-                * expects a raw message-id.
-                *
-                * XXX: Note that query string id:foo and bar will be
-                * interpreted as a message id "foo and bar". This
-                * should eventually be fixed to give a better error
-                * message.
-                */
-               query_string = query_string + 3;
+               query_string = term;
            }
        }