summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--notmuch-client.h11
-rw-r--r--notmuch-new.c15
2 files changed, 23 insertions, 3 deletions
diff --git a/notmuch-client.h b/notmuch-client.h
index 9ce2aef1..793f32ec 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -25,6 +25,7 @@
#define _GNU_SOURCE /* for getline */
#endif
#include <stdio.h>
+#include <sysexits.h>
#include "compat.h"
@@ -114,6 +115,16 @@ chomp_newline (char *str)
str[strlen(str)-1] = '\0';
}
+/* Exit status code indicating temporary failure; user is invited to
+ * retry.
+ *
+ * For example, file(s) in the mail store were removed or renamed
+ * after notmuch new scanned the directories but before indexing the
+ * file(s). If the file was renamed, the indexing might not be
+ * complete, and the user is advised to re-run notmuch new.
+ */
+#define NOTMUCH_EXIT_TEMPFAIL EX_TEMPFAIL
+
/* Exit status code indicating the requested format version is too old
* (support for that version has been dropped). CLI code should use
* notmuch_exit_if_unsupported_format rather than directly exiting
diff --git a/notmuch-new.c b/notmuch-new.c
index c55dea7b..cc680b41 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -53,6 +53,7 @@ typedef struct {
int total_files;
int processed_files;
int added_messages, removed_messages, renamed_messages;
+ int vanished_files;
struct timeval tv_start;
_filename_list_t *removed_files;
@@ -280,11 +281,13 @@ add_file (notmuch_database_t *notmuch, const char *filename,
case NOTMUCH_STATUS_FILE_NOT_EMAIL:
fprintf (stderr, "Note: Ignoring non-mail file: %s\n", filename);
break;
- /* Fatal issues. Don't process anymore. */
case NOTMUCH_STATUS_FILE_ERROR:
+ /* Someone renamed/removed the file between scandir and now. */
+ state->vanished_files++;
fprintf (stderr, "Unexpected error with file %s\n", filename);
(void) print_status_database ("add_file", notmuch, status);
- goto DONE;
+ break;
+ /* Fatal issues. Don't process anymore. */
case NOTMUCH_STATUS_READ_ONLY_DATABASE:
case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
case NOTMUCH_STATUS_OUT_OF_MEMORY:
@@ -1151,5 +1154,11 @@ notmuch_new_command (notmuch_config_t *config, int argc, char *argv[])
if (!no_hooks && !ret && !interrupted)
ret = notmuch_run_hook (db_path, "post-new");
- return ret || interrupted ? EXIT_FAILURE : EXIT_SUCCESS;
+ if (ret || interrupted)
+ return EXIT_FAILURE;
+
+ if (add_files_state.vanished_files)
+ return NOTMUCH_EXIT_TEMPFAIL;
+
+ return EXIT_SUCCESS;
}