CLI/insert: convert to new config framework.

The new talloc context is needed to run the hook at the very end of
the function. That in turn is needed so that this process gives up the
write lock on the database.
This commit is contained in:
David Bremner 2020-08-26 08:43:33 -03:00
parent 66adcd4f53
commit f994f0e7df
4 changed files with 79 additions and 28 deletions

View file

@ -444,14 +444,12 @@ add_file (notmuch_database_t *notmuch, const char *path, tag_op_list_t *tag_ops,
} }
int int
notmuch_insert_command (notmuch_config_t *config, unused(notmuch_database_t *notmuch), int argc, char *argv[]) notmuch_insert_command (unused(notmuch_config_t *config),notmuch_database_t *notmuch, int argc, char *argv[])
{ {
notmuch_status_t status, close_status; notmuch_status_t status, close_status;
notmuch_database_t *notmuch;
struct sigaction action; struct sigaction action;
const char *db_path; const char *db_path;
const char **new_tags; notmuch_config_values_t *new_tags = NULL;
size_t new_tags_length;
tag_op_list_t *tag_ops; tag_op_list_t *tag_ops;
char *query_string = NULL; char *query_string = NULL;
const char *folder = ""; const char *folder = "";
@ -459,11 +457,11 @@ notmuch_insert_command (notmuch_config_t *config, unused(notmuch_database_t *not
bool keep = false; bool keep = false;
bool hooks = true; bool hooks = true;
bool world_readable = false; bool world_readable = false;
bool synchronize_flags; notmuch_bool_t synchronize_flags;
char *maildir; char *maildir;
char *newpath; char *newpath;
int opt_index; int opt_index;
unsigned int i; void *local = talloc_new (NULL);
notmuch_opt_desc_t options[] = { notmuch_opt_desc_t options[] = {
{ .opt_string = &folder, .name = "folder", .allow_empty = true }, { .opt_string = &folder, .name = "folder", .allow_empty = true },
@ -482,30 +480,46 @@ notmuch_insert_command (notmuch_config_t *config, unused(notmuch_database_t *not
notmuch_process_shared_options (argv[0]); notmuch_process_shared_options (argv[0]);
db_path = notmuch_config_get_database_path (config);
new_tags = notmuch_config_get_new_tags (config, &new_tags_length);
synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
tag_ops = tag_op_list_create (config); /* XXX TODO replace this use of DATABASE_PATH with something specific to hooks */
db_path = notmuch_config_get (notmuch, NOTMUCH_CONFIG_DATABASE_PATH);
if (! db_path)
INTERNAL_ERROR ("Unable to retrieve database path");
else
db_path = talloc_strdup (local, db_path);
new_tags = notmuch_config_get_values (notmuch, NOTMUCH_CONFIG_NEW_TAGS);
if (print_status_database (
"notmuch insert",
notmuch,
notmuch_config_get_bool (notmuch, NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS,
&synchronize_flags)))
return EXIT_FAILURE;
tag_ops = tag_op_list_create (local);
if (tag_ops == NULL) { if (tag_ops == NULL) {
fprintf (stderr, "Out of memory.\n"); fprintf (stderr, "Out of memory.\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
for (i = 0; i < new_tags_length; i++) { for (;
notmuch_config_values_valid (new_tags);
notmuch_config_values_move_to_next (new_tags)) {
const char *error_msg; const char *error_msg;
const char *tag = notmuch_config_values_get (new_tags);
error_msg = illegal_tag (new_tags[i], false); error_msg = illegal_tag (tag, false);
if (error_msg) { if (error_msg) {
fprintf (stderr, "Error: tag '%s' in new.tags: %s\n", fprintf (stderr, "Error: tag '%s' in new.tags: %s\n",
new_tags[i], error_msg); tag, error_msg);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (tag_op_list_append (tag_ops, new_tags[i], false)) if (tag_op_list_append (tag_ops, tag, false))
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (parse_tag_command_line (config, argc - opt_index, argv + opt_index, if (parse_tag_command_line (local, argc - opt_index, argv + opt_index,
&query_string, tag_ops)) &query_string, tag_ops))
return EXIT_FAILURE; return EXIT_FAILURE;
@ -519,14 +533,14 @@ notmuch_insert_command (notmuch_config_t *config, unused(notmuch_database_t *not
return EXIT_FAILURE; return EXIT_FAILURE;
} }
maildir = talloc_asprintf (config, "%s/%s", db_path, folder); maildir = talloc_asprintf (local, "%s/%s", db_path, folder);
if (! maildir) { if (! maildir) {
fprintf (stderr, "Out of memory\n"); fprintf (stderr, "Out of memory\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
strip_trailing (maildir, '/'); strip_trailing (maildir, '/');
if (create_folder && ! maildir_create_folder (config, maildir, world_readable)) if (create_folder && ! maildir_create_folder (local, maildir, world_readable))
return EXIT_FAILURE; return EXIT_FAILURE;
/* Set up our handler for SIGINT. We do not set SA_RESTART so that copying /* Set up our handler for SIGINT. We do not set SA_RESTART so that copying
@ -538,16 +552,11 @@ notmuch_insert_command (notmuch_config_t *config, unused(notmuch_database_t *not
sigaction (SIGINT, &action, NULL); sigaction (SIGINT, &action, NULL);
/* Write the message to the Maildir new directory. */ /* Write the message to the Maildir new directory. */
newpath = maildir_write_new (config, STDIN_FILENO, maildir, world_readable); newpath = maildir_write_new (local, STDIN_FILENO, maildir, world_readable);
if (! newpath) { if (! newpath) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
status = notmuch_database_open (notmuch_config_get_database_path (config),
NOTMUCH_DATABASE_MODE_READ_WRITE, &notmuch);
if (status)
return keep ? NOTMUCH_STATUS_SUCCESS : status_to_exit (status);
notmuch_exit_if_unmatched_db_uuid (notmuch); notmuch_exit_if_unmatched_db_uuid (notmuch);
status = notmuch_process_shared_indexing_options (notmuch); status = notmuch_process_shared_indexing_options (notmuch);
@ -589,5 +598,7 @@ notmuch_insert_command (notmuch_config_t *config, unused(notmuch_database_t *not
notmuch_run_hook (db_path, "post-insert"); notmuch_run_hook (db_path, "post-insert");
} }
talloc_free (local);
return status_to_exit (status); return status_to_exit (status);
} }

View file

@ -145,7 +145,7 @@ static command_t commands[] = {
"Interactively set up notmuch for first use." }, "Interactively set up notmuch for first use." },
{ "new", notmuch_new_command, NOTMUCH_COMMAND_CONFIG_OPEN, { "new", notmuch_new_command, NOTMUCH_COMMAND_CONFIG_OPEN,
"Find and import new messages to the notmuch database." }, "Find and import new messages to the notmuch database." },
{ "insert", notmuch_insert_command, NOTMUCH_COMMAND_CONFIG_OPEN, { "insert", notmuch_insert_command, NOTMUCH_COMMAND_DATABASE_EARLY | NOTMUCH_COMMAND_DATABASE_WRITE,
"Add a new message into the maildir and notmuch database." }, "Add a new message into the maildir and notmuch database." },
{ "search", notmuch_search_command, NOTMUCH_COMMAND_CONFIG_OPEN, { "search", notmuch_search_command, NOTMUCH_COMMAND_CONFIG_OPEN,
"Search for messages matching the given search terms." }, "Search for messages matching the given search terms." },

View file

@ -142,4 +142,42 @@ notmuch dump > OUTPUT
restore_config restore_config
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "Insert message with custom new.tags (xdg)"
backup_config
xdg_config
tag=test${RANDOM}
notmuch --config=${CONFIG_PATH} config set new.tags $tag
generate_message \
"[subject]=\"insert-subject\"" \
"[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" \
"[body]=\"insert-message\""
mkdir -p ${MAIL_DIR}/{cur,new,tmp}
notmuch insert < "$gen_msg_filename"
notmuch dump id:$gen_msg_id > OUTPUT
cat <<EOF > EXPECTED
#notmuch-dump batch-tag:3 config,properties,tags
+$tag -- id:$gen_msg_id
EOF
restore_config
test_expect_equal_file EXPECTED OUTPUT
test_begin_subtest "Insert message with custom new.tags (xdg+profile)"
backup_config
tag=test${RANDOM}
xdg_config $tag
notmuch --config=${CONFIG_PATH} config set new.tags $tag
generate_message \
"[subject]=\"insert-subject\"" \
"[date]=\"Sat, 01 Jan 2000 12:00:00 -0000\"" \
"[body]=\"insert-message\""
mkdir -p ${MAIL_DIR}/{cur,new,tmp}
notmuch insert < "$gen_msg_filename"
notmuch dump id:$gen_msg_id > OUTPUT
cat <<EOF > EXPECTED
#notmuch-dump batch-tag:3 config,properties,tags
+$tag -- id:$gen_msg_id
EOF
restore_config
test_expect_equal_file EXPECTED OUTPUT
test_done test_done

View file

@ -226,11 +226,13 @@ test_expect_code 1 "notmuch insert --folder=../G --create-folder < $gen_msg_file
OLDCONFIG=$(notmuch config get new.tags) OLDCONFIG=$(notmuch config get new.tags)
test_begin_subtest "Empty tags in new.tags are forbidden" test_begin_subtest "Empty tags in new.tags are ignored"
notmuch config set new.tags "foo;;bar" notmuch config set new.tags "foo;;bar"
gen_insert_msg gen_insert_msg
output=$(notmuch insert < $gen_msg_filename 2>&1) notmuch insert < $gen_msg_filename
test_expect_equal "$output" "Error: tag '' in new.tags: empty tag forbidden" output=$(notmuch show --format=json id:$gen_msg_id)
test_json_nodes <<<"$output" \
'new_tags:[0][0][0]["tags"] = ["bar", "foo"]'
test_begin_subtest "Tags starting with '-' in new.tags are forbidden" test_begin_subtest "Tags starting with '-' in new.tags are forbidden"
notmuch config set new.tags "-foo;bar" notmuch config set new.tags "-foo;bar"