notmuch new: Fix to detect deletions of names at the end of the list.
authorCarl Worth <cworth@cworth.org>
Wed, 6 Jan 2010 21:26:47 +0000 (13:26 -0800)
committerCarl Worth <cworth@cworth.org>
Wed, 6 Jan 2010 21:26:47 +0000 (13:26 -0800)
Previously we only scanned the list of filenames in the filesystem and
detected a deletion whenever that scan skipped a name that existed in
the database. That much was fine, but we *also* need to continue
walking the list of names from the database when the filesystem list
is exhausted.

Without this, removing the last file or directory within any
particular directory would go undetected.

notmuch-new.c

index 432d126286fba8fd070ad75d18850ecca38caef9..f0c306d58ba8edf55af84f1dd535781e19fad7d8 100644 (file)
@@ -430,6 +430,30 @@ add_files_recursive (notmuch_database_t *notmuch,
        next = NULL;
     }
 
+    /* Now that we've walked the whole filesystem list, anything left
+     * over in the database lists has been deleted. */
+    while (notmuch_filenames_has_more (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);
+    }
+
+    while (notmuch_filenames_has_more (db_subdirs))
+    {
+       char *absolute = talloc_asprintf (state->removed_directories,
+                                         "%s/%s", path,
+                                         notmuch_filenames_get (db_subdirs));
+
+       _filename_list_add (state->removed_directories, absolute);
+
+       notmuch_filenames_advance (db_subdirs);
+    }
+
     if (! interrupted) {
        status = notmuch_directory_set_mtime (directory, fs_mtime);
        if (status && ret == NOTMUCH_STATUS_SUCCESS)