X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-restore.c;h=f23ab983a93da0a84020ee460300f4f631225743;hp=f43698984e4c5a5dec41b9bc1e46a56422208f41;hb=3fed6736a7ef8b8b1f05d0fabb136bdd3b5917ee;hpb=d705a6a45bf691b60101203bd09a459be255dceb diff --git a/notmuch-restore.c b/notmuch-restore.c index f4369898..f23ab983 100644 --- a/notmuch-restore.c +++ b/notmuch-restore.c @@ -26,7 +26,8 @@ static regex_t regex; /* Non-zero return indicates an error in retrieving the message, - * or in applying the tags. + * or in applying the tags. Missing messages are reported, but not + * considered errors. */ static int tag_message (unused (void *ctx), @@ -40,13 +41,17 @@ tag_message (unused (void *ctx), int ret = 0; status = notmuch_database_find_message (notmuch, message_id, &message); - if (status || message == NULL) { - fprintf (stderr, "Warning: cannot apply tags to %smessage: %s\n", - message ? "" : "missing ", message_id); - if (status) - fprintf (stderr, "%s\n", notmuch_status_to_string (status)); + if (status) { + fprintf (stderr, "Error applying tags to message %s: %s\n", + message_id, notmuch_status_to_string (status)); return 1; } + if (message == NULL) { + fprintf (stderr, "Warning: cannot apply tags to missing message: %s\n", + message_id); + /* We consider this a non-fatal error. */ + return 0; + } /* In order to detect missing messages, this check/optimization is * intentionally done *after* first finding the message. */ @@ -115,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; @@ -134,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, ¬much)) - return 1; + return EXIT_FAILURE; if (notmuch_config_get_maildir_synchronize_flags (config)) flags |= TAG_FLAG_MAILDIR_SYNC; @@ -157,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; @@ -171,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 { @@ -193,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] == '#') || @@ -216,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 { @@ -229,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; } } @@ -272,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; }