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 _______________________________________________ notmuch mailing list -- notmuch@notmuchmail.org To unsubscribe send an email to notmuch-leave@notmuchmail.org