From: Brennan Vincent <brennan@umanwizard.com>
To: notmuch@notmuchmail.org
Subject: [PATCH v3] Add --emit-message-id flag to notmuch-insert.
Date: Thu, 26 Sep 2024 16:25:51 -0400 [thread overview]
Message-ID: <87a5fukvqo.fsf@denver.mail-host-address-is-not-set> (raw)
In-Reply-To: <87plpbtfj2.fsf@taipei.mail-host-address-is-not-set>
It may be the case that a user (or script) wants to take some action
on a message immediately after inserting it. This can be done if one
knows the Message-ID with which the message was inserted. In order to
facilitate this use case, we add a flag "--emit-message-id" to notmuch
insert.
One example of a possible usecase (which is part of an upcoming patch)
is an emacs command to begin editing the current buffer as a draft.
---
doc/man1/notmuch-insert.rst | 5 +++++
notmuch-insert.c | 24 ++++++++++++++++++++----
test/T070-insert.sh | 31 +++++++++++++++++++++++++++++++
3 files changed, 56 insertions(+), 4 deletions(-)
diff --git a/doc/man1/notmuch-insert.rst b/doc/man1/notmuch-insert.rst
index e05bd0b5..141e5cb9 100644
--- a/doc/man1/notmuch-insert.rst
+++ b/doc/man1/notmuch-insert.rst
@@ -66,6 +66,11 @@ Supported options for **insert** include
umask. By default, delivered mail is only readable by the current
user.
+.. option:: --emit-message-id
+
+ If the message was successfully inserted into the database,
+ print the message ID of the newly indexed message.
+
.. option:: --decrypt=(true|nostash|auto|false)
If ``true`` and the message is encrypted, try to decrypt the
diff --git a/notmuch-insert.c b/notmuch-insert.c
index e44607ad..05945a99 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -401,7 +401,8 @@ maildir_write_new (const void *ctx, int fdin, const char *maildir, bool world_re
static notmuch_status_t
add_file (notmuch_database_t *notmuch, const char *path, tag_op_list_t *tag_ops,
bool synchronize_flags, bool keep,
- notmuch_indexopts_t *indexopts)
+ notmuch_indexopts_t *indexopts,
+ char **message_id_out)
{
notmuch_message_t *message;
notmuch_status_t status;
@@ -441,8 +442,6 @@ add_file (notmuch_database_t *notmuch, const char *path, tag_op_list_t *tag_ops,
}
DONE:
- notmuch_message_destroy (message);
-
if (status) {
if (keep) {
status = NOTMUCH_STATUS_SUCCESS;
@@ -458,6 +457,15 @@ add_file (notmuch_database_t *notmuch, const char *path, tag_op_list_t *tag_ops,
}
}
}
+ if (message_id_out) {
+ if (status == NOTMUCH_STATUS_SUCCESS) {
+ *message_id_out = talloc_strdup(notmuch, notmuch_message_get_message_id(message));
+ } else {
+ *message_id_out = NULL;
+ }
+ }
+ notmuch_message_destroy (message);
+
FAIL:
return status;
@@ -477,10 +485,12 @@ notmuch_insert_command (notmuch_database_t *notmuch, int argc, char *argv[])
bool keep = false;
bool hooks = true;
bool world_readable = false;
+ bool emit_message_id = false;
notmuch_bool_t synchronize_flags;
char *maildir;
char *newpath;
int opt_index;
+ char *message_id;
notmuch_indexopts_t *indexopts = notmuch_database_get_default_indexopts (notmuch);
void *local = talloc_new (NULL);
@@ -491,6 +501,7 @@ notmuch_insert_command (notmuch_database_t *notmuch, int argc, char *argv[])
{ .opt_bool = &keep, .name = "keep" },
{ .opt_bool = &hooks, .name = "hooks" },
{ .opt_bool = &world_readable, .name = "world-readable" },
+ { .opt_bool = &emit_message_id, .name = "emit-message-id" },
{ .opt_inherit = notmuch_shared_indexing_options },
{ .opt_inherit = notmuch_shared_options },
{ }
@@ -580,7 +591,8 @@ notmuch_insert_command (notmuch_database_t *notmuch, int argc, char *argv[])
}
/* Index the message. */
- status = add_file (notmuch, newpath, tag_ops, synchronize_flags, keep, indexopts);
+ status = add_file (notmuch, newpath, tag_ops, synchronize_flags, keep, indexopts,
+ emit_message_id ? &message_id : NULL);
/* Commit changes. */
close_status = notmuch_database_close (notmuch);
@@ -606,6 +618,10 @@ notmuch_insert_command (notmuch_database_t *notmuch, int argc, char *argv[])
}
}
+ if (emit_message_id && message_id && status == NOTMUCH_STATUS_SUCCESS) {
+ printf("%s\n", message_id);
+ }
+
if (hooks && status == NOTMUCH_STATUS_SUCCESS) {
/* Ignore hook failures. */
notmuch_run_hook (notmuch, "post-insert");
diff --git a/test/T070-insert.sh b/test/T070-insert.sh
index 73953272..6ae6abd0 100755
--- a/test/T070-insert.sh
+++ b/test/T070-insert.sh
@@ -257,6 +257,33 @@ test_expect_code 1 "notmuch insert < $gen_msg_filename 2>&1"
notmuch config set new.tags $OLDCONFIG
+gen_insert_msg
+test_begin_subtest "--emit-message-id works"
+output=$(notmuch insert --emit-message-id < $gen_msg_filename)
+expected_msg_id=$(< $gen_msg_filename grep Message-Id | sed -E 's/^Message-Id: <(.*)>$/\1/')
+test_expect_equal "$output" "$expected_msg_id"
+
+test_begin_subtest "--emit-message-id works even when the message already exists"
+output=$(notmuch insert --emit-message-id < $gen_msg_filename)
+expected_msg_id=$(< $gen_msg_filename grep Message-Id | sed -E 's/^Message-Id: <(.*)>$/\1/')
+test_expect_equal "$output" "$expected_msg_id"
+
+gen_insert_msg
+test_begin_subtest "--keep --emit-message-id works when maildir flag sync fails"
+make_shim shim-failed-sync <<EOF
+#include <notmuch.h>
+notmuch_status_t
+notmuch_message_tags_to_maildir_flags (notmuch_message_t *message)
+{
+ return NOTMUCH_STATUS_OUT_OF_MEMORY;
+}
+EOF
+notmuch config set maildir.synchronize_flags true
+output=$(notmuch_with_shim shim-failed-sync insert --keep --emit-message-id < $gen_msg_filename)
+expected_msg_id=$(< $gen_msg_filename grep Message-Id | sed -E 's/^Message-Id: <(.*)>$/\1/')
+test_expect_equal "$output" "$expected_msg_id"
+notmuch config set maildir.synchronize_flags false
+
# DUPLICATE_MESSAGE_ID is not tested here, because it should actually pass.
# pregenerate all of the test shims
for code in FILE_NOT_EMAIL READ_ONLY_DATABASE UPGRADE_REQUIRED PATH_ERROR OUT_OF_MEMORY XAPIAN_EXCEPTION; do
@@ -282,6 +309,10 @@ for code in FILE_NOT_EMAIL READ_ONLY_DATABASE UPGRADE_REQUIRED PATH_ERROR; do
test_begin_subtest "success exit with --keep when index_file returns $code"
test_expect_code 0 "notmuch_with_shim shim-$code insert --keep < \"$gen_msg_filename\""
+
+ test_begin_subtest "nothing printed even with --keep --emit-message-id when index_file returns $code"
+ output=$(notmuch_with_shim shim-$code insert --keep --emit-message-id < $gen_msg_filename)
+ test_expect_equal "$output" ""
done
for code in OUT_OF_MEMORY XAPIAN_EXCEPTION ; do
--
2.46.0
prev parent reply other threads:[~2024-09-26 20:26 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-10 20:33 [PATCH] Add --emit-message-id flag to notmuch-insert Brennan Vincent
2024-09-11 15:00 ` [PATCH v2] " Brennan Vincent
2024-09-25 21:51 ` David Bremner
2024-10-03 17:35 ` When exactly is the post-insert hook called? Ralph Seichter
2024-10-03 17:59 ` Ralph Seichter
2024-09-11 16:09 ` [PATCH] emacs: Introduce notmuch-draftify-buffer command Brennan Vincent
2024-09-25 22:09 ` David Bremner
2024-09-29 0:36 ` Brennan Vincent
2024-09-26 20:25 ` Brennan Vincent [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87a5fukvqo.fsf@denver.mail-host-address-is-not-set \
--to=brennan@umanwizard.com \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).