diff --git a/notmuch-client.h b/notmuch-client.h index 793f32ec..d026e600 100644 --- a/notmuch-client.h +++ b/notmuch-client.h @@ -489,6 +489,9 @@ print_status_database (const char *loc, const notmuch_database_t *database, notmuch_status_t status); +int +status_to_exit (notmuch_status_t status); + #include "command-line-arguments.h" extern char *notmuch_requested_db_uuid; diff --git a/notmuch-insert.c b/notmuch-insert.c index 862da889..bc96af0e 100644 --- a/notmuch-insert.c +++ b/notmuch-insert.c @@ -538,9 +538,10 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[]) return EXIT_FAILURE; } - if (notmuch_database_open (notmuch_config_get_database_path (config), - NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much)) - return EXIT_FAILURE; + status = notmuch_database_open (notmuch_config_get_database_path (config), + NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much); + if (status) + return keep ? NOTMUCH_STATUS_SUCCESS : status_to_exit (status); notmuch_exit_if_unmatched_db_uuid (notmuch); @@ -577,5 +578,5 @@ notmuch_insert_command (notmuch_config_t *config, int argc, char *argv[]) notmuch_run_hook (db_path, "post-insert"); } - return status ? EXIT_FAILURE : EXIT_SUCCESS; + return status_to_exit (status); } diff --git a/status.c b/status.c index 45d3fb4e..8bc2fe4b 100644 --- a/status.c +++ b/status.c @@ -36,3 +36,19 @@ print_status_database (const char *loc, } return status; } + +int +status_to_exit (notmuch_status_t status) +{ + switch (status) { + case NOTMUCH_STATUS_SUCCESS: + return EXIT_SUCCESS; + case NOTMUCH_STATUS_OUT_OF_MEMORY: + case NOTMUCH_STATUS_XAPIAN_EXCEPTION: + case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID: + case NOTMUCH_STATUS_FILE_ERROR: + return EX_TEMPFAIL; + default: + return EXIT_FAILURE; + } +} diff --git a/test/T070-insert.sh b/test/T070-insert.sh index 43b3abcf..57472b91 100755 --- a/test/T070-insert.sh +++ b/test/T070-insert.sh @@ -189,7 +189,6 @@ notmuch config set new.tags $OLDCONFIG for code in OUT_OF_MEMORY XAPIAN_EXCEPTION FILE_NOT_EMAIL \ READ_ONLY_DATABASE UPGRADE_REQUIRED PATH_ERROR; do -gen_insert_msg cat < index-file-$code.gdb set breakpoint pending on set logging file index-file-$code.log @@ -201,17 +200,30 @@ continue end run EOF -test_begin_subtest "error exit when add_message returns $code" -gdb --batch-silent --return-child-result \ - -ex "set args insert < $gen_msg_filename" \ - -x index-file-$code.gdb notmuch -test_expect_equal $? 1 +done -test_begin_subtest "success exit with --keep when add_message returns $code" -gdb --batch-silent --return-child-result \ - -ex "set args insert --keep < $gen_msg_filename" \ - -x index-file-$code.gdb notmuch -test_expect_equal $? 0 +gen_insert_msg + +for code in FILE_NOT_EMAIL READ_ONLY_DATABASE UPGRADE_REQUIRED PATH_ERROR; do + test_expect_code 1 "EXIT_FAILURE when add_message returns $code" \ + "gdb --batch-silent --return-child-result \ + -ex 'set args insert < $gen_msg_filename' \ + -x index-file-$code.gdb notmuch" + test_expect_code 0 "success exit with --keep when add_message returns $code" \ + "gdb --batch-silent --return-child-result \ + -ex 'set args insert --keep < $gen_msg_filename' \ + -x index-file-$code.gdb notmuch" +done + +for code in OUT_OF_MEMORY XAPIAN_EXCEPTION ; do + test_expect_code 75 "EX_TEMPFAIL when add_message returns $code" \ + "gdb --batch-silent --return-child-result \ + -ex 'set args insert < $gen_msg_filename' \ + -x index-file-$code.gdb notmuch" + test_expect_code 0 "success exit with --keep when add_message returns $code" \ + "gdb --batch-silent --return-child-result \ + -ex 'set args insert --keep < $gen_msg_filename' \ + -x index-file-$code.gdb notmuch" done test_done