From: Carl Worth <cworth@cworth.org>
Date: Thu, 11 Nov 2010 08:18:35 +0000 (-0800)
Subject: Fix notmuch_message_maildir_flags_to_tags to iterate over filenames
X-Git-Tag: 0.5~35
X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=4b6063397ffcc13f38757e7052e3dc6649d9703c;p=notmuch-old

Fix notmuch_message_maildir_flags_to_tags to iterate over filenames

As documented, this function now iterates over all filenames for the
message, computing a logical OR of the flags set on the filenames,
then uses the final result to set tags on the message.

This change fixes 3 of the 10 maildir-sync tests that have been
failing since being added.
---

diff --git a/lib/message.cc b/lib/message.cc
index 83e05191..ee52672a 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -859,53 +859,40 @@ notmuch_message_remove_tag (notmuch_message_t *message, const char *tag)
     return NOTMUCH_STATUS_SUCCESS;
 }
 
-/* XXX: Needs to iterate over all message filenames. */
 notmuch_status_t
 notmuch_message_maildir_flags_to_tags (notmuch_message_t *message)
 {
-    const char *flags, *p;
-    char f;
-    bool valid, unread;
-    unsigned i;
+    const char *flags;
     notmuch_status_t status;
+    notmuch_filenames_t *filenames;
     const char *filename;
+    char *combined_flags = talloc_strdup (message, "");
+    unsigned i;
 
-    filename = notmuch_message_get_filename (message);
+    for (filenames = notmuch_message_get_filenames (message);
+	 notmuch_filenames_valid (filenames);
+	 notmuch_filenames_move_to_next (filenames))
+    {
+	filename = notmuch_filenames_get (filenames);
 
-    flags = strstr (filename, ":2,");
-    if (!flags)
-	return NOTMUCH_STATUS_FILE_NOT_EMAIL;
-    flags += 3;
-
-    /*  Check that the letters are valid Maildir flags */
-    f = 0;
-    valid = true;
-    for (p=flags; valid && *p; p++) {
-	switch (*p) {
-	case 'P':
-	case 'R':
-	case 'S':
-	case 'T':
-	case 'D':
-	case 'F':
-	    if (*p > f) f=*p;
-	    else valid = false;
-	break;
-	default:
-	    valid = false;
-	}
-    }
-    if (!valid) {
-	fprintf (stderr, "Warning: Invalid maildir flags in filename %s\n", filename);
-	return NOTMUCH_STATUS_FILE_NOT_EMAIL;
+	flags = strstr (filename, ":2,");
+	if (! flags)
+	    continue;
+
+	flags += 3;
+
+	combined_flags = talloc_strdup_append (combined_flags, flags);
     }
 
     status = notmuch_message_freeze (message);
     if (status)
 	return status;
-    unread = true;
+
     for (i = 0; i < ARRAY_SIZE(flag2tag); i++) {
-	if ((strchr (flags, flag2tag[i].flag) != NULL) ^ flag2tag[i].inverse) {
+	if ((strchr (combined_flags, flag2tag[i].flag) != NULL)
+	    ^ 
+	    flag2tag[i].inverse)
+	{
 	    status = notmuch_message_add_tag (message, flag2tag[i].tag);
 	} else {
 	    status = notmuch_message_remove_tag (message, flag2tag[i].tag);
@@ -915,6 +902,8 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message)
     }
     status = notmuch_message_thaw (message);
 
+    talloc_free (combined_flags);
+
     return status;
 }