A better fix would probably be based on scheme. Signed-off-by: Ethan Glasser-Camp <ethan@betacantrips.com> --- lib/message.cc | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/lib/message.cc b/lib/message.cc index c9857f5..8ecec71 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -23,6 +23,7 @@ #include <stdint.h> +#include <uriparser/Uri.h> #include <gmime/gmime.h> struct visible _notmuch_message { @@ -1093,7 +1094,6 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message) { filename = notmuch_filenames_get (filenames); dir = _filename_is_in_maildir (filename); - if (! dir) continue; @@ -1304,12 +1304,46 @@ _new_maildir_filename (void *ctx, return filename_new; } +/* Parses a maildir URI and returns the filename corresponding to its + * path. + * + * Returns NULL if either the URI couldn't be parsed or if the + * scheme isn't maildir:. + */ +static char * +_get_maildir_filename (const char *filename) +{ + UriParserStateA parser_state; + UriUriA parsed; + char *path; + parser_state.uri = &parsed; + + if (uriParseUriA (&parser_state, filename) != URI_SUCCESS) { + uriFreeUriMembersA (&parsed); + return NULL; + } + + if (parsed.scheme.first != NULL && + 0 != strncmp(parsed.scheme.first, "maildir", + parsed.scheme.afterLast-parsed.scheme.first)) { + /* Full URI with non-maildir scheme. */ + uriFreeUriMembersA (&parsed); + return NULL; + } + + path = (char *)parsed.pathHead->text.first - 1; + uriFreeUriMembersA (&parsed); + return path; + +} + + notmuch_status_t notmuch_message_tags_to_maildir_flags (notmuch_message_t *message) { notmuch_filenames_t *filenames; const char *filename; - char *filename_new; + char *filename_new, *filename_old, *filename_new_uri; char *to_set, *to_clear; notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; @@ -1324,16 +1358,22 @@ notmuch_message_tags_to_maildir_flags (notmuch_message_t *message) if (! _filename_is_in_maildir (filename)) continue; - filename_new = _new_maildir_filename (message, filename, + filename_old = _get_maildir_filename (filename); + if (filename_old == NULL) + continue; + + filename_new = _new_maildir_filename (message, filename_old, to_set, to_clear); if (filename_new == NULL) continue; + filename_new_uri = talloc_asprintf (message, "maildir://%s", filename_new); + if (strcmp (filename, filename_new)) { int err; notmuch_status_t new_status; - err = rename (filename, filename_new); + err = rename (filename_old, filename_new); if (err) continue; @@ -1347,7 +1387,7 @@ notmuch_message_tags_to_maildir_flags (notmuch_message_t *message) } new_status = _notmuch_message_add_filename (message, - filename_new); + filename_new_uri); /* Hold on to only the first error. */ if (! status && new_status) { status = new_status; @@ -1358,6 +1398,7 @@ notmuch_message_tags_to_maildir_flags (notmuch_message_t *message) } talloc_free (filename_new); + talloc_free (filename_new_uri); } talloc_free (to_set); -- 1.7.9.5