]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-restore.c
lib: refactor folder term update after filename removal
[notmuch] / notmuch-restore.c
index fc5d1fb89f6b11191c41a982d711c8bf4bc8cf2a..f23ab983a93da0a84020ee460300f4f631225743 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,13 +138,9 @@ 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;
+       return EXIT_FAILURE;
 
     if (notmuch_config_get_maildir_synchronize_flags (config))
        flags |= TAG_FLAG_MAILDIR_SYNC;
@@ -162,11 +157,8 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
     };
 
     opt_index = parse_arguments (argc, argv, options, 1);
-
-    if (opt_index < 0) {
-       /* diagnostics already printed */
-       return 1;
-    }
+    if (opt_index < 0)
+       return EXIT_FAILURE;
 
     if (! accumulate)
        flags |= TAG_FLAG_REMOVE_ALL;
@@ -176,21 +168,19 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
        if (input == NULL) {
            fprintf (stderr, "Error opening %s for reading: %s\n",
                     input_file_name, strerror (errno));
-           return 1;
+           return EXIT_FAILURE;
        }
     }
 
     if (opt_index < argc) {
-       fprintf (stderr,
-                "Unused positional parameter: %s\n",
-                argv[opt_index]);
-       return 1;
+       fprintf (stderr, "Unused positional parameter: %s\n", argv[opt_index]);
+       return EXIT_FAILURE;
     }
 
-    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;
+       return EXIT_FAILURE;
     }
 
     do {
@@ -198,7 +188,7 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
 
        /* empty input file not considered an error */
        if (line_len < 0)
-           return 0;
+           return EXIT_SUCCESS;
 
     } while ((line_len == 0) ||
             (line[0] == '#') ||
@@ -221,12 +211,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 +224,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;
            }
        }
 
@@ -277,5 +270,5 @@ notmuch_restore_command (unused (void *ctx), int argc, char *argv[])
     if (input != stdin)
        fclose (input);
 
-    return ret;
+    return ret ? EXIT_FAILURE : EXIT_SUCCESS;
 }