#include <unistd.h>
+typedef struct {
+ int output_is_a_tty;
+ int verbose;
+
+ int total_files;
+ int processed_files;
+ int added_messages;
+ struct timeval tv_start;
+} add_files_state_t;
+
static volatile sig_atomic_t do_add_files_print_progress = 0;
static void
/* Examine 'path' recursively as follows:
*
- * o Ask the filesystem for the mtime of 'path' (path_mtime)
+ * o Ask the filesystem for the mtime of 'path' (fs_mtime)
*
- * o Ask the database for its timestamp of 'path' (path_dbtime)
+ * o Ask the database for its timestamp of 'path' (db_mtime)
*
- * o If 'path_mtime' > 'path_dbtime'
+ * o If 'fs_mtime' > 'db_mtime'
*
* o For each regular file in 'path' with mtime newer than the
- * 'path_dbtime' call add_message to add the file to the
+ * 'db_mtime' call add_message to add the file to the
* database.
*
- * o For each sub-directory of path, recursively call into this
- * same function.
+ * 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'
+ * o Tell the database to update its time of 'path' to 'fs_mtime'
*
* The 'struct stat *st' must point to a structure that has already
* been initialized for 'path' by calling stat().
DIR *dir = NULL;
struct dirent *entry = NULL;
char *next = NULL;
- time_t path_mtime, path_dbtime;
+ time_t fs_mtime, db_mtime;
notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS;
notmuch_message_t *message = NULL;
struct dirent **namelist = NULL;
int num_entries;
+ notmuch_directory_t *directory;
- /* 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;
- }
+ fs_mtime = st->st_mtime;
- path_mtime = st->st_mtime;
+ directory = notmuch_database_get_directory (notmuch, path);
+ db_mtime = notmuch_directory_get_mtime (directory);
- path_dbtime = notmuch_database_get_timestamp (notmuch, path);
num_entries = scandir (path, &namelist, 0, ino_cmp);
if (num_entries == -1) {
/* 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_REG)
+ if (fs_mtime <= db_mtime && entry->d_type == DT_REG)
continue;
/* Ignore special directories to avoid infinite recursion.
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 (path_dbtime == 0 || st->st_mtime > path_dbtime) {
+ if (db_mtime == 0 || st->st_mtime > db_mtime) {
state->processed_files++;
if (state->verbose) {
next = NULL;
}
- status = notmuch_database_set_timestamp (notmuch, path, path_mtime);
- if (status && ret == NOTMUCH_STATUS_SUCCESS)
- ret = status;
+ if (! interrupted) {
+ status = notmuch_directory_set_mtime (directory, fs_mtime);
+ if (status && ret == NOTMUCH_STATUS_SUCCESS)
+ ret = status;
+ }
DONE:
if (next)
/* 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
+static notmuch_status_t
add_files (notmuch_database_t *notmuch,
const char *path,
add_files_state_t *state)
if (interrupted)
return 1;
- printf ("Found %d total files. \n", count);
+ printf ("Found %d total files (that's not much mail).\n", count);
notmuch = notmuch_database_create (db_path);
- add_files_state.ignore_read_only_directories = FALSE;
add_files_state.total_files = count;
} else {
notmuch = notmuch_database_open (db_path,
NOTMUCH_DATABASE_MODE_READ_WRITE);
- add_files_state.ignore_read_only_directories = TRUE;
add_files_state.total_files = 0;
}
talloc_free (dot_notmuch_path);
dot_notmuch_path = NULL;
- add_files_state.saw_read_only_directory = FALSE;
add_files_state.processed_files = 0;
add_files_state.added_messages = 0;
gettimeofday (&add_files_state.tv_start, NULL);
}
}
if (add_files_state.added_messages) {
- printf ("Added %d new %s to the database (not much, really).\n",
+ printf ("Added %d new %s to the database.\n",
add_files_state.added_messages,
add_files_state.added_messages == 1 ?
"message" : "messages");
} else {
- printf ("No new mail---and that's not much.\n");
- }
-
- if (elapsed > 1 && ! add_files_state.saw_read_only_directory) {
- printf ("\nTip: If you have any sub-directories that are archives (that is,\n"
- "they will never receive new mail), marking these directories 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");
+ printf ("No new mail.\n");
}
if (ret) {