_notmuch_message_ensure_filename_list converts "relative" paths, such as those stored in Xapian until now, to "absolute" paths. However, URLs are already absolute, and prepending the database path will just confuse matters. Signed-off-by: Ethan Glasser-Camp <ethan@betacantrips.com> --- lib/message.cc | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/message.cc b/lib/message.cc index 978de06..235185c 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -21,6 +21,7 @@ #include "notmuch-private.h" #include "database-private.h" +#include <uriparser/Uri.h> #include <stdint.h> #include <gmime/gmime.h> @@ -682,6 +683,8 @@ _notmuch_message_ensure_filename_list (notmuch_message_t *message) const char *db_path, *directory, *basename, *filename; char *colon, *direntry = NULL; unsigned int directory_id; + UriUriA parsed; + UriParserStateA parser; direntry = node->string; @@ -700,9 +703,20 @@ _notmuch_message_ensure_filename_list (notmuch_message_t *message) message->notmuch, directory_id); - if (strlen (directory)) - filename = talloc_asprintf (message, "%s/%s/%s", - db_path, directory, basename); + parser.uri = &parsed; + + if (strlen (directory)) { + /* If directory is a URI, we don't need to append the db_path; + * it is already an absolute path. */ + if (uriParseUriA (&parser, directory) != URI_SUCCESS || + parsed.scheme.first == NULL) + filename = talloc_asprintf (message, "%s/%s/%s", + db_path, directory, basename); + else + filename = talloc_asprintf (message, "%s/%s", + directory, basename); + uriFreeUriMembersA (&parsed); + } else filename = talloc_asprintf (message, "%s/%s", db_path, basename); -- 1.7.9.5