mirror of
https://git.notmuchmail.org/git/notmuch
synced 2025-01-03 07:11:41 +01:00
notmuch new: Store detected removed filenames for later processing.
It is essential to defer the actual removal of any filenames from the database until we are entirely done adding any new files. This is to avoid any information loss from the database in the case of a renamed file or directory. Note that we're *still* not actually doing any removal---still just printing messages indicating the filenames that were detected as removed. But we're at least now printing those messages at a time when we actually *can* do the actual removal.
This commit is contained in:
parent
03d5175001
commit
2e96464f97
1 changed files with 70 additions and 5 deletions
|
@ -22,6 +22,16 @@
|
|||
|
||||
#include <unistd.h>
|
||||
|
||||
typedef struct _filename_node {
|
||||
char *filename;
|
||||
struct _filename_node *next;
|
||||
} _filename_node_t;
|
||||
|
||||
typedef struct _filename_list {
|
||||
_filename_node_t *head;
|
||||
_filename_node_t **tail;
|
||||
} _filename_list_t;
|
||||
|
||||
typedef struct {
|
||||
int output_is_a_tty;
|
||||
int verbose;
|
||||
|
@ -30,6 +40,9 @@ typedef struct {
|
|||
int processed_files;
|
||||
int added_messages;
|
||||
struct timeval tv_start;
|
||||
|
||||
_filename_list_t *removed_files;
|
||||
_filename_list_t *removed_directories;
|
||||
} add_files_state_t;
|
||||
|
||||
static volatile sig_atomic_t do_add_files_print_progress = 0;
|
||||
|
@ -52,6 +65,34 @@ handle_sigint (unused (int sig))
|
|||
interrupted = 1;
|
||||
}
|
||||
|
||||
static _filename_list_t *
|
||||
_filename_list_create (const void *ctx)
|
||||
{
|
||||
_filename_list_t *list;
|
||||
|
||||
list = talloc (ctx, _filename_list_t);
|
||||
if (list == NULL)
|
||||
return NULL;
|
||||
|
||||
list->head = NULL;
|
||||
list->tail = &list->head;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
static void
|
||||
_filename_list_add (_filename_list_t *list,
|
||||
const char *filename)
|
||||
{
|
||||
_filename_node_t *node = talloc (list, _filename_node_t);
|
||||
|
||||
node->filename = talloc_strdup (list, filename);
|
||||
node->next = NULL;
|
||||
|
||||
*(list->tail) = node;
|
||||
list->tail = &node->next;
|
||||
}
|
||||
|
||||
static void
|
||||
tag_inbox_and_unread (notmuch_message_t *message)
|
||||
{
|
||||
|
@ -267,18 +308,27 @@ add_files_recursive (notmuch_database_t *notmuch,
|
|||
while (notmuch_filenames_has_more (db_files) &&
|
||||
strcmp (notmuch_filenames_get (db_files), entry->d_name) < 0)
|
||||
{
|
||||
printf ("Detected deleted file %s/%s\n", path,
|
||||
char *absolute = talloc_asprintf (state->removed_files,
|
||||
"%s/%s", path,
|
||||
notmuch_filenames_get (db_files));
|
||||
|
||||
_filename_list_add (state->removed_files, absolute);
|
||||
|
||||
notmuch_filenames_advance (db_files);
|
||||
}
|
||||
|
||||
while (notmuch_filenames_has_more (db_subdirs) &&
|
||||
strcmp (notmuch_filenames_get (db_subdirs), entry->d_name) <= 0)
|
||||
{
|
||||
if (strcmp (notmuch_filenames_get (db_subdirs), entry->d_name) < 0)
|
||||
printf ("Detected deleted directory %s/%s", path,
|
||||
notmuch_filenames_get (db_subdirs));
|
||||
const char *filename = notmuch_filenames_get (db_subdirs);
|
||||
|
||||
if (strcmp (filename, entry->d_name) < 0)
|
||||
{
|
||||
char *absolute = talloc_asprintf (state->removed_directories,
|
||||
"%s/%s", path, filename);
|
||||
|
||||
_filename_list_add (state->removed_directories, absolute);
|
||||
}
|
||||
|
||||
notmuch_filenames_advance (db_subdirs);
|
||||
}
|
||||
|
@ -516,6 +566,7 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
|
|||
const char *db_path;
|
||||
char *dot_notmuch_path;
|
||||
struct sigaction action;
|
||||
_filename_node_t *f;
|
||||
int i;
|
||||
|
||||
add_files_state.verbose = 0;
|
||||
|
@ -572,8 +623,22 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
|
|||
add_files_state.added_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);
|
||||
|
||||
ret = add_files (notmuch, db_path, &add_files_state);
|
||||
|
||||
for (f = add_files_state.removed_files->head; f; f = f->next) {
|
||||
printf ("Detected removed file: %s\n", f->filename);
|
||||
}
|
||||
|
||||
for (f = add_files_state.removed_directories->head; f; f = f->next) {
|
||||
printf ("Detected removed directory: %s\n", f->filename);
|
||||
}
|
||||
|
||||
talloc_free (add_files_state.removed_files);
|
||||
talloc_free (add_files_state.removed_directories);
|
||||
|
||||
gettimeofday (&tv_now, NULL);
|
||||
elapsed = notmuch_time_elapsed (add_files_state.tv_start,
|
||||
tv_now);
|
||||
|
|
Loading…
Reference in a new issue