aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2009-10-23 17:20:43 -0700
committerCarl Worth <cworth@cworth.org>2009-10-23 17:25:03 -0700
commitc037dc5e537f06f90323cf9414da95ed5b44167a (patch)
treeacb1b3549d34c514062a022d42eca7f32f033744
parentef944693c354eb1e7ec6c578a0f4c14616fc6d60 (diff)
Make "notmuch new" ignore directories that are read-only.
With this, "notmuch new" is now plenty fast even with large archives spanning many sub-directories. Document this both in "notmuch help" and also in the output of notmuch setup.
-rw-r--r--notmuch.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/notmuch.c b/notmuch.c
index bfc0735b..0a05e1af 100644
--- a/notmuch.c
+++ b/notmuch.c
@@ -54,6 +54,8 @@ typedef struct command {
} command_t;
typedef struct {
+ int ignore_read_only_directories;
+
int total_files;
int processed_files;
int added_messages;
@@ -160,6 +162,16 @@ add_files_recursive (notmuch_database_t *notmuch,
time_t path_mtime, path_dbtime;
notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS;
+ /* 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)
+ {
+ goto DONE;
+ }
+
path_mtime = st->st_mtime;
path_dbtime = notmuch_database_get_timestamp (notmuch, path);
@@ -448,6 +460,7 @@ setup_command (int argc, char *argv[])
printf ("Next, we'll inspect the messages and create a database of threads:\n");
+ add_files_state.ignore_read_only_directories = FALSE;
add_files_state.total_files = count;
add_files_state.processed_files = 0;
add_files_state.added_messages = 0;
@@ -476,8 +489,12 @@ setup_command (int argc, char *argv[])
}
printf ("When new mail is delivered to %s in the future,\n"
- "run \"notmuch new\" to add it to the database.\n",
+ "run \"notmuch new\" to add it to the database.\n\n",
mail_directory);
+ printf ("And if you have any sub-directories that are archives (that is,\n"
+ "they will never receive new mail), marking these directores as\n"
+ "read-only (chmod u-w /path/to/dir) will make \"notmuch new\"\n"
+ "much more efficient (it won't even look in those directories).\n\n");
if (ret) {
printf ("Note: At least one error was encountered: %s\n",
@@ -511,6 +528,7 @@ new_command (int argc, char *argv[])
mail_directory = notmuch_database_get_path (notmuch);
+ add_files_state.ignore_read_only_directories = TRUE;
add_files_state.total_files = 0;
add_files_state.processed_files = 0;
add_files_state.added_messages = 0;
@@ -752,11 +770,15 @@ restore_command (int argc, char *argv[])
command_t commands[] = {
{ "setup", setup_command,
- "Interactively setup notmuch for first use.\n"
+ "Interactively setup notmuch for first use.\n\n"
"\t\tInvoking notmuch with no command argument will run setup if\n"
"\t\tthe setup command has not previously been completed." },
{ "new", new_command,
- "Find and import any new messages."},
+ "Find and import any new messages.\n\n"
+ "\t\tScans all sub-directories of the database, adding new files\n"
+ "\t\tthat are found. Note: \"notmuch new\" will skip any\n"
+ "\t\tread-only directories, so you can use that to mark\n"
+ "\t\tdirectories that will not receive any new mail."},
{ "search", search_command,
"<search-term> [...]\n\n"
"\t\tSearch for threads matching the given search terms.\n"