notmuch: Ignore files that don't look like email messages.
[notmuch] / notmuch.c
index 5853fe55fe0f3b6c9d2a8f842a72809269298e97..01000c2a823c8edc815addca4534e2a8b44ff962 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -79,11 +79,9 @@ read_line (void)
 }
 
 typedef struct {
-    int messages_total;
+    int total_messages;
     int count;
-    int count_last;
     struct timeval tv_start;
-    struct timeval tv_last;
 } add_files_state_t;
 
 /* Compute the number of seconds elapsed from start to end. */
@@ -102,47 +100,37 @@ print_formatted_seconds (double seconds)
 
     if (seconds > 3600) {
        hours = (int) seconds / 3600;
-       printf ("%d:", hours);
+       printf ("%d", hours);
        seconds -= hours * 3600;
     }
 
-    if (seconds > 60)
+    if (seconds > 60) {
        minutes = (int) seconds / 60;
-    else
-       minutes = 0;
-
-    printf ("%02d:", minutes);
-    seconds -= minutes * 60;
+       printf ("%dm ", minutes);
+       seconds -= minutes * 60;
+    }
 
-    printf ("%02d", (int) seconds);
+    printf ("%02ds", (int) seconds);
 }
 
 void
 add_files_print_progress (add_files_state_t *state)
 {
     struct timeval tv_now;
-    double ratio_complete;
-    double elapsed_current, rate_current;
-    double elapsed_overall;
+    double elapsed_overall, rate_overall;
 
     gettimeofday (&tv_now, NULL);
 
-    ratio_complete = (double) state->count / state->messages_total;
-    elapsed_current = tv_elapsed (state->tv_last, tv_now);
-    rate_current = (state->count - state->count_last) / elapsed_current;
     elapsed_overall = tv_elapsed (state->tv_start, tv_now);
+    rate_overall = (state->count) / elapsed_overall;
 
-    printf ("Added %d messages at %d messages/sec. ",
-           state->count, (int) rate_current);
-    print_formatted_seconds (elapsed_overall);
-    printf ("/");
-    print_formatted_seconds (elapsed_overall / ratio_complete);
-    printf (" elapsed (%.2f%%).     \r", 100 * ratio_complete);
+    printf ("Added %d of %d messages (",
+           state->count, state->total_messages);
+    print_formatted_seconds ((state->total_messages - state->count) /
+                            rate_overall);
+    printf (" remaining).\r");
 
     fflush (stdout);
-
-    state->tv_last = tv_now;
-    state->count_last = state->count;
 }
 
 /* Recursively find all regular files in 'path' and add them to the
@@ -157,6 +145,7 @@ add_files (notmuch_database_t *notmuch, const char *path,
     int err;
     char *next;
     struct stat st;
+    notmuch_status_t status;
 
     dir = opendir (path);
 
@@ -199,8 +188,13 @@ add_files (notmuch_database_t *notmuch, const char *path,
        stat (next, &st);
 
        if (S_ISREG (st.st_mode)) {
-           notmuch_database_add_message (notmuch, next);
-           state->count++;
+           status = notmuch_database_add_message (notmuch, next);
+           if (status == NOTMUCH_STATUS_FILE_NOT_EMAIL) {
+               fprintf (stderr, "Note: Ignoring non-mail file: %s\n",
+                        next);
+           } else {
+               state->count++;
+           }
            if (state->count % 1000 == 0)
                add_files_print_progress (state);
        } else if (S_ISDIR (st.st_mode)) {
@@ -295,6 +289,7 @@ setup_command (int argc, char *argv[])
     int count;
     add_files_state_t add_files_state;
     double elapsed;
+    struct timeval tv_now;
 
     printf ("Welcome to notmuch!\n\n");
 
@@ -304,9 +299,10 @@ setup_command (int argc, char *argv[])
     printf ("Notmuch needs to know the top-level directory of your email archive,\n"
            "(where you already have mail stored and where messages will be delivered\n"
            "in the future). This directory can contain any number of sub-directories\n"
-           "but the only files it contains should be individual email messages.\n"
-           "Either maildir or mh format directories are fine, but you will want to\n"
-           "move away any auxiliary files maintained by other email programs.\n\n");
+           "and primarily just files with indvidual email messages (eg. maildir or mh\n"
+           "archives are perfect). If there are other, non-email files (such as\n"
+           "indexes maintained by other email programs) then notmuch will do its\n"
+           "best to detect those and ignore them.\n\n");
 
     printf ("Mail storage that uses mbox format, (where one mbox file contains many\n"
            "messages), will not work with notmuch. If that's how your mail is currently\n"
@@ -353,17 +349,15 @@ setup_command (int argc, char *argv[])
 
     printf ("Next, we'll inspect the messages and create a database of threads:\n");
 
-    add_files_state.messages_total = count;
+    add_files_state.total_messages = count;
     add_files_state.count = 0;
-    add_files_state.count_last = 0;
     gettimeofday (&add_files_state.tv_start, NULL);
-    add_files_state.tv_last = add_files_state.tv_start;
 
     add_files (notmuch, mail_directory, &add_files_state);
 
-    gettimeofday (&add_files_state.tv_last, NULL);
+    gettimeofday (&tv_now, NULL);
     elapsed = tv_elapsed (add_files_state.tv_start,
-                         add_files_state.tv_last);
+                         tv_now);
     printf ("Added %d total messages in ", add_files_state.count);
     print_formatted_seconds (elapsed);
     printf (" (%d messages/sec.).                 \n", (int) (add_files_state.count / elapsed));