]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.c
notmuch setup: Clean up the progress printing a bit.
[notmuch] / notmuch.c
index e1409209e43694aca6f5896deb1f7484d9d3d2ac..770db73abcce4ea73df9aea191e78611f8714609 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
  * Author: Carl Worth <cworth@cworth.org>
  */
 
-#include "notmuch.h"
-
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE /* for getline */
 #endif
+#include <stdio.h>
+
+#include "notmuch.h"
 
 /* This is separate from notmuch-private.h because we're trying to
  * keep notmuch.c from looking into any internals, (which helps us
@@ -30,7 +31,6 @@
  */
 #include "xutil.h"
 
-#include <stdio.h>
 #include <stddef.h>
 #include <string.h>
 #include <sys/stat.h>
@@ -54,8 +54,9 @@ typedef struct command {
 } command_t;
 
 typedef struct {
-    int total_messages;
-    int count;
+    int total_files;
+    int processed_files;
+    int added_messages;
     struct timeval tv_start;
 } add_files_state_t;
 
@@ -92,7 +93,7 @@ print_formatted_seconds (double seconds)
        seconds -= minutes * 60;
     }
 
-    printf ("%02ds", (int) seconds);
+    printf ("%ds", (int) seconds);
 }
 
 void
@@ -104,13 +105,18 @@ add_files_print_progress (add_files_state_t *state)
     gettimeofday (&tv_now, NULL);
 
     elapsed_overall = tv_elapsed (state->tv_start, tv_now);
-    rate_overall = (state->count) / elapsed_overall;
+    rate_overall = (state->processed_files) / elapsed_overall;
+
+    printf ("Processed %d", state->processed_files);
 
-    printf ("Added %d of %d messages (",
-           state->count, state->total_messages);
-    print_formatted_seconds ((state->total_messages - state->count) /
-                            rate_overall);
-    printf (" remaining).      \r");
+    if (state->total_files) {
+       printf (" of %d files (", state->total_files);
+       print_formatted_seconds ((state->total_files - state->processed_files) /
+                                rate_overall);
+       printf (" remaining).      \r");
+    } else {
+       printf (" files (%d files/sec.)    \r", (int) rate_overall);
+    }
 
     fflush (stdout);
 }
@@ -170,14 +176,15 @@ add_files (notmuch_database_t *notmuch, const char *path,
        stat (next, &st);
 
        if (S_ISREG (st.st_mode)) {
+           state->processed_files++;
            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++;
+           } else if (status != NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) {
+               state->added_messages++;
            }
-           if (state->count % 1000 == 0)
+           if (state->processed_files % 1000 == 0)
                add_files_print_progress (state);
        } else if (S_ISDIR (st.st_mode)) {
            add_files (notmuch, next, state);
@@ -266,13 +273,14 @@ count_files (const char *path, int *count)
 int
 setup_command (int argc, char *argv[])
 {
-    notmuch_database_t *notmuch;
-    char *mail_directory, *default_path;
+    notmuch_database_t *notmuch = NULL;
+    char *default_path, *mail_directory = NULL;
     size_t line_size;
     int count;
     add_files_state_t add_files_state;
     double elapsed;
     struct timeval tv_now;
+    notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
 
     printf ("Welcome to notmuch!\n\n");
 
@@ -298,7 +306,6 @@ setup_command (int argc, char *argv[])
     printf ("Top-level mail directory [%s]: ", default_path);
     fflush (stdout);
 
-    mail_directory = NULL;
     getline (&mail_directory, &line_size, stdin);
     chomp_newline (mail_directory);
 
@@ -328,8 +335,8 @@ setup_command (int argc, char *argv[])
     if (notmuch == NULL) {
        fprintf (stderr, "Failed to create new notmuch database at %s\n",
                 mail_directory);
-       free (mail_directory);
-       return 1;
+       ret = NOTMUCH_STATUS_FILE_ERROR;
+       goto DONE;
     }
 
     printf ("OK. Let's take a look at the mail we can find in the directory\n");
@@ -342,8 +349,9 @@ setup_command (int argc, char *argv[])
 
     printf ("Next, we'll inspect the messages and create a database of threads:\n");
 
-    add_files_state.total_messages = count;
-    add_files_state.count = 0;
+    add_files_state.total_files = count;
+    add_files_state.processed_files = 0;
+    add_files_state.added_messages = 0;
     gettimeofday (&add_files_state.tv_start, NULL);
 
     add_files (notmuch, mail_directory, &add_files_state);
@@ -351,15 +359,24 @@ setup_command (int argc, char *argv[])
     gettimeofday (&tv_now, NULL);
     elapsed = tv_elapsed (add_files_state.tv_start,
                          tv_now);
-    printf ("Added %d total messages in ", add_files_state.count);
+    printf ("Processed %d total files in ", add_files_state.processed_files);
     print_formatted_seconds (elapsed);
-    printf (" (%d messages/sec.).                 \n", (int) (add_files_state.count / elapsed));
+    printf (" (%d files/sec.).                 \n",
+           (int) (add_files_state.processed_files / elapsed));
+    printf ("Added %d unique messages to the database.\n\n",
+           add_files_state.added_messages);
 
-    notmuch_database_close (notmuch);
+    printf ("When new mail is delivered to %s in the future,\n"
+           "run \"notmuch new\" to add it to the database.\n",
+           mail_directory);
 
-    free (mail_directory);
+  DONE:
+    if (mail_directory)
+       free (mail_directory);
+    if (notmuch)
+       notmuch_database_close (notmuch);
     
-    return 0;
+    return ret;
 }
 
 int
@@ -380,7 +397,7 @@ int
 dump_command (int argc, char *argv[])
 {
     FILE *output;
-    notmuch_database_t *notmuch = NULL;
+    notmuch_database_t *notmuch;
     notmuch_query_t *query;
     notmuch_results_t *results;
     notmuch_message_t *message;
@@ -456,7 +473,7 @@ int
 restore_command (int argc, char *argv[])
 {
     FILE *input;
-    notmuch_database_t *notmuch = NULL;
+    notmuch_database_t *notmuch;
     char *line = NULL;
     size_t line_size, line_len;
     regex_t regex;
@@ -515,9 +532,8 @@ restore_command (int argc, char *argv[])
 
            message = notmuch_database_find_message (notmuch, message_id);
            if (message == NULL) {
-               fprintf (stderr, "Warning: Cannot apply tags to missing message: %s\n",
+               fprintf (stderr, "Warning: Cannot apply tags to missing message: %s (",
                         message_id);
-               goto NEXT_LINE;
            }
 
            next = tags;
@@ -525,19 +541,25 @@ restore_command (int argc, char *argv[])
                tag = strsep (&next, " ");
                if (*tag == '\0')
                    continue;
-               status = notmuch_message_add_tag (message, tag);
-               if (status) {
-                   fprintf (stderr,
-                            "Error applying tag %s to message %s:\n",
-                            tag, message_id);
-                   fprintf (stderr, "%s\n",
-                            notmuch_status_to_string (status));
+               if (message) {
+                   status = notmuch_message_add_tag (message, tag);
+                   if (status) {
+                       fprintf (stderr,
+                                "Error applying tag %s to message %s:\n",
+                                tag, message_id);
+                       fprintf (stderr, "%s\n",
+                                notmuch_status_to_string (status));
+                   }
+               } else {
+                   fprintf (stderr, "%s ", tag);
                }
            }
 
-           notmuch_message_destroy (message);
+           if (message)
+               notmuch_message_destroy (message);
+           else
+               fprintf (stderr, ")\n");
        }
-      NEXT_LINE:
        free (message_id);
        free (tags);
     }