notmuch new: Unbreak after the addition of notmuch-config.
authorCarl Worth <cworth@cworth.org>
Thu, 12 Nov 2009 03:50:15 +0000 (19:50 -0800)
committerCarl Worth <cworth@cworth.org>
Thu, 12 Nov 2009 03:50:15 +0000 (19:50 -0800)
Pull in the code from add-files.c now that notmuch_new_command is
the only user, (we no longer have notmuch_setup_command adding any
messages).

Makefile.local
add-files.c [deleted file]
notmuch-new.c
notmuch-setup.c
notmuch.c

index b049e5bf994182201c17b7f247e07df6c59ca740..af96484e8591334367a114fb21ac59fbd493586c 100644 (file)
@@ -12,7 +12,6 @@ notmuch_client_srcs =         \
        notmuch-show.c          \
        notmuch-tag.c           \
        notmuch-time.c          \
-       add-files.c             \
        gmime-filter-reply.c    \
        query-string.c          \
        show-message.c
diff --git a/add-files.c b/add-files.c
deleted file mode 100644 (file)
index 7b9639b..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-/* notmuch - Not much of an email program, (just index and search)
- *
- * Copyright © 2009 Carl Worth
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see http://www.gnu.org/licenses/ .
- *
- * Author: Carl Worth <cworth@cworth.org>
- */
-
-#include "notmuch-client.h"
-
-static volatile sig_atomic_t do_add_files_print_progress = 0;
-
-static void
-handle_sigalrm (unused (int signal))
-{
-    do_add_files_print_progress = 1;
-}
-
-static void
-add_files_print_progress (add_files_state_t *state)
-{
-    struct timeval tv_now;
-    double elapsed_overall, rate_overall;
-
-    gettimeofday (&tv_now, NULL);
-
-    elapsed_overall = notmuch_time_elapsed (state->tv_start, tv_now);
-    rate_overall = (state->processed_files) / elapsed_overall;
-
-    printf ("Processed %d", state->processed_files);
-
-    if (state->total_files) {
-       double time_remaining;
-
-       time_remaining = ((state->total_files - state->processed_files) /
-                         rate_overall);
-       printf (" of %d files (", state->total_files);
-       notmuch_time_print_formatted_seconds (time_remaining);
-       printf (" remaining).      \r");
-    } else {
-       printf (" files (%d files/sec.)    \r", (int) rate_overall);
-    }
-
-    fflush (stdout);
-}
-
-/* Examine 'path' recursively as follows:
- *
- *   o Ask the filesystem for the mtime of 'path' (path_mtime)
- *
- *   o Ask the database for its timestamp of 'path' (path_dbtime)
- *
- *   o If 'path_mtime' > 'path_dbtime'
- *
- *       o For each regular file in 'path' with mtime newer than the
- *         'path_dbtime' call add_message to add the file to the
- *         database.
- *
- *       o For each sub-directory of path, recursively call into this
- *         same function.
- *
- *   o Tell the database to update its time of 'path' to 'path_mtime'
- *
- * The 'struct stat *st' must point to a structure that has already
- * been initialized for 'path' by calling stat().
- */
-static notmuch_status_t
-add_files_recursive (notmuch_database_t *notmuch,
-                    const char *path,
-                    struct stat *st,
-                    add_files_state_t *state)
-{
-    DIR *dir = NULL;
-    struct dirent *e, *entry = NULL;
-    int entry_length;
-    int err;
-    char *next = NULL;
-    time_t path_mtime, path_dbtime;
-    notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS;
-    notmuch_message_t *message = NULL, **closure;
-
-    /* If we're told to, we bail out on encountering a read-only
-     * directory, (with this being a clear clue from the user to
-     * Notmuch that new mail won't be arriving there and we need not
-     * look. */
-    if (state->ignore_read_only_directories &&
-       (st->st_mode & S_IWUSR) == 0)
-    {
-       state->saw_read_only_directory = TRUE;
-       goto DONE;
-    }
-
-    path_mtime = st->st_mtime;
-
-    path_dbtime = notmuch_database_get_timestamp (notmuch, path);
-
-    dir = opendir (path);
-    if (dir == NULL) {
-       fprintf (stderr, "Error opening directory %s: %s\n",
-                path, strerror (errno));
-       ret = NOTMUCH_STATUS_FILE_ERROR;
-       goto DONE;
-    }
-
-    entry_length = offsetof (struct dirent, d_name) +
-       pathconf (path, _PC_NAME_MAX) + 1;
-    entry = malloc (entry_length);
-
-    while (1) {
-       err = readdir_r (dir, entry, &e);
-       if (err) {
-           fprintf (stderr, "Error reading directory: %s\n",
-                    strerror (errno));
-           ret = NOTMUCH_STATUS_FILE_ERROR;
-           goto DONE;
-       }
-
-       if (e == NULL)
-           break;
-
-       /* If this directory hasn't been modified since the last
-        * add_files, then we only need to look further for
-        * sub-directories. */
-       if (path_mtime <= path_dbtime && entry->d_type != DT_DIR)
-           continue;
-
-       /* Ignore special directories to avoid infinite recursion.
-        * Also ignore the .notmuch directory.
-        */
-       /* XXX: Eventually we'll want more sophistication to let the
-        * user specify files to be ignored. */
-       if (strcmp (entry->d_name, ".") == 0 ||
-           strcmp (entry->d_name, "..") == 0 ||
-           strcmp (entry->d_name, ".notmuch") ==0)
-       {
-           continue;
-       }
-
-       next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name);
-
-       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)) {
-           /* If the file hasn't been modified since the last
-            * add_files, then we need not look at it. */
-           if (st->st_mtime > path_dbtime) {
-               state->processed_files++;
-
-               if (state->callback)
-                   closure = &message;
-               else
-                   closure = NULL;
-
-               status = notmuch_database_add_message (notmuch, next, closure);
-               switch (status) {
-                   /* success */
-                   case NOTMUCH_STATUS_SUCCESS:
-                       state->added_messages++;
-                       if (state->callback)
-                           (state->callback) (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_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);
-           if (status && ret == NOTMUCH_STATUS_SUCCESS)
-               ret = status;
-       }
-
-       talloc_free (next);
-       next = NULL;
-    }
-
-    status = notmuch_database_set_timestamp (notmuch, path, path_mtime);
-    if (status && ret == NOTMUCH_STATUS_SUCCESS)
-       ret = status;
-
-  DONE:
-    if (next)
-       talloc_free (next);
-    if (entry)
-       free (entry);
-    if (dir)
-       closedir (dir);
-
-    return ret;
-}
-
-/* This is the top-level entry point for add_files. It does a couple
- * of error checks, sets up the progress-printing timer and then calls
- * into the recursive function. */
-notmuch_status_t
-add_files (notmuch_database_t *notmuch,
-          const char *path,
-          add_files_state_t *state)
-{
-    struct stat st;
-    notmuch_status_t status;
-    struct sigaction action;
-    struct itimerval timerval;
-
-    if (stat (path, &st)) {
-       fprintf (stderr, "Error reading directory %s: %s\n",
-                path, strerror (errno));
-       return NOTMUCH_STATUS_FILE_ERROR;
-    }
-
-    if (! S_ISDIR (st.st_mode)) {
-       fprintf (stderr, "Error: %s is not a directory.\n", path);
-       return NOTMUCH_STATUS_FILE_ERROR;
-    }
-
-    /* Setup our handler for SIGALRM */
-    memset (&action, 0, sizeof (struct sigaction));
-    action.sa_handler = handle_sigalrm;
-    sigemptyset (&action.sa_mask);
-    action.sa_flags = SA_RESTART;
-    sigaction (SIGALRM, &action, NULL);
-
-    /* Then start a timer to send SIGALRM once per second. */
-    timerval.it_interval.tv_sec = 1;
-    timerval.it_interval.tv_usec = 0;
-    timerval.it_value.tv_sec = 1;
-    timerval.it_value.tv_usec = 0;
-    setitimer (ITIMER_REAL, &timerval, NULL);
-
-    status = add_files_recursive (notmuch, path, &st, state);
-
-    /* Now stop the timer. */
-    timerval.it_interval.tv_sec = 0;
-    timerval.it_interval.tv_usec = 0;
-    timerval.it_value.tv_sec = 0;
-    timerval.it_value.tv_usec = 0;
-    setitimer (ITIMER_REAL, &timerval, NULL);
-
-    /* And disable the signal handler. */
-    action.sa_handler = SIG_IGN;
-    sigaction (SIGALRM, &action, NULL);
-
-    return status;
-}
index a7bc994b84b2564fc430eeaac0d26738576451ba..7603d3d7b57f0a61236cef9f76afe5e8bd98740e 100644 (file)
 
 #include "notmuch-client.h"
 
+static volatile sig_atomic_t do_add_files_print_progress = 0;
+
+static void
+handle_sigalrm (unused (int signal))
+{
+    do_add_files_print_progress = 1;
+}
+
 static void
 tag_inbox_and_unread (notmuch_message_t *message)
 {
@@ -27,34 +35,396 @@ tag_inbox_and_unread (notmuch_message_t *message)
     notmuch_message_add_tag (message, "unread");
 }
 
+static void
+add_files_print_progress (add_files_state_t *state)
+{
+    struct timeval tv_now;
+    double elapsed_overall, rate_overall;
+
+    gettimeofday (&tv_now, NULL);
+
+    elapsed_overall = notmuch_time_elapsed (state->tv_start, tv_now);
+    rate_overall = (state->processed_files) / elapsed_overall;
+
+    printf ("Processed %d", state->processed_files);
+
+    if (state->total_files) {
+       double time_remaining;
+
+       time_remaining = ((state->total_files - state->processed_files) /
+                         rate_overall);
+       printf (" of %d files (", state->total_files);
+       notmuch_time_print_formatted_seconds (time_remaining);
+       printf (" remaining).      \r");
+    } else {
+       printf (" files (%d files/sec.)    \r", (int) rate_overall);
+    }
+
+    fflush (stdout);
+}
+
+/* Examine 'path' recursively as follows:
+ *
+ *   o Ask the filesystem for the mtime of 'path' (path_mtime)
+ *
+ *   o Ask the database for its timestamp of 'path' (path_dbtime)
+ *
+ *   o If 'path_mtime' > 'path_dbtime'
+ *
+ *       o For each regular file in 'path' with mtime newer than the
+ *         'path_dbtime' call add_message to add the file to the
+ *         database.
+ *
+ *       o For each sub-directory of path, recursively call into this
+ *         same function.
+ *
+ *   o Tell the database to update its time of 'path' to 'path_mtime'
+ *
+ * The 'struct stat *st' must point to a structure that has already
+ * been initialized for 'path' by calling stat().
+ */
+static notmuch_status_t
+add_files_recursive (notmuch_database_t *notmuch,
+                    const char *path,
+                    struct stat *st,
+                    add_files_state_t *state)
+{
+    DIR *dir = NULL;
+    struct dirent *e, *entry = NULL;
+    int entry_length;
+    int err;
+    char *next = NULL;
+    time_t path_mtime, path_dbtime;
+    notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS;
+    notmuch_message_t *message = NULL;
+
+    /* If we're told to, we bail out on encountering a read-only
+     * directory, (with this being a clear clue from the user to
+     * Notmuch that new mail won't be arriving there and we need not
+     * look. */
+    if (state->ignore_read_only_directories &&
+       (st->st_mode & S_IWUSR) == 0)
+    {
+       state->saw_read_only_directory = TRUE;
+       goto DONE;
+    }
+
+    path_mtime = st->st_mtime;
+
+    path_dbtime = notmuch_database_get_timestamp (notmuch, path);
+
+    dir = opendir (path);
+    if (dir == NULL) {
+       fprintf (stderr, "Error opening directory %s: %s\n",
+                path, strerror (errno));
+       ret = NOTMUCH_STATUS_FILE_ERROR;
+       goto DONE;
+    }
+
+    entry_length = offsetof (struct dirent, d_name) +
+       pathconf (path, _PC_NAME_MAX) + 1;
+    entry = malloc (entry_length);
+
+    while (1) {
+       err = readdir_r (dir, entry, &e);
+       if (err) {
+           fprintf (stderr, "Error reading directory: %s\n",
+                    strerror (errno));
+           ret = NOTMUCH_STATUS_FILE_ERROR;
+           goto DONE;
+       }
+
+       if (e == NULL)
+           break;
+
+       /* If this directory hasn't been modified since the last
+        * add_files, then we only need to look further for
+        * sub-directories. */
+       if (path_mtime <= path_dbtime && entry->d_type != DT_DIR)
+           continue;
+
+       /* Ignore special directories to avoid infinite recursion.
+        * Also ignore the .notmuch directory.
+        */
+       /* XXX: Eventually we'll want more sophistication to let the
+        * user specify files to be ignored. */
+       if (strcmp (entry->d_name, ".") == 0 ||
+           strcmp (entry->d_name, "..") == 0 ||
+           strcmp (entry->d_name, ".notmuch") ==0)
+       {
+           continue;
+       }
+
+       next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name);
+
+       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)) {
+           /* If the file hasn't been modified since the last
+            * add_files, then we need not look at it. */
+           if (st->st_mtime > path_dbtime) {
+               state->processed_files++;
+
+               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_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);
+           if (status && ret == NOTMUCH_STATUS_SUCCESS)
+               ret = status;
+       }
+
+       talloc_free (next);
+       next = NULL;
+    }
+
+    status = notmuch_database_set_timestamp (notmuch, path, path_mtime);
+    if (status && ret == NOTMUCH_STATUS_SUCCESS)
+       ret = status;
+
+  DONE:
+    if (next)
+       talloc_free (next);
+    if (entry)
+       free (entry);
+    if (dir)
+       closedir (dir);
+
+    return ret;
+}
+
+/* This is the top-level entry point for add_files. It does a couple
+ * of error checks, sets up the progress-printing timer and then calls
+ * into the recursive function. */
+notmuch_status_t
+add_files (notmuch_database_t *notmuch,
+          const char *path,
+          add_files_state_t *state)
+{
+    struct stat st;
+    notmuch_status_t status;
+    struct sigaction action;
+    struct itimerval timerval;
+
+    if (stat (path, &st)) {
+       fprintf (stderr, "Error reading directory %s: %s\n",
+                path, strerror (errno));
+       return NOTMUCH_STATUS_FILE_ERROR;
+    }
+
+    if (! S_ISDIR (st.st_mode)) {
+       fprintf (stderr, "Error: %s is not a directory.\n", path);
+       return NOTMUCH_STATUS_FILE_ERROR;
+    }
+
+    /* Setup our handler for SIGALRM */
+    memset (&action, 0, sizeof (struct sigaction));
+    action.sa_handler = handle_sigalrm;
+    sigemptyset (&action.sa_mask);
+    action.sa_flags = SA_RESTART;
+    sigaction (SIGALRM, &action, NULL);
+
+    /* Then start a timer to send SIGALRM once per second. */
+    timerval.it_interval.tv_sec = 1;
+    timerval.it_interval.tv_usec = 0;
+    timerval.it_value.tv_sec = 1;
+    timerval.it_value.tv_usec = 0;
+    setitimer (ITIMER_REAL, &timerval, NULL);
+
+    status = add_files_recursive (notmuch, path, &st, state);
+
+    /* Now stop the timer. */
+    timerval.it_interval.tv_sec = 0;
+    timerval.it_interval.tv_usec = 0;
+    timerval.it_value.tv_sec = 0;
+    timerval.it_value.tv_usec = 0;
+    setitimer (ITIMER_REAL, &timerval, NULL);
+
+    /* And disable the signal handler. */
+    action.sa_handler = SIG_IGN;
+    sigaction (SIGALRM, &action, NULL);
+
+    return status;
+}
+
+/* XXX: This should be merged with the add_files function since it
+ * shares a lot of logic with it. */
+/* Recursively count all regular files in path and all sub-direcotries
+ * of path.  The result is added to *count (which should be
+ * initialized to zero by the top-level caller before calling
+ * count_files). */
+static void
+count_files (const char *path, int *count)
+{
+    DIR *dir;
+    struct dirent *e, *entry = NULL;
+    int entry_length;
+    int err;
+    char *next;
+    struct stat st;
+
+    dir = opendir (path);
+
+    if (dir == NULL) {
+       fprintf (stderr, "Warning: failed to open directory %s: %s\n",
+                path, strerror (errno));
+       goto DONE;
+    }
+
+    entry_length = offsetof (struct dirent, d_name) +
+       pathconf (path, _PC_NAME_MAX) + 1;
+    entry = malloc (entry_length);
+
+    while (1) {
+       err = readdir_r (dir, entry, &e);
+       if (err) {
+           fprintf (stderr, "Error reading directory: %s\n",
+                    strerror (errno));
+           free (entry);
+           goto DONE;
+       }
+
+       if (e == NULL)
+           break;
+
+       /* Ignore special directories to avoid infinite recursion.
+        * Also ignore the .notmuch directory.
+        */
+       /* XXX: Eventually we'll want more sophistication to let the
+        * user specify files to be ignored. */
+       if (strcmp (entry->d_name, ".") == 0 ||
+           strcmp (entry->d_name, "..") == 0 ||
+           strcmp (entry->d_name, ".notmuch") == 0)
+       {
+           continue;
+       }
+
+       if (asprintf (&next, "%s/%s", path, entry->d_name) == -1) {
+           next = NULL;
+           fprintf (stderr, "Error descending from %s to %s: Out of memory\n",
+                    path, entry->d_name);
+           continue;
+       }
+
+       stat (next, &st);
+
+       if (S_ISREG (st.st_mode)) {
+           *count = *count + 1;
+           if (*count % 1000 == 0) {
+               printf ("Found %d files so far.\r", *count);
+               fflush (stdout);
+           }
+       } else if (S_ISDIR (st.st_mode)) {
+           count_files (next, count);
+       }
+
+       free (next);
+    }
+
+  DONE:
+    if (entry)
+       free (entry);
+
+    closedir (dir);
+}
+
 int
-notmuch_new_command (unused (void *ctx),
+notmuch_new_command (void *ctx,
                     unused (int argc), unused (char *argv[]))
 {
+    notmuch_config_t *config;
     notmuch_database_t *notmuch;
-    const char *mail_directory;
     add_files_state_t add_files_state;
     double elapsed;
     struct timeval tv_now;
     int ret = 0;
+    struct stat st;
+    const char *db_path;
+    char *dot_notmuch_path;
+    int new_database = 0;
 
-    notmuch = notmuch_database_open (NULL);
-    if (notmuch == NULL) {
-       ret = 1;
-       goto DONE;
+    config = notmuch_config_open (ctx, NULL, NULL);
+    if (config == NULL)
+       return 1;
+
+    db_path = notmuch_config_get_database_path (config);
+
+    dot_notmuch_path = talloc_asprintf (ctx, "%s/%s", db_path, ".notmuch");
+
+    if (stat (dot_notmuch_path, &st)) {
+       new_database = 1;
+       notmuch = notmuch_database_create (db_path);
+    } else {
+       notmuch = notmuch_database_open (db_path);
     }
 
-    mail_directory = notmuch_database_get_path (notmuch);
+    if (notmuch == NULL)
+       return 1;
+
+    talloc_free (dot_notmuch_path);
+    dot_notmuch_path = NULL;
+
+    if (new_database) {
+       int count;
+       count_files (db_path, &count);
+       add_files_state.ignore_read_only_directories = FALSE;
+       add_files_state.total_files = count;
+    } else {
+       add_files_state.ignore_read_only_directories = TRUE;
+       add_files_state.total_files = 0;
+    }
 
-    add_files_state.ignore_read_only_directories = TRUE;
     add_files_state.saw_read_only_directory = FALSE;
     add_files_state.total_files = 0;
     add_files_state.processed_files = 0;
     add_files_state.added_messages = 0;
-    add_files_state.callback = tag_inbox_and_unread;
     gettimeofday (&add_files_state.tv_start, NULL);
 
-    ret = add_files (notmuch, mail_directory, &add_files_state);
+    ret = add_files (notmuch, db_path, &add_files_state);
 
     gettimeofday (&tv_now, NULL);
     elapsed = notmuch_time_elapsed (add_files_state.tv_start,
@@ -92,9 +462,7 @@ notmuch_new_command (unused (void *ctx),
                notmuch_status_to_string (ret));
     }
 
-  DONE:
-    if (notmuch)
-       notmuch_database_close (notmuch);
+    notmuch_database_close (notmuch);
 
     return ret;
 }
index 2c3404ff67b6c0d36c511b997185400713d8dd09..482efd2e3b9b497fcd09089809cb4a3fcab99fc1 100644 (file)
 
 #include "notmuch-client.h"
 
-static notmuch_status_t
-add_all_files (notmuch_database_t *notmuch,
-              const char *mail_directory,
-              int num_files)
-{
-    add_files_state_t add_files_state;
-    double elapsed;
-    struct timeval tv_now;
-    notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
-
-    add_files_state.ignore_read_only_directories = FALSE;
-    add_files_state.saw_read_only_directory = FALSE;
-    add_files_state.total_files = num_files;
-    add_files_state.processed_files = 0;
-    add_files_state.added_messages = 0;
-    add_files_state.callback = NULL;
-    gettimeofday (&add_files_state.tv_start, NULL);
-
-    ret = add_files (notmuch, mail_directory, &add_files_state);
-
-    gettimeofday (&tv_now, NULL);
-    elapsed = notmuch_time_elapsed (add_files_state.tv_start,
-                                   tv_now);
-    printf ("Processed %d %s in ", add_files_state.processed_files,
-           add_files_state.processed_files == 1 ?
-           "file" : "total files");
-    notmuch_time_print_formatted_seconds (elapsed);
-    if (elapsed > 1) {
-       printf (" (%d files/sec.).                 \n",
-               (int) (add_files_state.processed_files / elapsed));
-    } else {
-       printf (".                    \n");
-    }
-    if (add_files_state.added_messages) {
-       printf ("Added %d %s to the database.\n\n",
-               add_files_state.added_messages,
-               add_files_state.added_messages == 1 ?
-               "message" : "unique messages");
-    }
-
-    return ret;
-}
-
-
-/* XXX: This should be merged with the existing add_files function in
- * add-files.c. */
-/* Recursively count all regular files in path and all sub-direcotries
- * of path.  The result is added to *count (which should be
- * initialized to zero by the top-level caller before calling
- * count_files). */
-static void
-count_files (const char *path, int *count)
-{
-    DIR *dir;
-    struct dirent *e, *entry = NULL;
-    int entry_length;
-    int err;
-    char *next;
-    struct stat st;
-
-    dir = opendir (path);
-
-    if (dir == NULL) {
-       fprintf (stderr, "Warning: failed to open directory %s: %s\n",
-                path, strerror (errno));
-       goto DONE;
-    }
-
-    entry_length = offsetof (struct dirent, d_name) +
-       pathconf (path, _PC_NAME_MAX) + 1;
-    entry = malloc (entry_length);
-
-    while (1) {
-       err = readdir_r (dir, entry, &e);
-       if (err) {
-           fprintf (stderr, "Error reading directory: %s\n",
-                    strerror (errno));
-           free (entry);
-           goto DONE;
-       }
-
-       if (e == NULL)
-           break;
-
-       /* Ignore special directories to avoid infinite recursion.
-        * Also ignore the .notmuch directory.
-        */
-       /* XXX: Eventually we'll want more sophistication to let the
-        * user specify files to be ignored. */
-       if (strcmp (entry->d_name, ".") == 0 ||
-           strcmp (entry->d_name, "..") == 0 ||
-           strcmp (entry->d_name, ".notmuch") == 0)
-       {
-           continue;
-       }
-
-       if (asprintf (&next, "%s/%s", path, entry->d_name) == -1) {
-           next = NULL;
-           fprintf (stderr, "Error descending from %s to %s: Out of memory\n",
-                    path, entry->d_name);
-           continue;
-       }
-
-       stat (next, &st);
-
-       if (S_ISREG (st.st_mode)) {
-           *count = *count + 1;
-           if (*count % 1000 == 0) {
-               printf ("Found %d files so far.\r", *count);
-               fflush (stdout);
-           }
-       } else if (S_ISDIR (st.st_mode)) {
-           count_files (next, count);
-       }
-
-       free (next);
-    }
-
-  DONE:
-    if (entry)
-       free (entry);
-
-    closedir (dir);
-}
-
 static const char *
 make_path_absolute (void *ctx, const char *path)
 {
index d0bd3d34dc9072269eca204697efd9e8d5650102..c47e64036786afbb19a834c49cc6aedffec7a5f2 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -259,6 +259,7 @@ notmuch (void *ctx)
            "from a search. Finally, you may want to explore using a more sophisticated\n"
            "interface to notmuch such as the emacs interface implemented in notmuch.el\n"
            "or any other interface described at http://notmuchmail.org\n\n"
+           "And don't forget to run \"notmuch new\" whenever new mail arrives.\n\n"
            "Have fun, and may your inbox never have much mail.\n\n",
            notmuch_config_get_user_name (config),
            notmuch_config_get_user_primary_email (config));