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.
This commit is contained in:
Carl Worth 2009-10-23 17:20:43 -07:00
parent ef944693c3
commit c037dc5e53

View file

@ -54,6 +54,8 @@ typedef struct command {
} command_t; } command_t;
typedef struct { typedef struct {
int ignore_read_only_directories;
int total_files; int total_files;
int processed_files; int processed_files;
int added_messages; int added_messages;
@ -160,6 +162,16 @@ add_files_recursive (notmuch_database_t *notmuch,
time_t path_mtime, path_dbtime; time_t path_mtime, path_dbtime;
notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS; 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_mtime = st->st_mtime;
path_dbtime = notmuch_database_get_timestamp (notmuch, path); 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"); 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.total_files = count;
add_files_state.processed_files = 0; add_files_state.processed_files = 0;
add_files_state.added_messages = 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" 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); 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) { if (ret) {
printf ("Note: At least one error was encountered: %s\n", 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); mail_directory = notmuch_database_get_path (notmuch);
add_files_state.ignore_read_only_directories = TRUE;
add_files_state.total_files = 0; add_files_state.total_files = 0;
add_files_state.processed_files = 0; add_files_state.processed_files = 0;
add_files_state.added_messages = 0; add_files_state.added_messages = 0;
@ -752,11 +770,15 @@ restore_command (int argc, char *argv[])
command_t commands[] = { command_t commands[] = {
{ "setup", setup_command, { "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\tInvoking notmuch with no command argument will run setup if\n"
"\t\tthe setup command has not previously been completed." }, "\t\tthe setup command has not previously been completed." },
{ "new", new_command, { "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", search_command,
"<search-term> [...]\n\n" "<search-term> [...]\n\n"
"\t\tSearch for threads matching the given search terms.\n" "\t\tSearch for threads matching the given search terms.\n"