X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-new.c;h=9d206167e997382d623934ce4dd1797751b2e950;hp=a2b30bdc3c62fb42d3c97c6eca721af7fc73fa5d;hb=4faf809578ca63edc9f23f92d7ce47d60dbc061e;hpb=5fdce046a189f6232c1bd2f89a6df04e02b226f0 diff --git a/notmuch-new.c b/notmuch-new.c index a2b30bdc..9d206167 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -35,8 +35,10 @@ static volatile sig_atomic_t interrupted; 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; } @@ -80,6 +82,33 @@ static int ino_cmp(const struct dirent **a, const struct dirent **b) 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) @@ -149,7 +178,7 @@ add_files_recursive (notmuch_database_t *notmuch, /* 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. @@ -159,6 +188,9 @@ add_files_recursive (notmuch_database_t *notmuch, * 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; @@ -167,10 +199,21 @@ add_files_recursive (notmuch_database_t *notmuch, 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)) { @@ -180,10 +223,15 @@ add_files_recursive (notmuch_database_t *notmuch, state->processed_files++; if (state->verbose) { - printf ("\r\033[K%i/%i: %s\r", + 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); } @@ -282,9 +330,7 @@ add_files (notmuch_database_t *notmuch, return NOTMUCH_STATUS_FILE_ERROR; } - if (isatty (fileno (stdout)) && ! debugger_is_active () - && ! state->verbose) - { + 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; @@ -405,6 +451,7 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) 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) {