typedef struct {
int output_is_a_tty;
enum verbosity verbosity;
- notmuch_bool_t debug;
+ bool debug;
const char **new_tags;
size_t new_tags_length;
const char **new_ignore;
_filename_list_t *removed_directories;
_filename_list_t *directory_mtimes;
- notmuch_bool_t synchronize_flags;
+ bool synchronize_flags;
} add_files_state_t;
static volatile sig_atomic_t do_print_progress = 0;
elapsed_overall = notmuch_time_elapsed (tv_start, tv_now);
rate_overall = processed / elapsed_overall;
- printf ("%s %d ", action, processed);
+ printf ("%s %u ", action, processed);
if (total) {
- printf ("of %d %s", total, object);
+ printf ("of %u %s", total, object);
if (processed > 0 && elapsed_overall > 0.5) {
double time_remaining = ((total - processed) / rate_overall);
printf (" (");
return 0;
}
+static bool
+_special_directory (const char *entry)
+{
+ return strcmp (entry, ".") == 0 || strcmp (entry, "..") == 0;
+}
+
/* Test if the file/directory is to be ignored.
*/
-static notmuch_bool_t
+static bool
_entry_in_ignore_list (const char *entry, add_files_state_t *state)
{
size_t i;
for (i = 0; i < state->new_ignore_length; i++)
if (strcmp (entry, state->new_ignore[i]) == 0)
- return TRUE;
+ return true;
- return FALSE;
+ return false;
}
/* Add a single file to the database. */
if (status)
goto DONE;
- status = notmuch_database_add_message (notmuch, filename, &message);
+ status = notmuch_database_index_file (notmuch, filename, NULL, &message);
switch (status) {
/* Success. */
case NOTMUCH_STATUS_SUCCESS:
state->added_messages++;
notmuch_message_freeze (message);
- for (tag = state->new_tags; *tag != NULL; tag++)
- notmuch_message_add_tag (message, *tag);
if (state->synchronize_flags)
notmuch_message_maildir_flags_to_tags (message);
+
+ for (tag = state->new_tags; *tag != NULL; tag++) {
+ if (strcmp ("unread", *tag) !=0 ||
+ !notmuch_message_has_maildir_flag (message, 'S')) {
+ notmuch_message_add_tag (message, *tag);
+ }
+ }
+
notmuch_message_thaw (message);
break;
/* Non-fatal issues (go on to next file). */
case NOTMUCH_STATUS_READ_ONLY_DATABASE:
case NOTMUCH_STATUS_XAPIAN_EXCEPTION:
case NOTMUCH_STATUS_OUT_OF_MEMORY:
- fprintf (stderr, "Error: %s. Halting processing.\n",
- notmuch_status_to_string (status));
+ (void) print_status_database("add_file", notmuch, status);
goto DONE;
default:
INTERNAL_ERROR ("add_message returned unexpected value: %d", status);
notmuch_filenames_t *db_subdirs = NULL;
time_t stat_time;
struct stat st;
- notmuch_bool_t is_maildir;
+ bool is_maildir;
if (stat (path, &st)) {
fprintf (stderr, "Error reading directory %s: %s\n",
/* Pass 1: Recurse into all sub-directories. */
is_maildir = _entries_resemble_maildir (path, fs_entries, num_fs_entries);
- for (i = 0; i < num_fs_entries; i++) {
- if (interrupted)
- break;
-
+ for (i = 0; i < num_fs_entries && ! interrupted; i++) {
entry = fs_entries[i];
+ /* Ignore special directories to avoid infinite recursion. */
+ if (_special_directory (entry->d_name))
+ continue;
+
/* Ignore any files/directories the user has configured to
* ignore. We do this before dirent_type both for performance
* and because we don't care if dirent_type fails on entries
continue;
}
- /* Ignore special directories to avoid infinite recursion.
- * Also ignore the .notmuch directory and any "tmp" directory
+ /* Ignore the .notmuch directory and any "tmp" directory
* that appears within a maildir.
*/
- if (strcmp (entry->d_name, ".") == 0 ||
- strcmp (entry->d_name, "..") == 0 ||
- (is_maildir && strcmp (entry->d_name, "tmp") == 0) ||
+ if ((is_maildir && strcmp (entry->d_name, "tmp") == 0) ||
strcmp (entry->d_name, ".notmuch") == 0)
continue;
}
/* Pass 2: Scan for new files, removed files, and removed directories. */
- for (i = 0; i < num_fs_entries; i++)
- {
- if (interrupted)
- break;
-
+ for (i = 0; i < num_fs_entries && ! interrupted; i++) {
entry = fs_entries[i];
+ /* Ignore special directories early. */
+ if (_special_directory (entry->d_name))
+ continue;
+
/* Ignore files & directories user has configured to be ignored */
if (_entry_in_ignore_list (entry->d_name, state)) {
if (state->debug)
/* Ignore special directories to avoid infinite recursion.
* Also ignore the .notmuch directory.
*/
- if (strcmp (entry->d_name, ".") == 0 ||
- strcmp (entry->d_name, "..") == 0 ||
+ if (_special_directory (entry->d_name) ||
strcmp (entry->d_name, ".notmuch") == 0)
continue;
status = notmuch_database_remove_message (notmuch, path);
if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) {
add_files_state->renamed_messages++;
- if (add_files_state->synchronize_flags == TRUE)
+ if (add_files_state->synchronize_flags == true)
notmuch_message_maildir_flags_to_tags (message);
status = NOTMUCH_STATUS_SUCCESS;
} else if (status == NOTMUCH_STATUS_SUCCESS) {
const char *path,
add_files_state_t *add_files_state)
{
- notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
+ notmuch_status_t status;
notmuch_directory_t *directory;
notmuch_filenames_t *files, *subdirs;
char *absolute;
state->processed_files == 1 ? "file" : "total files");
notmuch_time_print_formatted_seconds (elapsed);
if (elapsed > 1)
- printf (" (%d files/sec.).\033[K\n",
+ printf (" (%d files/sec.)",
(int) (state->processed_files / elapsed));
- else
- printf (".\033[K\n");
+ printf (".%s\n", (state->output_is_a_tty) ? "\033[K" : "");
}
if (state->added_messages)
notmuch_database_t *notmuch;
add_files_state_t add_files_state = {
.verbosity = VERBOSITY_NORMAL,
- .debug = FALSE,
+ .debug = false,
.output_is_a_tty = isatty (fileno (stdout)),
};
struct timeval tv_start;
_filename_node_t *f;
int opt_index;
unsigned int i;
- notmuch_bool_t timer_is_active = FALSE;
- notmuch_bool_t no_hooks = FALSE;
- notmuch_bool_t quiet = FALSE, verbose = FALSE;
+ bool timer_is_active = false;
+ bool no_hooks = false;
+ bool quiet = false, verbose = false;
notmuch_status_t status;
notmuch_opt_desc_t options[] = {
- { NOTMUCH_OPT_BOOLEAN, &quiet, "quiet", 'q', 0 },
- { NOTMUCH_OPT_BOOLEAN, &verbose, "verbose", 'v', 0 },
- { NOTMUCH_OPT_BOOLEAN, &add_files_state.debug, "debug", 'd', 0 },
- { NOTMUCH_OPT_BOOLEAN, &no_hooks, "no-hooks", 'n', 0 },
- { NOTMUCH_OPT_INHERIT, (void *) ¬much_shared_options, NULL, 0, 0 },
- { 0, 0, 0, 0, 0 }
+ { .opt_bool = &quiet, .name = "quiet" },
+ { .opt_bool = &verbose, .name = "verbose" },
+ { .opt_bool = &add_files_state.debug, .name = "debug" },
+ { .opt_bool = &no_hooks, .name = "no-hooks" },
+ { .opt_inherit = notmuch_shared_options },
+ { }
};
opt_index = parse_arguments (argc, argv, options, 1);
for (i = 0; i < add_files_state.new_tags_length; i++) {
const char *error_msg;
- error_msg = illegal_tag (add_files_state.new_tags[i], FALSE);
+ error_msg = illegal_tag (add_files_state.new_tags[i], false);
if (error_msg) {
fprintf (stderr, "Error: tag '%s' in new.tags: %s\n",
add_files_state.new_tags[i], error_msg);
}
if (notmuch_database_dump (notmuch, backup_name, "",
- DUMP_FORMAT_BATCH_TAG, DUMP_INCLUDE_DEFAULT, TRUE)) {
+ DUMP_FORMAT_BATCH_TAG, DUMP_INCLUDE_DEFAULT, true)) {
fprintf (stderr, "Backup failed. Aborting upgrade.");
return EXIT_FAILURE;
}
if (add_files_state.verbosity == VERBOSITY_NORMAL &&
add_files_state.output_is_a_tty && ! debugger_is_active ()) {
setup_progress_printing_timer ();
- timer_is_active = TRUE;
+ timer_is_active = true;
}
ret = add_files (notmuch, db_path, &add_files_state);