]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.c
add_files: Change to return a status value instead of void
[notmuch] / notmuch.c
index 24a447970db868c55ac21904083be4d8b722ee8a..bd739c857f7f8a4f6d92be813d7f4a9efb86b2c6 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -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,37 +105,42 @@ 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);
 }
 
 /* Recursively find all regular files in 'path' and add them to the
  * database. */
-void
+notmuch_status_t
 add_files (notmuch_database_t *notmuch, const char *path,
           add_files_state_t *state)
 {
-    DIR *dir;
-    struct dirent *entry, *e;
+    DIR *dir = NULL;
+    struct dirent *e, *entry = NULL;
     int entry_length;
     int err;
-    char *next;
+    char *next = NULL;
     struct stat st;
-    notmuch_status_t status;
+    notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS;
 
     dir = opendir (path);
-
     if (dir == NULL) {
        fprintf (stderr, "Warning: failed to open directory %s: %s\n",
                 path, strerror (errno));
-       return;
+       ret = NOTMUCH_STATUS_FILE_ERROR;
+       goto DONE;
     }
 
     entry_length = offsetof (struct dirent, d_name) +
@@ -146,8 +152,8 @@ add_files (notmuch_database_t *notmuch, const char *path,
        if (err) {
            fprintf (stderr, "Error reading directory: %s\n",
                     strerror (errno));
-           free (entry);
-           return;
+           ret = NOTMUCH_STATUS_FILE_ERROR;
+           goto DONE;
        }
 
        if (e == NULL)
@@ -167,28 +173,43 @@ add_files (notmuch_database_t *notmuch, const char *path,
 
        next = g_strdup_printf ("%s/%s", path, entry->d_name);
 
-       stat (next, &st);
+       if (stat (next, &st)) {
+           fprintf (stderr, "Error reading %s: %s\n",
+                    next, strerror (errno));
+           ret = NOTMUCH_STATUS_FILE_ERROR;
+           continue;
+       }
 
        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);
+           status = add_files (notmuch, next, state);
+           if (status && ret == NOTMUCH_STATUS_SUCCESS)
+               ret = status;
        }
 
        free (next);
+       next = NULL;
     }
 
-    free (entry);
+  DONE:
+    if (next)
+       free (next);
+    if (entry)
+       free (entry);
+    if (dir)
+       closedir (dir);
 
-    closedir (dir);
+    return ret;
 }
 
 /* Recursively count all regular files in path and all sub-direcotries
@@ -342,25 +363,38 @@ 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);
+    ret = add_files (notmuch, mail_directory, &add_files_state);
 
     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);
+
+    printf ("When new mail is delivered to %s in the future,\n"
+           "run \"notmuch new\" to add it to the database.\n",
+           mail_directory);
+
+    if (ret) {
+       printf ("Note: At least one error was encountered: %s\n",
+               notmuch_status_to_string (ret));
+    }
 
   DONE:
     if (mail_directory)
        free (mail_directory);
     if (notmuch)
        notmuch_database_close (notmuch);
-    
+
     return ret;
 }