X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-new.c;h=6264628a4b8b01aa2f6267038eac16257db69453;hp=03aa4fa00ae474fb95cd0488818516aff857ddbe;hb=9794f19017e028b542ed715bef3fd7cf0da5edff;hpb=a45ff8c36112a2f17c1ad5c20a16c30a47759797 diff --git a/notmuch-new.c b/notmuch-new.c index 03aa4fa0..6264628a 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -75,7 +75,7 @@ add_files_print_progress (add_files_state_t *state) static int ino_cmp(const struct dirent **a, const struct dirent **b) { - return ((*a)->d_ino < (*b)->d_ino)? -1: 1; + return ((*a)->d_ino < (*b)->d_ino) ? -1 : 1; } /* Examine 'path' recursively as follows: @@ -101,6 +101,7 @@ static int ino_cmp(const struct dirent **a, const struct dirent **b) static notmuch_status_t add_files_recursive (notmuch_database_t *notmuch, const char *path, + const char *tag, struct stat *st, add_files_state_t *state) { @@ -111,6 +112,7 @@ add_files_recursive (notmuch_database_t *notmuch, notmuch_status_t status, ret = NOTMUCH_STATUS_SUCCESS; notmuch_message_t *message = NULL; struct dirent **namelist = NULL; + int num_entries; /* If we're told to, we bail out on encountering a read-only * directory, (with this being a clear clue from the user to @@ -126,9 +128,9 @@ add_files_recursive (notmuch_database_t *notmuch, path_mtime = st->st_mtime; path_dbtime = notmuch_database_get_timestamp (notmuch, path); - int n_entries= scandir(path, &namelist, 0, ino_cmp); + num_entries = scandir (path, &namelist, 0, ino_cmp); - if (n_entries == -1) { + if (num_entries == -1) { fprintf (stderr, "Error opening directory %s: %s\n", path, strerror (errno)); ret = NOTMUCH_STATUS_FILE_ERROR; @@ -138,7 +140,7 @@ add_files_recursive (notmuch_database_t *notmuch, int i=0; while (!interrupted) { - if (i == n_entries) + if (i == num_entries) break; entry= namelist[i++]; @@ -182,6 +184,7 @@ add_files_recursive (notmuch_database_t *notmuch, case NOTMUCH_STATUS_SUCCESS: state->added_messages++; tag_inbox_and_unread (message); + notmuch_message_add_tag (message, tag); break; /* Non-fatal issues (go on to next file) */ case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID: @@ -219,7 +222,13 @@ add_files_recursive (notmuch_database_t *notmuch, } } } else if (S_ISDIR (st->st_mode)) { - status = add_files_recursive (notmuch, next, st, state); + if ((strcmp (entry->d_name, "cur") == 0) || + (strcmp (entry->d_name, "new") == 0) || + (strcmp (entry->d_name, "tmp") == 0)) { + status = add_files_recursive (notmuch, next, tag, st, state); + } else { + status = add_files_recursive (notmuch, next, entry->d_name, st, state); + } if (status && ret == NOTMUCH_STATUS_SUCCESS) ret = status; } @@ -283,7 +292,7 @@ add_files (notmuch_database_t *notmuch, timerval.it_value.tv_usec = 0; setitimer (ITIMER_REAL, &timerval, NULL); - status = add_files_recursive (notmuch, path, &st, state); + status = add_files_recursive (notmuch, path, basename(path), &st, state); /* Now stop the timer. */ timerval.it_interval.tv_sec = 0; @@ -308,37 +317,25 @@ add_files (notmuch_database_t *notmuch, static void count_files (const char *path, int *count) { - DIR *dir; - struct dirent *e, *entry = NULL; - int entry_length; - int err; + struct dirent *entry = NULL; char *next; struct stat st; + struct dirent **namelist = NULL; + int n_entries = scandir (path, &namelist, 0, ino_cmp); + int i = 0; - dir = opendir (path); - - if (dir == NULL) { + if (n_entries == -1) { fprintf (stderr, "Warning: failed to open directory %s: %s\n", path, strerror (errno)); goto DONE; } - entry_length = offsetof (struct dirent, d_name) + - pathconf (path, _PC_NAME_MAX) + 1; - entry = malloc (entry_length); - while (!interrupted) { - err = readdir_r (dir, entry, &e); - if (err) { - fprintf (stderr, "Error reading directory: %s\n", - strerror (errno)); - free (entry); - goto DONE; - } - - if (e == NULL) + if (i == n_entries) break; + entry= namelist[i++]; + /* Ignore special directories to avoid infinite recursion. * Also ignore the .notmuch directory. */ @@ -376,8 +373,8 @@ count_files (const char *path, int *count) DONE: if (entry) free (entry); - - closedir (dir); + if (namelist) + free (namelist); } int @@ -418,6 +415,7 @@ notmuch_new_command (void *ctx, if (interrupted) return 1; + printf ("Found %d total files. \n", count); notmuch = notmuch_database_create (db_path); add_files_state.ignore_read_only_directories = FALSE; add_files_state.total_files = count; @@ -434,7 +432,6 @@ notmuch_new_command (void *ctx, dot_notmuch_path = NULL; add_files_state.saw_read_only_directory = FALSE; - add_files_state.total_files = 0; add_files_state.processed_files = 0; add_files_state.added_messages = 0; gettimeofday (&add_files_state.tv_start, NULL);