summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
03d5175)
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.
+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;
typedef struct {
int output_is_a_tty;
int verbose;
int processed_files;
int added_messages;
struct timeval tv_start;
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;
} add_files_state_t;
static volatile sig_atomic_t do_add_files_print_progress = 0;
+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)
{
static void
tag_inbox_and_unread (notmuch_message_t *message)
{
while (notmuch_filenames_has_more (db_files) &&
strcmp (notmuch_filenames_get (db_files), entry->d_name) < 0)
{
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,
- notmuch_filenames_get (db_files));
+ 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);
}
notmuch_filenames_advance (db_files);
}
while (notmuch_filenames_has_more (db_subdirs) &&
strcmp (notmuch_filenames_get (db_subdirs), entry->d_name) <= 0)
{
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);
}
notmuch_filenames_advance (db_subdirs);
}
const char *db_path;
char *dot_notmuch_path;
struct sigaction action;
const char *db_path;
char *dot_notmuch_path;
struct sigaction action;
int i;
add_files_state.verbose = 0;
int i;
add_files_state.verbose = 0;
add_files_state.added_messages = 0;
gettimeofday (&add_files_state.tv_start, NULL);
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);
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);
gettimeofday (&tv_now, NULL);
elapsed = notmuch_time_elapsed (add_files_state.tv_start,
tv_now);