X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-new.c;h=455ac10323f4c28c34f0bba5b5fcc3e9336c5fda;hp=7d17793b2f382c5102f092a6e9173966286fa724;hb=191c4ae693c35ecd9e905e64c7619734171c4a8a;hpb=a900ddaba661d693764d1a5f58f8b946bb788c4a diff --git a/notmuch-new.c b/notmuch-new.c index 7d17793b..455ac103 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -24,6 +24,7 @@ typedef struct _filename_node { char *filename; + time_t mtime; struct _filename_node *next; } _filename_node_t; @@ -41,11 +42,12 @@ typedef struct { int total_files; int processed_files; - int added_messages; + int added_messages, removed_messages, renamed_messages; struct timeval tv_start; _filename_list_t *removed_files; _filename_list_t *removed_directories; + _filename_list_t *directory_mtimes; notmuch_bool_t synchronize_flags; _filename_list_t *message_ids_to_sync; @@ -86,7 +88,7 @@ _filename_list_create (const void *ctx) return list; } -static void +static _filename_node_t * _filename_list_add (_filename_list_t *list, const char *filename) { @@ -99,6 +101,8 @@ _filename_list_add (_filename_list_t *list, *(list->tail) = node; list->tail = &node->next; + + return node; } static void @@ -484,6 +488,7 @@ add_files_recursive (notmuch_database_t *notmuch, case NOTMUCH_STATUS_NULL_POINTER: case NOTMUCH_STATUS_TAG_TOO_LONG: case NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW: + case NOTMUCH_STATUS_UNBALANCED_ATOMIC: case NOTMUCH_STATUS_LAST_STATUS: INTERNAL_ERROR ("add_message returned unexpected value: %d", status); goto DONE; @@ -536,11 +541,8 @@ add_files_recursive (notmuch_database_t *notmuch, * the database because a message could be delivered later in this * same second. This may lead to unnecessary re-scans, but it * avoids overlooking messages. */ - if (! interrupted && fs_mtime != stat_time) { - status = notmuch_directory_set_mtime (directory, fs_mtime); - if (status && ret == NOTMUCH_STATUS_SUCCESS) - ret = status; - } + if (fs_mtime != stat_time) + _filename_list_add (state->directory_mtimes, path)->mtime = fs_mtime; DONE: if (next) @@ -722,18 +724,31 @@ upgrade_print_progress (void *closure, fflush (stdout); } +/* Remove one message filename from the database. */ +static notmuch_status_t +remove_filename (notmuch_database_t *notmuch, + const char *path, + add_files_state_t *add_files_state) +{ + notmuch_status_t status; + status = notmuch_database_remove_message (notmuch, path); + if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) + add_files_state->renamed_messages++; + else + add_files_state->removed_messages++; + return status; +} + /* Recursively remove all filenames from the database referring to * 'path' (or to any of its children). */ static void _remove_directory (void *ctx, notmuch_database_t *notmuch, const char *path, - int *renamed_files, - int *removed_files) + add_files_state_t *add_files_state) { notmuch_directory_t *directory; notmuch_filenames_t *files, *subdirs; - notmuch_status_t status; char *absolute; directory = notmuch_database_get_directory (notmuch, path); @@ -744,11 +759,7 @@ _remove_directory (void *ctx, { absolute = talloc_asprintf (ctx, "%s/%s", path, notmuch_filenames_get (files)); - status = notmuch_database_remove_message (notmuch, absolute); - if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) - *renamed_files = *renamed_files + 1; - else - *removed_files = *removed_files + 1; + remove_filename (notmuch, absolute, add_files_state); talloc_free (absolute); } @@ -758,7 +769,7 @@ _remove_directory (void *ctx, { absolute = talloc_asprintf (ctx, "%s/%s", path, notmuch_filenames_get (subdirs)); - _remove_directory (ctx, notmuch, absolute, renamed_files, removed_files); + _remove_directory (ctx, notmuch, absolute, add_files_state); talloc_free (absolute); } @@ -779,8 +790,6 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) char *dot_notmuch_path; struct sigaction action; _filename_node_t *f; - int renamed_files, removed_files; - notmuch_status_t status; int i; notmuch_bool_t timer_is_active = FALSE; @@ -852,10 +861,12 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) add_files_state.processed_files = 0; add_files_state.added_messages = 0; + add_files_state.removed_messages = add_files_state.renamed_messages = 0; gettimeofday (&add_files_state.tv_start, NULL); add_files_state.removed_files = _filename_list_create (ctx); add_files_state.removed_directories = _filename_list_create (ctx); + add_files_state.directory_mtimes = _filename_list_create (ctx); if (! debugger_is_active () && add_files_state.output_is_a_tty && ! add_files_state.verbose) { @@ -865,27 +876,20 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) ret = add_files (notmuch, db_path, &add_files_state); - removed_files = 0; - renamed_files = 0; gettimeofday (&tv_start, NULL); - for (f = add_files_state.removed_files->head; f; f = f->next) { - status = notmuch_database_remove_message (notmuch, f->filename); - if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) - renamed_files++; - else - removed_files++; + for (f = add_files_state.removed_files->head; f && !interrupted; f = f->next) { + remove_filename (notmuch, f->filename, &add_files_state); if (do_print_progress) { do_print_progress = 0; generic_print_progress ("Cleaned up", "messages", - tv_start, removed_files + renamed_files, + tv_start, add_files_state.removed_messages + add_files_state.renamed_messages, add_files_state.removed_files->count); } } gettimeofday (&tv_start, NULL); - for (f = add_files_state.removed_directories->head, i = 0; f; f = f->next, i++) { - _remove_directory (ctx, notmuch, f->filename, - &renamed_files, &removed_files); + for (f = add_files_state.removed_directories->head, i = 0; f && !interrupted; f = f->next, i++) { + _remove_directory (ctx, notmuch, f->filename, &add_files_state); if (do_print_progress) { do_print_progress = 0; generic_print_progress ("Cleaned up", "directories", @@ -894,8 +898,18 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) } } + for (f = add_files_state.directory_mtimes->head; f && !interrupted; f = f->next) { + notmuch_directory_t *directory; + directory = notmuch_database_get_directory (notmuch, f->filename); + if (directory) { + notmuch_directory_set_mtime (directory, f->mtime); + notmuch_directory_destroy (directory); + } + } + talloc_free (add_files_state.removed_files); talloc_free (add_files_state.removed_directories); + talloc_free (add_files_state.directory_mtimes); /* Now that removals are done (hence the database is aware of all * renames), we can synchronize maildir_flags to tags for all @@ -952,16 +966,16 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) printf ("No new mail."); } - if (removed_files) { + if (add_files_state.removed_messages) { printf (" Removed %d %s.", - removed_files, - removed_files == 1 ? "message" : "messages"); + add_files_state.removed_messages, + add_files_state.removed_messages == 1 ? "message" : "messages"); } - if (renamed_files) { + if (add_files_state.renamed_messages) { printf (" Detected %d file %s.", - renamed_files, - renamed_files == 1 ? "rename" : "renames"); + add_files_state.renamed_messages, + add_files_state.renamed_messages == 1 ? "rename" : "renames"); } printf ("\n");