]> git.notmuchmail.org Git - notmuch/commitdiff
notmuch new: Eliminate the check on the mtime of regular files before adding.
authorCarl Worth <cworth@cworth.org>
Tue, 5 Jan 2010 23:59:11 +0000 (15:59 -0800)
committerCarl Worth <cworth@cworth.org>
Wed, 6 Jan 2010 18:32:06 +0000 (10:32 -0800)
This check was buggy in that moving a pre-existing file into the mail
store, (where the file existed before the last run of "notmuch new"),
does not update the mtime of the file. So the message would never be
added to the database.

The fix here is not practical in the long run, (since it causes *all*
files in the mail store to be processed in every run of "notmuch new"
(!)). But this change will let us drop a stat() call that we don't
otherwise need and will help move us toward proper database-backed
detection of new files, (which will fix the bug without the
performance impact of the current fix).

notmuch-new.c

index 6df4ad9f3dee001c21fa0fea5a091cb53a9bf8e7..fe280d841c8f50ce2b84ff94c04770b648c32606 100644 (file)
@@ -127,9 +127,8 @@ is_maildir (struct dirent **entries, int count)
  *
  *   o If 'fs_mtime' > 'db_mtime'
  *
- *       o For each regular file in 'path' with mtime newer than the
- *         'db_mtime' call add_message to add the file to the
- *         database.
+ *       o For each regular file directly within 'path', call
+ *         add_message to add the file to the database.
  *
  *   o For each sub-directory of path, recursively call into this
  *     same function.
@@ -219,66 +218,62 @@ add_files_recursive (notmuch_database_t *notmuch,
        }
 
        if (S_ISREG (st->st_mode)) {
-           /* If the file hasn't been modified since the last
-            * add_files, then we need not look at it. */
-           if (db_mtime == 0 || st->st_mtime > db_mtime) {
-               state->processed_files++;
-
-               if (state->verbose) {
-                   if (state->output_is_a_tty)
-                       printf("\r\033[K");
-
-                   printf ("%i/%i: %s",
-                           state->processed_files,
-                           state->total_files,
-                           next);
-
-                   putchar((state->output_is_a_tty) ? '\r' : '\n');
-                   fflush (stdout);
-               }
-
-               status = notmuch_database_add_message (notmuch, next, &message);
-               switch (status) {
-                   /* success */
-                   case NOTMUCH_STATUS_SUCCESS:
-                       state->added_messages++;
-                       tag_inbox_and_unread (message);
-                       break;
-                   /* Non-fatal issues (go on to next file) */
-                   case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
-                       /* Stay silent on this one. */
-                       break;
-                   case NOTMUCH_STATUS_FILE_NOT_EMAIL:
-                       fprintf (stderr, "Note: Ignoring non-mail file: %s\n",
-                                next);
-                       break;
-                   /* Fatal issues. Don't process anymore. */
-                   case NOTMUCH_STATUS_READONLY_DATABASE:
-                   case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
-                   case NOTMUCH_STATUS_OUT_OF_MEMORY:
-                       fprintf (stderr, "Error: %s. Halting processing.\n",
-                                notmuch_status_to_string (status));
-                       ret = status;
-                       goto DONE;
-                   default:
-                   case NOTMUCH_STATUS_FILE_ERROR:
-                   case NOTMUCH_STATUS_NULL_POINTER:
-                   case NOTMUCH_STATUS_TAG_TOO_LONG:
-                   case NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW:
-                   case NOTMUCH_STATUS_LAST_STATUS:
-                       INTERNAL_ERROR ("add_message returned unexpected value: %d",  status);
-                       goto DONE;
-               }
-
-               if (message) {
-                   notmuch_message_destroy (message);
-                   message = NULL;
-               }
-
-               if (do_add_files_print_progress) {
-                   do_add_files_print_progress = 0;
-                   add_files_print_progress (state);
-               }
+           state->processed_files++;
+
+           if (state->verbose) {
+               if (state->output_is_a_tty)
+                   printf("\r\033[K");
+
+               printf ("%i/%i: %s",
+                       state->processed_files,
+                       state->total_files,
+                       next);
+
+               putchar((state->output_is_a_tty) ? '\r' : '\n');
+               fflush (stdout);
+           }
+
+           status = notmuch_database_add_message (notmuch, next, &message);
+           switch (status) {
+           /* success */
+           case NOTMUCH_STATUS_SUCCESS:
+               state->added_messages++;
+               tag_inbox_and_unread (message);
+               break;
+           /* Non-fatal issues (go on to next file) */
+           case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
+               /* Stay silent on this one. */
+               break;
+           case NOTMUCH_STATUS_FILE_NOT_EMAIL:
+               fprintf (stderr, "Note: Ignoring non-mail file: %s\n",
+                        next);
+               break;
+           /* Fatal issues. Don't process anymore. */
+           case NOTMUCH_STATUS_READONLY_DATABASE:
+           case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
+           case NOTMUCH_STATUS_OUT_OF_MEMORY:
+               fprintf (stderr, "Error: %s. Halting processing.\n",
+                        notmuch_status_to_string (status));
+               ret = status;
+               goto DONE;
+           default:
+           case NOTMUCH_STATUS_FILE_ERROR:
+           case NOTMUCH_STATUS_NULL_POINTER:
+           case NOTMUCH_STATUS_TAG_TOO_LONG:
+           case NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW:
+           case NOTMUCH_STATUS_LAST_STATUS:
+               INTERNAL_ERROR ("add_message returned unexpected value: %d",  status);
+               goto DONE;
+           }
+
+           if (message) {
+               notmuch_message_destroy (message);
+               message = NULL;
+           }
+
+           if (do_add_files_print_progress) {
+               do_add_files_print_progress = 0;
+               add_files_print_progress (state);
            }
        } else if (S_ISDIR (st->st_mode)) {
            status = add_files_recursive (notmuch, next, st, state);