]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-new.c
new: Remove workaround for detecting newly created directory objects
[notmuch] / notmuch-new.c
index 3ff630478c613848f342ddbdb42fa625484254d0..72dd558d0fa150288eb15a14ea6aee5f6b00f135 100644 (file)
@@ -250,13 +250,13 @@ add_files_recursive (notmuch_database_t *notmuch,
     notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS;
     notmuch_message_t *message = NULL;
     struct dirent **fs_entries = NULL;
-    int i, num_fs_entries;
+    int i, num_fs_entries = 0;
     notmuch_directory_t *directory;
     notmuch_filenames_t *db_files = NULL;
     notmuch_filenames_t *db_subdirs = NULL;
     time_t stat_time;
     struct stat st;
-    notmuch_bool_t is_maildir, new_directory;
+    notmuch_bool_t is_maildir;
     const char **tag;
 
     if (stat (path, &st)) {
@@ -274,36 +274,19 @@ add_files_recursive (notmuch_database_t *notmuch,
 
     fs_mtime = st.st_mtime;
 
-    directory = notmuch_database_get_directory (notmuch, path);
-    db_mtime = notmuch_directory_get_mtime (directory);
-
-    new_directory = db_mtime ? FALSE : TRUE;
-
-    /* XXX This is a temporary workaround.  If we don't update the
-     * database mtime until after processing messages in this
-     * directory, then a 0 mtime is *not* sufficient to indicate that
-     * this directory has no messages or subdirs in the database (for
-     * example, if an earlier run skipped the mtime update because
-     * fs_mtime == stat_time, or was interrupted before updating the
-     * mtime at the end).  To address this, we record a (bogus)
-     * non-zero value before processing any child messages so that a
-     * later run won't mistake this for a new directory (and, for
-     * example, fail to detect removed files and subdirs).
-     *
-     * A better solution would be for notmuch_database_get_directory
-     * to indicate if it really created a new directory or not, either
-     * by a new out-argument, or by recording this information and
-     * providing an accessor.
-     */
-    if (new_directory)
-       notmuch_directory_set_mtime (directory, -1);
+    status = notmuch_database_get_directory (notmuch, path, &directory);
+    if (status) {
+       ret = status;
+       goto DONE;
+    }
+    db_mtime = directory ? notmuch_directory_get_mtime (directory) : 0;
 
     /* 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,
-                             new_directory ?
-                             dirent_sort_inode : dirent_sort_strcmp_name);
+                             directory ?
+                             dirent_sort_strcmp_name : dirent_sort_inode);
 
     if (num_fs_entries == -1) {
        fprintf (stderr, "Error opening directory %s: %s\n",
@@ -372,13 +355,12 @@ add_files_recursive (notmuch_database_t *notmuch,
      * being discovered until the clock catches up and the directory
      * is modified again).
      */
-    if (fs_mtime == db_mtime)
+    if (directory && fs_mtime == db_mtime)
        goto DONE;
 
-    /* new_directory means a directory that the database has never
-     * seen before. In that case, we can simply leave db_files and
-     * db_subdirs NULL. */
-    if (!new_directory) {
+    /* If the database has never seen this directory before, we can
+     * simply leave db_files and db_subdirs NULL. */
+    if (directory) {
        db_files = notmuch_directory_get_child_files (directory);
        db_subdirs = notmuch_directory_get_child_directories (directory);
     }
@@ -810,7 +792,9 @@ _remove_directory (void *ctx,
     notmuch_filenames_t *files, *subdirs;
     char *absolute;
 
-    directory = notmuch_database_get_directory (notmuch, path);
+    status = notmuch_database_get_directory (notmuch, path, &directory);
+    if (status || !directory)
+       return status;
 
     for (files = notmuch_directory_get_child_files (directory);
         notmuch_filenames_valid (files);
@@ -900,12 +884,12 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
            return 1;
 
        printf ("Found %d total files (that's not much mail).\n", count);
-       notmuch = notmuch_database_create (db_path);
+       if (notmuch_database_create (db_path, &notmuch))
+           return 1;
        add_files_state.total_files = count;
     } else {
-       notmuch = notmuch_database_open (db_path,
-                                        NOTMUCH_DATABASE_MODE_READ_WRITE);
-       if (notmuch == NULL)
+       if (notmuch_database_open (db_path, NOTMUCH_DATABASE_MODE_READ_WRITE,
+                                  &notmuch))
            return 1;
 
        if (notmuch_database_needs_upgrade (notmuch)) {
@@ -981,9 +965,10 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
     }
 
     for (f = add_files_state.directory_mtimes->head; f && !interrupted; f = f->next) {
+       notmuch_status_t status;
        notmuch_directory_t *directory;
-       directory = notmuch_database_get_directory (notmuch, f->filename);
-       if (directory) {
+       status = notmuch_database_get_directory (notmuch, f->filename, &directory);
+       if (status == NOTMUCH_STATUS_SUCCESS && directory) {
            notmuch_directory_set_mtime (directory, f->mtime);
            notmuch_directory_destroy (directory);
        }