notmuch_message_tags_to_maildir_flags() unconditionally moves messages from maildir directory "new/" to maildir directory "cur/", which makes messages lose their "new" status in the MUA. However some users want to keep this "new" status after, for instance, an auto-tagging of new messages.
However, as Austin mentioned and according to the maildir specification, messages living in "new/" are not allowed to have flags, even if mutt allows it to happen. For this reason, this patch prevents moving messages from "new/" to "cur/", only if no flags have to be changed. It's hopefully enough to satisfy mutt (and maybe other MUAs showing the "new" status) users checking the "new" status. Changelog: * v2: Fix bool type as well as NULL returned despite having no errors (Austin Clements) * v4: Tag the related test (contributed by Michal Sojka) as working Signed-off-by: Louis Rilling <l.rill...@av7.net> --- lib/message.cc | 12 +++++++++++- test/maildir-sync | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/message.cc b/lib/message.cc index b1b2942..c003729 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -1139,7 +1139,7 @@ _get_maildir_flag_actions (notmuch_message_t *message, * compute the new maildir filename. * * If the existing filename is in the directory "new", the new - * filename will be in the directory "cur". + * filename will be in the directory "cur", unless no flags are changed. * * After a sequence of ":2," in the filename, any subsequent * single-character flags will be added or removed according to the @@ -1162,6 +1162,7 @@ _new_maildir_filename (void *ctx, char *filename_new, *dir; char flag_map[128]; int flags_in_map = 0; + notmuch_bool_t flags_changed = FALSE; unsigned int i; char *s; @@ -1202,6 +1203,7 @@ _new_maildir_filename (void *ctx, if (flag_map[flag] == 0) { flag_map[flag] = 1; flags_in_map++; + flags_changed = TRUE; } } @@ -1210,9 +1212,17 @@ _new_maildir_filename (void *ctx, if (flag_map[flag]) { flag_map[flag] = 0; flags_in_map--; + flags_changed = TRUE; } } + /* No need to rename. Messages in new/ can be kept in new/. + * Note: We don't even try to fix buggy messages having flags and living in + * new/. It's not our business. + */ + if (!flags_changed) + return talloc_strdup (ctx, filename); + filename_new = (char *) talloc_size (ctx, info - filename + strlen (":2,") + flags_in_map + 1); diff --git a/test/maildir-sync b/test/maildir-sync index b3e90ae..e1ad81c 100755 --- a/test/maildir-sync +++ b/test/maildir-sync @@ -92,7 +92,7 @@ test_begin_subtest "Adding non-maildir tags does not move message from new to cu add_message [subject]='"Message to stay in new"' [date]='"Sat, 01 Jan 2000 12:00:00 -0000"' [filename]='message-to-stay-in-new' [dir]=new notmuch tag +donotmove subject:"Message to stay in new" output=$(cd "$MAIL_DIR"; ls */message-to-stay-in-new*) -test_expect_equal_failure "$output" "new/message-to-stay-in-new" +test_expect_equal "$output" "new/message-to-stay-in-new" test_begin_subtest "Removing 'S' flag from existing filename adds 'unread' tag" add_message [subject]='"Removing S flag"' [filename]='removing-s-flag:2,S' [dir]=cur -- 1.7.2.5 _______________________________________________ notmuch mailing list notmuch@notmuchmail.org http://notmuchmail.org/mailman/listinfo/notmuch