From: Ethan Glasser-Camp <et...@betacantrips.com>

This is part of notmuch-new refactor phase 1: make add_files stuff
safe for other backends. add_files_recursive is essentially a
maildir-crawling function that periodically adds files to the database
or adds filenames to remove_files or remove_directory lists. I don't
see an easy way to adapt add_files_recursive for other backends who
might not have concepts of directories with other directories inside
of them, so instead just provide an add_files method for each backend.

This patch pulls some bits out of add_files_recursive which will be
useful for other backends: two reporting functions
_report_before_adding_file and _report_added_file, as well as
_add_message, which actually does the message adding.

Signed-off-by: Ethan Glasser-Camp <et...@betacantrips.com>
---
 notmuch-new.c |  193 +++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 120 insertions(+), 73 deletions(-)

diff --git a/notmuch-new.c b/notmuch-new.c
index 355dde4..dbdfbb6 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -181,6 +181,123 @@ _entries_resemble_maildir (struct dirent **entries, int 
count)
     return 0;
 }
 
+/* Progress-reporting function.
+ *
+ * Can be used by any mailstore-crawling function that wants to alert
+ * users what message it's about to add. Subsequent errors will be due
+ * to this message ;)
+ */
+static void
+_report_before_adding_file (add_files_state_t *state, const char *filename)
+{
+    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,
+               filename);
+
+       putchar((state->output_is_a_tty) ? '\r' : '\n');
+       fflush (stdout);
+    }
+}
+
+/* Progress-reporting function.
+ *
+ * Call this to respond to the signal handler for SIGALRM.
+ */
+static void
+_report_added_file (add_files_state_t *state)
+{
+    if (do_print_progress) {
+       do_print_progress = 0;
+       generic_print_progress ("Processed", "files", state->tv_start,
+                               state->processed_files, state->total_files);
+    }
+}
+
+
+/* Atomically handles adding a message to the database.
+ *
+ * Should be used by any mailstore-crawling function that finds a new
+ * message to add.
+ */
+static notmuch_status_t
+_add_message (add_files_state_t *state, notmuch_database_t *notmuch,
+             const char *filename)
+{
+    notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS;
+    notmuch_message_t *message;
+    const char **tag;
+
+    status = notmuch_database_begin_atomic (notmuch);
+    if (status) {
+       ret = status;
+       goto DONE;
+    }
+
+    status = notmuch_database_add_message (notmuch, filename, &message);
+
+    switch (status) {
+    /* success */
+    case NOTMUCH_STATUS_SUCCESS:
+       state->added_messages++;
+       notmuch_message_freeze (message);
+       for (tag=state->new_tags; *tag != NULL; tag++)
+           notmuch_message_add_tag (message, *tag);
+       if (state->synchronize_flags == TRUE)
+           notmuch_message_maildir_flags_to_tags (message);
+       notmuch_message_thaw (message);
+       break;
+    /* Non-fatal issues (go on to next file) */
+    case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
+       if (state->synchronize_flags == TRUE)
+           notmuch_message_maildir_flags_to_tags (message);
+       break;
+    case NOTMUCH_STATUS_FILE_NOT_EMAIL:
+       fprintf (stderr, "Note: Ignoring non-mail file: %s\n",
+                filename);
+       break;
+    /* Fatal issues. Don't process anymore. */
+    case NOTMUCH_STATUS_READ_ONLY_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_UNBALANCED_ATOMIC:
+    case NOTMUCH_STATUS_LAST_STATUS:
+       INTERNAL_ERROR ("add_message returned unexpected value: %d",  status);
+       ret = status;
+       goto DONE;
+    }
+
+    status = notmuch_database_end_atomic (notmuch);
+    if (status) {
+       ret = status;
+       goto DONE;
+    }
+
+  DONE:
+    if (message) {
+       notmuch_message_destroy (message);
+       message = NULL;
+    }
+
+    return ret;
+}
+
+
 /* Examine 'path' recursively as follows:
  *
  *   o Ask the filesystem for the mtime of 'path' (fs_mtime)
@@ -232,7 +349,6 @@ add_files_recursive (notmuch_database_t *notmuch,
     char *next = NULL;
     time_t fs_mtime, db_mtime;
     notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS;
-    notmuch_message_t *message = NULL;
     struct dirent **fs_entries = NULL;
     int i, num_fs_entries;
     notmuch_directory_t *directory;
@@ -241,7 +357,6 @@ add_files_recursive (notmuch_database_t *notmuch,
     time_t stat_time;
     struct stat st;
     notmuch_bool_t is_maildir, new_directory;
-    const char **tag;
 
     if (stat (path, &st)) {
        fprintf (stderr, "Error reading directory %s: %s\n",
@@ -439,83 +554,15 @@ add_files_recursive (notmuch_database_t *notmuch,
         * in the database, so add it. */
        next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name);
 
-       state->processed_files++;
-
-       if (state->verbose) {
-           if (state->output_is_a_tty)
-               printf("\r\033[K");
+       _report_before_adding_file (state, next);
 
-           printf ("%i/%i: %s",
-                   state->processed_files,
-                   state->total_files,
-                   next);
-
-           putchar((state->output_is_a_tty) ? '\r' : '\n');
-           fflush (stdout);
-       }
-
-       status = notmuch_database_begin_atomic (notmuch);
+       status = _add_message (state, notmuch, next);
        if (status) {
            ret = status;
            goto DONE;
        }
 
-       status = notmuch_database_add_message (notmuch, next, &message);
-       switch (status) {
-       /* success */
-       case NOTMUCH_STATUS_SUCCESS:
-           state->added_messages++;
-           notmuch_message_freeze (message);
-           for (tag=state->new_tags; *tag != NULL; tag++)
-               notmuch_message_add_tag (message, *tag);
-           if (state->synchronize_flags == TRUE)
-               notmuch_message_maildir_flags_to_tags (message);
-           notmuch_message_thaw (message);
-           break;
-       /* Non-fatal issues (go on to next file) */
-       case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
-           if (state->synchronize_flags == TRUE)
-               notmuch_message_maildir_flags_to_tags (message);
-           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_READ_ONLY_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_UNBALANCED_ATOMIC:
-       case NOTMUCH_STATUS_LAST_STATUS:
-           INTERNAL_ERROR ("add_message returned unexpected value: %d",  
status);
-           goto DONE;
-       }
-
-       status = notmuch_database_end_atomic (notmuch);
-       if (status) {
-           ret = status;
-           goto DONE;
-       }
-
-       if (message) {
-           notmuch_message_destroy (message);
-           message = NULL;
-       }
-
-       if (do_print_progress) {
-           do_print_progress = 0;
-           generic_print_progress ("Processed", "files", state->tv_start,
-                                   state->processed_files, state->total_files);
-       }
+       _report_added_file (state);
 
        talloc_free (next);
        next = NULL;
-- 
1.7.5.4

_______________________________________________
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch

Reply via email to