return NOTMUCH_STATUS_FILE_ERROR;
}
- if (! S_ISDIR (st.st_mode)) {
- fprintf (stderr, "Error: %s is not a directory.\n", path);
- return NOTMUCH_STATUS_FILE_ERROR;
- }
+ /* This is not an error since we may have recursed based on a
+ * symlink to a regular file, not a directory, and we don't know
+ * that until this stat. */
+ if (! S_ISDIR (st.st_mode))
+ return NOTMUCH_STATUS_SUCCESS;
fs_mtime = st.st_mtime;
entry = fs_entries[i];
- if (entry->d_type != DT_DIR)
+ if (entry->d_type != DT_DIR && entry->d_type != DT_LNK)
continue;
/* Ignore special directories to avoid infinite recursion.
continue;
}
- /* We're not looking at a regular file that doesn't yet exist
+ /* We're now looking at a regular file that doesn't yet exist
* in the database, so add it. */
next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name);
struct sigaction action;
struct itimerval timerval;
notmuch_bool_t timer_is_active = FALSE;
+ struct stat st;
if (state->output_is_a_tty && ! debugger_is_active () && ! state->verbose) {
/* Setup our handler for SIGALRM */
timer_is_active = TRUE;
}
+ if (stat (path, &st)) {
+ fprintf (stderr, "Error reading directory %s: %s\n",
+ path, strerror (errno));
+ return NOTMUCH_STATUS_FILE_ERROR;
+ }
+
+ if (! S_ISDIR (st.st_mode)) {
+ fprintf (stderr, "Error: %s is not a directory.\n", path);
+ return NOTMUCH_STATUS_FILE_ERROR;
+ }
+
status = add_files_recursive (notmuch, path, state);
if (timer_is_active) {
char *dot_notmuch_path;
struct sigaction action;
_filename_node_t *f;
+ int renamed_files, removed_files;
+ notmuch_status_t status;
int i;
add_files_state.verbose = 0;
ret = add_files (notmuch, db_path, &add_files_state);
+ removed_files = 0;
+ renamed_files = 0;
for (f = add_files_state.removed_files->head; f; f = f->next) {
- printf ("Detected removed file: %s\n", f->filename);
+ status = notmuch_database_remove_message (notmuch, f->filename);
+ if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID)
+ renamed_files++;
+ else
+ removed_files++;
}
for (f = add_files_state.removed_directories->head; f; f = f->next) {
- printf ("Detected removed directory: %s\n", f->filename);
+ notmuch_directory_t *directory;
+ notmuch_filenames_t *files;
+
+ directory = notmuch_database_get_directory (notmuch, f->filename);
+
+ for (files = notmuch_directory_get_child_files (directory);
+ notmuch_filenames_has_more (files);
+ notmuch_filenames_advance (files))
+ {
+ char *absolute;
+
+ absolute = talloc_asprintf (ctx, "%s/%s", f->filename,
+ notmuch_filenames_get (files));
+ status = notmuch_database_remove_message (notmuch, absolute);
+ if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID)
+ renamed_files++;
+ else
+ removed_files++;
+ talloc_free (absolute);
+ }
+
+ notmuch_directory_destroy (directory);
}
talloc_free (add_files_state.removed_files);
gettimeofday (&tv_now, NULL);
elapsed = notmuch_time_elapsed (add_files_state.tv_start,
tv_now);
+
if (add_files_state.processed_files) {
printf ("Processed %d %s in ", add_files_state.processed_files,
add_files_state.processed_files == 1 ?
printf (". \n");
}
}
+
if (add_files_state.added_messages) {
- printf ("Added %d new %s to the database.\n",
+ printf ("Added %d new %s to the database.",
add_files_state.added_messages,
add_files_state.added_messages == 1 ?
"message" : "messages");
} else {
- printf ("No new mail.\n");
+ printf ("No new mail.");
+ }
+
+ if (removed_files) {
+ printf (" Removed %d %s.",
+ removed_files,
+ removed_files == 1 ? "message" : "messages");
}
+ if (renamed_files) {
+ printf (" Detected %d file %s.",
+ renamed_files,
+ renamed_files == 1 ? "rename" : "renames");
+ }
+
+ printf ("\n");
+
if (ret) {
printf ("\nNote: At least one error was encountered: %s\n",
notmuch_status_to_string (ret));