From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id egl3EMs15V8KGwAA0tVLHw (envelope-from ) for ; Fri, 25 Dec 2020 00:43:55 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id cKXKC8s15V8MYwAAB5/wlQ (envelope-from ) for ; Fri, 25 Dec 2020 00:43:55 +0000 Received: from mail.notmuchmail.org (nmbug.tethera.net [IPv6:2607:5300:201:3100::1657]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (2048 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 2ADE59403A9 for ; Fri, 25 Dec 2020 00:43:54 +0000 (UTC) Received: from nmbug.tethera.net (localhost [127.0.0.1]) by mail.notmuchmail.org (Postfix) with ESMTP id 6C14C29D1B; Thu, 24 Dec 2020 19:43:13 -0500 (EST) Received: from fethera.tethera.net (fethera.tethera.net [IPv6:2607:5300:60:c5::1]) by mail.notmuchmail.org (Postfix) with ESMTP id 089C829CDF for ; Thu, 24 Dec 2020 19:42:49 -0500 (EST) Received: by fethera.tethera.net (Postfix, from userid 1001) id EB06B5FC36; Thu, 24 Dec 2020 19:42:48 -0500 (EST) Received: (nullmailer pid 650457 invoked by uid 1000); Fri, 25 Dec 2020 00:42:36 -0000 From: David Bremner To: notmuch@notmuchmail.org Cc: David Bremner Subject: [PATCH 15/24] CLI/insert: convert to new config framework. Date: Thu, 24 Dec 2020 20:42:19 -0400 Message-Id: <20201225004228.647328-16-david@tethera.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201225004228.647328-1-david@tethera.net> References: <20201225004228.647328-1-david@tethera.net> MIME-Version: 1.0 Message-ID-Hash: 2VPVO4A65DHIQYHMX3JIX77ZGAEJ7JIW X-Message-ID-Hash: 2VPVO4A65DHIQYHMX3JIX77ZGAEJ7JIW X-MailFrom: bremner@tethera.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-notmuch.notmuchmail.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.1 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: 0.60 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 2607:5300:201:3100::1657 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Queue-Id: 2ADE59403A9 X-Spam-Score: 0.60 X-Migadu-Scanner: scn0.migadu.com X-TUID: DmhHA5hzBxeV 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. --- notmuch-insert.c | 59 +++++++++++++++++++++++++++------------------ notmuch.c | 2 +- test/T070-insert.sh | 8 +++--- 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/notmuch-insert.c b/notmuch-insert.c index de160309..e483b949 100644 --- a/notmuch-insert.c +++ b/notmuch-insert.c @@ -444,14 +444,12 @@ add_file (notmuch_database_t *notmuch, const char *path, tag_op_list_t *tag_ops, } 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_database_t *notmuch; struct sigaction action; const char *db_path; - const char **new_tags; - size_t new_tags_length; + notmuch_config_values_t *new_tags = NULL; tag_op_list_t *tag_ops; char *query_string = NULL; const char *folder = ""; @@ -459,11 +457,11 @@ notmuch_insert_command (notmuch_config_t *config, unused(notmuch_database_t *not bool keep = false; bool hooks = true; bool world_readable = false; - bool synchronize_flags; + notmuch_bool_t synchronize_flags; char *maildir; char *newpath; int opt_index; - unsigned int i; + void *local = talloc_new (NULL); notmuch_opt_desc_t options[] = { { .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]); - 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) { fprintf (stderr, "Out of memory.\n"); 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; - - error_msg = illegal_tag (new_tags[i], false); + const char *tag = notmuch_config_values_get (new_tags); + error_msg = illegal_tag (tag, false); if (error_msg) { fprintf (stderr, "Error: tag '%s' in new.tags: %s\n", - new_tags[i], error_msg); + tag, error_msg); 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; } - 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)) return EXIT_FAILURE; @@ -519,14 +533,14 @@ notmuch_insert_command (notmuch_config_t *config, unused(notmuch_database_t *not return EXIT_FAILURE; } - maildir = talloc_asprintf (config, "%s/%s", db_path, folder); + maildir = talloc_asprintf (local, "%s/%s", db_path, folder); if (! maildir) { fprintf (stderr, "Out of memory\n"); return EXIT_FAILURE; } 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; /* 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); /* 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) { return EXIT_FAILURE; } - status = notmuch_database_open (notmuch_config_get_database_path (config), - NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much); - if (status) - return keep ? NOTMUCH_STATUS_SUCCESS : status_to_exit (status); - notmuch_exit_if_unmatched_db_uuid (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"); } + talloc_free (local); + return status_to_exit (status); } diff --git a/notmuch.c b/notmuch.c index 4258ed43..8e697396 100644 --- a/notmuch.c +++ b/notmuch.c @@ -145,7 +145,7 @@ static command_t commands[] = { "Interactively set up notmuch for first use." }, { "new", notmuch_new_command, NOTMUCH_COMMAND_CONFIG_OPEN, "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." }, { "search", notmuch_search_command, NOTMUCH_COMMAND_CONFIG_OPEN, "Search for messages matching the given search terms." }, diff --git a/test/T070-insert.sh b/test/T070-insert.sh index 1c7ca846..7341810c 100755 --- a/test/T070-insert.sh +++ b/test/T070-insert.sh @@ -226,11 +226,13 @@ test_expect_code 1 "notmuch insert --folder=../G --create-folder < $gen_msg_file 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" gen_insert_msg -output=$(notmuch insert < $gen_msg_filename 2>&1) -test_expect_equal "$output" "Error: tag '' in new.tags: empty tag forbidden" +notmuch insert < $gen_msg_filename +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" notmuch config set new.tags "-foo;bar" -- 2.29.2