David Bremner <david@tethera.net> writes: > Attempt to distinguish between errors indicating misconfiguration or > programmer error, which we consider "permanant", in the sense that > automatic retries are unlikely to be useful, and those indicating > transient error conditions. We consider XAPIAN_EXCEPTION transient > because it covers the important special case of locking failure. > --- > notmuch-client.h | 3 +++ > notmuch-insert.c | 9 +++++---- > status.c | 16 ++++++++++++++++ > test/T070-insert.sh | 24 ++++++++++++++---------- > 4 files changed, 38 insertions(+), 14 deletions(-) > > diff --git a/notmuch-client.h b/notmuch-client.h > index 793f32e..d026e60 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 862da88..a152f15 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 status_to_exit(status); I guess this should return NOTMUCH_STATUS_SUCCESS if --keep is passed. > 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 ? status_to_exit(status) : EXIT_SUCCESS; This can be simplified to just "return status_to_exit (status)". And whitespace fixes for both calls to status_to_exit. > +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; > + } This classification is pretty arbitrary. The main goal is have locking errors, which are currently NOTMUCH_STATUS_XAPIAN_EXCEPTION treated as TEMPFAIL. d