X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-new.c;h=f25c71f3450f686eae1c50b9d4ed8f9cf55c6959;hp=0d06253d9fb5221949ce6da83ac3d97d58ee4f0e;hb=7a9bacac6786729d7f28495b0ef30f9b6ded7696;hpb=e307e990c9394b6426e55b28c748c265358a1c89 diff --git a/notmuch-new.c b/notmuch-new.c index 0d06253d..f25c71f3 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -153,7 +153,7 @@ _entries_resemble_maildir (struct dirent **entries, int count) int i, found = 0; for (i = 0; i < count; i++) { - if (entries[i]->d_type != DT_DIR) + if (entries[i]->d_type != DT_DIR && entries[i]->d_type != DT_UNKNOWN) continue; if (strcmp(entries[i]->d_name, "new") == 0 || @@ -273,8 +273,19 @@ add_files_recursive (notmuch_database_t *notmuch, entry = fs_entries[i]; - if (entry->d_type != DT_DIR && entry->d_type != DT_LNK) + /* We only want to descend into directories. + * But symlinks can be to directories too, of course. + * + * And if the filesystem doesn't tell us the file type in the + * scandir results, then it might be a directory (and if not, + * then we'll stat and return immediately in the next level of + * recursion). */ + if (entry->d_type != DT_DIR && + entry->d_type != DT_LNK && + entry->d_type != DT_UNKNOWN) + { continue; + } /* Ignore special directories to avoid infinite recursion. * Also ignore the .notmuch directory and any "tmp" directory @@ -342,8 +353,14 @@ add_files_recursive (notmuch_database_t *notmuch, } /* If we're looking at a symlink, we only want to add it if it - * links to a regular file, (and not to a directory, say). */ - if (entry->d_type == DT_LNK) { + * links to a regular file, (and not to a directory, say). + * + * Similarly, if the file is of unknown type (due to filesytem + * limitations), then we also need to look closer. + * + * In either case, a stat does the trick. + */ + if (entry->d_type == DT_LNK || entry->d_type == DT_UNKNOWN) { int err; next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name); @@ -618,22 +635,26 @@ count_files (const char *path, int *count) static void upgrade_print_progress (void *closure, - unsigned int count, - unsigned int total) + double progress) { add_files_state_t *state = closure; - struct timeval tv_now; - double elapsed_overall, rate_overall, time_remaining; - gettimeofday (&tv_now, NULL); + printf ("Upgrading database: %.2f%% complete", progress * 100.0); - elapsed_overall = notmuch_time_elapsed (state->tv_start, tv_now); - rate_overall = count / elapsed_overall; - time_remaining = ((total - count) / rate_overall); + if (progress > 0) { + struct timeval tv_now; + double elapsed, time_remaining; - printf ("Upgraded %d of %d messages (", count, total); - notmuch_time_print_formatted_seconds (time_remaining); - printf (" remaining). \r"); + gettimeofday (&tv_now, NULL); + + elapsed = notmuch_time_elapsed (state->tv_start, tv_now); + time_remaining = (elapsed / progress) * (1.0 - progress); + printf (" ("); + notmuch_time_print_formatted_seconds (time_remaining); + printf (" remaining)"); + } + + printf (". \r"); fflush (stdout); } @@ -711,13 +732,6 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) } } - /* Setup our handler for SIGINT */ - memset (&action, 0, sizeof (struct sigaction)); - action.sa_handler = handle_sigint; - sigemptyset (&action.sa_mask); - action.sa_flags = SA_RESTART; - sigaction (SIGINT, &action, NULL); - config = notmuch_config_open (ctx, NULL, NULL); if (config == NULL) return 1; @@ -758,6 +772,15 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) if (notmuch == NULL) return 1; + /* Setup our handler for SIGINT. We do this after having + * potentially done a database upgrade we this interrupt handler + * won't support. */ + memset (&action, 0, sizeof (struct sigaction)); + action.sa_handler = handle_sigint; + sigemptyset (&action.sa_mask); + action.sa_flags = SA_RESTART; + sigaction (SIGINT, &action, NULL); + talloc_free (dot_notmuch_path); dot_notmuch_path = NULL;