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;
elapsed_overall = notmuch_time_elapsed (tv_start, tv_now);
rate_overall = processed / elapsed_overall;
- printf ("%s %d ", action, processed);
+ printf ("%s %u ", action, processed);
if (total) {
- printf ("of %d %s", total, object);
+ printf ("of %u %s", total, object);
if (processed > 0 && elapsed_overall > 0.5) {
double time_remaining = ((total - processed) / rate_overall);
printf (" (");
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:
- fprintf (stderr, "Error: %s. Halting processing.\n",
- notmuch_status_to_string (status));
+ (void) print_status_database("add_file", notmuch, status);
goto DONE;
default:
INTERNAL_ERROR ("add_message returned unexpected value: %d", status);
entry = fs_entries[i];
/* Ignore special directories to avoid infinite recursion.
- * Also ignore the .notmuch directory and files/directories
- * the user has configured to be ignored.
+ * Also ignore the .notmuch directory.
*/
if (strcmp (entry->d_name, ".") == 0 ||
strcmp (entry->d_name, "..") == 0 ||
- strcmp (entry->d_name, ".notmuch") == 0 ||
- _entry_in_ignore_list (entry->d_name, state))
- {
- if (state->debug && _entry_in_ignore_list (entry->d_name, state))
+ strcmp (entry->d_name, ".notmuch") == 0)
+ continue;
+
+ /* Ignore any files/directories the user has configured to be
+ * ignored
+ */
+ if (_entry_in_ignore_list (entry->d_name, state)) {
+ if (state->debug)
printf ("(D) count_files: explicitly ignoring %s/%s\n",
- path,
- entry->d_name);
+ path, entry->d_name);
continue;
}
const char *path,
add_files_state_t *add_files_state)
{
- notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
+ notmuch_status_t status;
notmuch_directory_t *directory;
notmuch_filenames_t *files, *subdirs;
char *absolute;
state->processed_files == 1 ? "file" : "total files");
notmuch_time_print_formatted_seconds (elapsed);
if (elapsed > 1)
- printf (" (%d files/sec.).\033[K\n",
+ printf (" (%d files/sec.)",
(int) (state->processed_files / elapsed));
- else
- printf (".\033[K\n");
+ printf (".%s\n", (state->output_is_a_tty) ? "\033[K" : "");
}
if (state->added_messages)
}
if (notmuch_database_dump (notmuch, backup_name, "",
- DUMP_FORMAT_BATCH_TAG, DUMP_INCLUDE_CONFIG | DUMP_INCLUDE_TAGS, TRUE)) {
+ DUMP_FORMAT_BATCH_TAG, DUMP_INCLUDE_DEFAULT, TRUE)) {
fprintf (stderr, "Backup failed. Aborting upgrade.");
return EXIT_FAILURE;
}
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;
}