]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-new.c
Prefer READ_ONLY consistently over READONLY.
[notmuch] / notmuch-new.c
index 432d126286fba8fd070ad75d18850ecca38caef9..f33ba366f9bfb2de24db63688f37570112201160 100644 (file)
@@ -221,7 +221,7 @@ add_files_recursive (notmuch_database_t *notmuch,
     notmuch_filenames_t *db_files = NULL;
     notmuch_filenames_t *db_subdirs = NULL;
     struct stat st;
-    notmuch_bool_t is_maildir;
+    notmuch_bool_t is_maildir, new_directory;
 
     if (stat (path, &st)) {
        fprintf (stderr, "Error reading directory %s: %s\n",
@@ -240,12 +240,22 @@ add_files_recursive (notmuch_database_t *notmuch,
     directory = notmuch_database_get_directory (notmuch, path);
     db_mtime = notmuch_directory_get_mtime (directory);
 
+    if (db_mtime == 0) {
+       new_directory = TRUE;
+       db_files = NULL;
+       db_subdirs = NULL;
+    } else {
+       new_directory = FALSE;
+       db_files = notmuch_directory_get_child_files (directory);
+       db_subdirs = notmuch_directory_get_child_directories (directory);
+    }
+
     /* If the database knows about this directory, then we sort based
      * on strcmp to match the database sorting. Otherwise, we can do
      * inode-based sorting for faster filesystem operation. */
     num_fs_entries = scandir (path, &fs_entries, 0,
-                             db_mtime ?
-                             dirent_sort_strcmp_name : dirent_sort_inode);
+                             new_directory ?
+                             dirent_sort_inode : dirent_sort_strcmp_name);
 
     if (num_fs_entries == -1) {
        fprintf (stderr, "Error opening directory %s: %s\n",
@@ -294,9 +304,6 @@ add_files_recursive (notmuch_database_t *notmuch,
        goto DONE;
 
     /* Pass 2: Scan for new files, removed files, and removed directories. */
-    db_files = notmuch_directory_get_child_files (directory);
-    db_subdirs = notmuch_directory_get_child_directories (directory);
-
     for (i = 0; i < num_fs_entries; i++)
     {
        if (interrupted)
@@ -399,7 +406,7 @@ add_files_recursive (notmuch_database_t *notmuch,
                     next);
            break;
        /* Fatal issues. Don't process anymore. */
-       case NOTMUCH_STATUS_READONLY_DATABASE:
+       case NOTMUCH_STATUS_READ_ONLY_DATABASE:
        case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
        case NOTMUCH_STATUS_OUT_OF_MEMORY:
            fprintf (stderr, "Error: %s. Halting processing.\n",
@@ -430,6 +437,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)