aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch-insert.c
diff options
context:
space:
mode:
authorGravatar Jani Nikula <jani@nikula.org>2014-10-03 23:18:59 +0200
committerGravatar David Bremner <david@tethera.net>2014-10-18 07:54:25 +0200
commitdc20a0eedc80477c0db7b7dea9efef90860ec9fb (patch)
tree380a1e5aa670474d4e574cea36de0cc15abaca1f /notmuch-insert.c
parent5df46a3d9efcc201700b02e70b11808fcc40beab (diff)
cli/insert: require succesful message indexing for success status
Add --keep option to keep any remaining stuff in index or file. We could distinguish between failures to index and failures to apply tags or maildir sync, but for simplicity just have one.
Diffstat (limited to 'notmuch-insert.c')
-rw-r--r--notmuch-insert.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/notmuch-insert.c b/notmuch-insert.c
index 0ea43801..7074077c 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -443,6 +443,7 @@ add_file (notmuch_database_t *notmuch, const char *path, tag_op_list_t *tag_ops,
int
notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[])
{
+ notmuch_status_t status, close_status;
notmuch_database_t *notmuch;
struct sigaction action;
const char *db_path;
@@ -452,6 +453,7 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[])
char *query_string = NULL;
const char *folder = NULL;
notmuch_bool_t create_folder = FALSE;
+ notmuch_bool_t keep = FALSE;
notmuch_bool_t synchronize_flags;
const char *maildir;
char *newpath;
@@ -461,6 +463,7 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[])
notmuch_opt_desc_t options[] = {
{ NOTMUCH_OPT_STRING, &folder, "folder", 0, 0 },
{ NOTMUCH_OPT_BOOLEAN, &create_folder, "create-folder", 0, 0 },
+ { NOTMUCH_OPT_BOOLEAN, &keep, "keep", 0, 0 },
{ NOTMUCH_OPT_END, 0, 0, 0, 0 }
};
@@ -535,11 +538,32 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[])
return EXIT_FAILURE;
}
- /* Add the message to the index.
- * Even if adding the message to the notmuch database fails,
- * the message is on disk and we consider the delivery completed. */
- add_file (notmuch, newpath, tag_ops, synchronize_flags, TRUE);
+ /* Index the message. */
+ status = add_file (notmuch, newpath, tag_ops, synchronize_flags, keep);
+
+ /* Commit changes. */
+ close_status = notmuch_database_destroy (notmuch);
+ if (close_status) {
+ /* Hold on to the first error, if any. */
+ if (! status)
+ status = close_status;
+ fprintf (stderr, "%s: failed to commit database changes: %s\n",
+ keep ? "Warning" : "Error",
+ notmuch_status_to_string (close_status));
+ }
+
+ if (status) {
+ if (keep) {
+ status = NOTMUCH_STATUS_SUCCESS;
+ } else {
+ /* If maildir flag sync failed, this might fail. */
+ if (unlink (newpath)) {
+ fprintf (stderr, "Warning: failed to remove '%s' from maildir "
+ "after errors: %s. Please run 'notmuch new' to fix.\n",
+ newpath, strerror (errno));
+ }
+ }
+ }
- notmuch_database_destroy (notmuch);
- return EXIT_SUCCESS;
+ return status ? EXIT_FAILURE : EXIT_SUCCESS;
}