static void
handle_sigint (unused (int sig))
{
+ ssize_t ignored;
static char msg[] = "Stopping... \n";
- write(2, msg, sizeof(msg)-1);
+
+ ignored = write(2, msg, sizeof(msg)-1);
interrupted = 1;
}
return ((*a)->d_ino < (*b)->d_ino) ? -1 : 1;
}
+/* Test if the directory looks like a Maildir directory.
+ *
+ * Search through the array of directory entries to see if we can find all
+ * three subdirectories typical for Maildir, that is "new", "cur", and "tmp".
+ *
+ * Return 1 if the directory looks like a Maildir and 0 otherwise.
+ */
+static int
+is_maildir (struct dirent **entries, int count)
+{
+ int i, found = 0;
+
+ for (i = 0; i < count; i++) {
+ if (entries[i]->d_type != DT_DIR) continue;
+ if (strcmp(entries[i]->d_name, "new") == 0 ||
+ strcmp(entries[i]->d_name, "cur") == 0 ||
+ strcmp(entries[i]->d_name, "tmp") == 0)
+ {
+ found++;
+ if (found == 3)
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
/* Examine 'path' recursively as follows:
*
* o Ask the filesystem for the mtime of 'path' (path_mtime)
/* 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)
+ if (path_mtime <= path_dbtime && entry->d_type == DT_REG)
continue;
/* Ignore special directories to avoid infinite recursion.
* user specify files to be ignored. */
if (strcmp (entry->d_name, ".") == 0 ||
strcmp (entry->d_name, "..") == 0 ||
+ (entry->d_type == DT_DIR &&
+ (strcmp (entry->d_name, "tmp") == 0) &&
+ is_maildir (namelist, num_entries)) ||
strcmp (entry->d_name, ".notmuch") ==0)
{
continue;
next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name);
if (stat (next, st)) {
+ int err = errno;
+
+ switch (err) {
+ case ENOENT:
+ /* The file was removed between scandir and now... */
+ case EPERM:
+ case EACCES:
+ /* We can't read this file so don't add it to the cache. */
+ continue;
+ }
+
fprintf (stderr, "Error reading %s: %s\n",
next, strerror (errno));
ret = NOTMUCH_STATUS_FILE_ERROR;
- continue;
+ goto DONE;
}
if (S_ISREG (st->st_mode)) {
if (path_dbtime == 0 || st->st_mtime > path_dbtime) {
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,
+ next);
+
+ putchar((state->output_is_a_tty) ? '\r' : '\n');
+ fflush (stdout);
+ }
+
status = notmuch_database_add_message (notmuch, next, &message);
switch (status) {
/* success */
return NOTMUCH_STATUS_FILE_ERROR;
}
- /* Setup our handler for SIGALRM */
- if (isatty (fileno (stdout)) && ! debugger_is_active ()) {
+ if (state->output_is_a_tty && ! debugger_is_active () && ! state->verbose) {
+ /* Setup our handler for SIGALRM */
memset (&action, 0, sizeof (struct sigaction));
action.sa_handler = handle_sigalrm;
sigemptyset (&action.sa_mask);
status = add_files_recursive (notmuch, path, &st, state);
- /* Now stop the timer. */
if (timer_is_active) {
+ /* Now stop the timer. */
timerval.it_interval.tv_sec = 0;
timerval.it_interval.tv_usec = 0;
timerval.it_value.tv_sec = 0;
}
int
-notmuch_new_command (void *ctx,
- unused (int argc), unused (char *argv[]))
+notmuch_new_command (void *ctx, int argc, char *argv[])
{
notmuch_config_t *config;
notmuch_database_t *notmuch;
const char *db_path;
char *dot_notmuch_path;
struct sigaction action;
+ int i;
+
+ add_files_state.verbose = 0;
+ add_files_state.output_is_a_tty = isatty (fileno (stdout));
+
+ for (i = 0; i < argc && argv[i][0] == '-'; i++) {
+ if (STRNCMP_LITERAL (argv[i], "--verbose") == 0) {
+ add_files_state.verbose = 1;
+ } else {
+ fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
+ return 1;
+ }
+ }
/* Setup our handler for SIGINT */
memset (&action, 0, sizeof (struct sigaction));
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;
}
}
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");
+ printf ("No new mail.\n");
}
if (elapsed > 1 && ! add_files_state.saw_read_only_directory) {