notmuch new: Proper support for renamed and deleted files.
authorCarl Worth <cworth@cworth.org>
Wed, 6 Jan 2010 02:59:18 +0000 (18:59 -0800)
committerCarl Worth <cworth@cworth.org>
Wed, 6 Jan 2010 18:32:06 +0000 (10:32 -0800)
The "notmuch new" command will now efficiently notice if any files or
directories have been removed from the mail store and will
appropriately update its database.

Any given mail message (as determined by the message ID) may have
multiple corresponding filenames, and notmuch will return one of
them. When a filen is deleted, the corresponding filename will be
removed from the message in the database. When the last filename is
removed from a message, that message will be entirely removed from the
database.

All file additions are handled before any file removals so that rename
is supported properly.

notmuch-new.c

index f8fe66a3b153c58e2bb1e0652d97623853cd0576..3f8b7fcf89840ce13b941132f26599dac002293f 100644 (file)
@@ -629,11 +629,28 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
     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);
+       notmuch_database_remove_message (notmuch, f->filename);
     }
 
     for (f = add_files_state.removed_directories->head; f; f = f->next) {
-       printf ("Detected removed directory: %s\n", f->filename);
+       notmuch_directory_t *directory;
+       notmuch_filenames_t *files;
+
+       directory = notmuch_database_get_directory (notmuch, f->filename);
+
+       for (files = notmuch_directory_get_child_files (directory);
+            notmuch_filenames_has_more (files);
+            notmuch_filenames_advance (files))
+       {
+           char *absolute;
+
+           absolute = talloc_asprintf (ctx, "%s/%s", f->filename,
+                                       notmuch_filenames_get (files));
+           notmuch_database_remove_message (notmuch, absolute);
+           talloc_free (absolute);
+       }
+
+       notmuch_directory_destroy (directory);
     }
 
     talloc_free (add_files_state.removed_files);