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)) {
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);
}
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;
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) {