X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;ds=sidebyside;f=lib%2Fmessage.cc;h=b4bf0ce03463c0245a8d729ee33dbc4fde7af99e;hb=37a8096fdc0584567aab43a8bede7b32860a3517;hp=39036ecca5516a4a7bc6f896f686a62d89d503c6;hpb=81cbaafc0f64dcc77933d06e0d2b22ee38eefd88;p=notmuch diff --git a/lib/message.cc b/lib/message.cc index 39036ecc..b4bf0ce0 100644 --- a/lib/message.cc +++ b/lib/message.cc @@ -868,6 +868,7 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message) const char *filename; char *combined_flags = talloc_strdup (message, ""); unsigned i; + int seen_maildir_info = 0; for (filenames = notmuch_message_get_filenames (message); notmuch_filenames_valid (filenames); @@ -879,11 +880,18 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message) if (! flags) continue; + seen_maildir_info = 1; flags += 3; combined_flags = talloc_strdup_append (combined_flags, flags); } + /* If none of the filenames have any maildir info field (not even + * an empty info with no flags set) then there's no information to + * go on, so do nothing. */ + if (! seen_maildir_info) + return NOTMUCH_STATUS_SUCCESS; + status = notmuch_message_freeze (message); if (status) return status; @@ -953,15 +961,14 @@ maildir_get_subdir (char *filename) return subdir; } -/* XXX: Needs to iterate over all filenames in the message - * - * XXX: Needs to ensure that existing, unsupported flags in the +/* XXX: Needs to ensure that existing, unsupported flags in the * filename are left unchanged (which also needs a test in the * test suite). */ notmuch_status_t notmuch_message_tags_to_maildir_flags (notmuch_message_t *message) { + notmuch_filenames_t *filenames; char flags[ARRAY_SIZE(flag2tag)+1]; const char *filename, *p; char *filename_new, *subdir = NULL; @@ -969,49 +976,52 @@ notmuch_message_tags_to_maildir_flags (notmuch_message_t *message) maildir_get_new_flags (message, flags); - filename = notmuch_message_get_filename (message); - /* TODO: Iterate over all file names. */ - p = strstr(filename, ":2,"); - if ((p && strcmp (p+3, flags) == 0) || - (!p && flags[0] == '\0')) { - // Return if flags are not to be changed - this suppresses - // moving the message from new/ to cur/ during initial - // tagging. - return NOTMUCH_STATUS_SUCCESS; - } - if (!p) - p = filename + strlen(filename); + for (filenames = notmuch_message_get_filenames (message); + notmuch_filenames_valid (filenames); + notmuch_filenames_move_to_next (filenames)) + { + filename = notmuch_filenames_get (filenames); - filename_new = (char*)talloc_size(message, (p-filename) + 3 + sizeof(flags)); - if (unlikely (filename_new == NULL)) - return NOTMUCH_STATUS_OUT_OF_MEMORY; + p = strstr(filename, ":2,"); + if ((p && strcmp (p+3, flags) == 0) || + (!p && flags[0] == '\0')) + { + continue; + } - memcpy(filename_new, filename, p-filename); - filename_new[p-filename] = '\0'; + if (!p) + p = filename + strlen(filename); - /* If message is in new/ move it under cur/. */ - subdir = maildir_get_subdir (filename_new); - if (subdir && memcmp (subdir, "new/", 4) == 0) - memcpy (subdir, "cur/", 4); + filename_new = (char*) talloc_size (message, + (p-filename) + 3 + sizeof (flags)); + if (unlikely (filename_new == NULL)) + return NOTMUCH_STATUS_OUT_OF_MEMORY; - strcpy (filename_new+(p-filename), ":2,"); - strcpy (filename_new+(p-filename)+3, flags); + memcpy (filename_new, filename, p-filename); + filename_new[p-filename] = '\0'; - if (strcmp (filename, filename_new) != 0) { - notmuch_status_t status; + /* If message is in new/ move it under cur/. */ + subdir = maildir_get_subdir (filename_new); + if (subdir && memcmp (subdir, "new/", 4) == 0) + memcpy (subdir, "cur/", 4); - ret = rename (filename, filename_new); - if (ret == -1) { - perror (talloc_asprintf (message, "rename of %s to %s failed", - filename, filename_new)); - exit (1); - } - status = _notmuch_message_rename (message, filename_new); + strcpy (filename_new+(p-filename), ":2,"); + strcpy (filename_new+(p-filename)+3, flags); - _notmuch_message_sync (message); + if (strcmp (filename, filename_new) != 0) { + notmuch_status_t status = NOTMUCH_STATUS_SUCCESS; - return status; + ret = rename (filename, filename_new); + if (ret == 0) + status = _notmuch_message_rename (message, filename_new); + + _notmuch_message_sync (message); + + if (status) + return status; + } } + return NOTMUCH_STATUS_SUCCESS; }