[PATCH] Including 'unread' tag to mails without maildir flags
meskio at sindominio.net
meskio at sindominio.net
Fri Nov 19 07:41:04 PST 2010
From: Ruben Pollan <meskio at sindominio.net>
Some mail fetchers, like fetchmail, leaves the email without ':2,' at the end of
the filename. Notmuch didn't detect this emails as maildir, it didn't add the
maildir flags to them.
Now it detects if a mail is in a maildir by the directory structure, and add its
maildir flags correctly.
---
lib/message.cc | 87 +++++++++++++++++++++++++++++---------------------------
1 files changed, 45 insertions(+), 42 deletions(-)
diff --git a/lib/message.cc b/lib/message.cc
index 225b7e9..996c1df 100644
--- a/lib/message.cc
+++ b/lib/message.cc
@@ -854,6 +854,47 @@ notmuch_message_remove_tag (notmuch_message_t *message, const char *tag)
return NOTMUCH_STATUS_SUCCESS;
}
+/* Is the given filename within a maildir directory?
+ *
+ * Specifically, is the final directory component of 'filename' either
+ * "cur" or "new". If so, return a pointer to that final directory
+ * component within 'filename'. If not, return NULL.
+ *
+ * A non-NULL return value is guaranteed to be a valid string pointer
+ * pointing to the characters "new/" or "cur/", (but not
+ * NUL-terminated).
+ */
+static const char *
+_filename_is_in_maildir (const char *filename)
+{
+ const char *slash, *dir = NULL;
+
+ /* Find the last '/' separating directory from filename. */
+ slash = strrchr (filename, '/');
+ if (slash == NULL)
+ return NULL;
+
+ /* Jump back 4 characters to where the previous '/' will be if the
+ * directory is named "cur" or "new". */
+ if (slash - filename < 4)
+ return NULL;
+
+ slash -= 4;
+
+ if (*slash != '/')
+ return NULL;
+
+ dir = slash + 1;
+
+ if (STRNCMP_LITERAL (dir, "cur/") == 0 ||
+ STRNCMP_LITERAL (dir, "new/") == 0)
+ {
+ return dir;
+ }
+
+ return NULL;
+}
+
notmuch_status_t
notmuch_message_maildir_flags_to_tags (notmuch_message_t *message)
{
@@ -871,11 +912,14 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message)
{
filename = notmuch_filenames_get (filenames);
+ if (! _filename_is_in_maildir(filename))
+ continue;
+ seen_maildir_info = 1;
+
flags = strstr (filename, ":2,");
if (! flags)
continue;
- seen_maildir_info = 1;
flags += 3;
combined_flags = talloc_strdup_append (combined_flags, flags);
@@ -910,47 +954,6 @@ notmuch_message_maildir_flags_to_tags (notmuch_message_t *message)
return status;
}
-/* Is the given filename within a maildir directory?
- *
- * Specifically, is the final directory component of 'filename' either
- * "cur" or "new". If so, return a pointer to that final directory
- * component within 'filename'. If not, return NULL.
- *
- * A non-NULL return value is guaranteed to be a valid string pointer
- * pointing to the characters "new/" or "cur/", (but not
- * NUL-terminated).
- */
-static const char *
-_filename_is_in_maildir (const char *filename)
-{
- const char *slash, *dir = NULL;
-
- /* Find the last '/' separating directory from filename. */
- slash = strrchr (filename, '/');
- if (slash == NULL)
- return NULL;
-
- /* Jump back 4 characters to where the previous '/' will be if the
- * directory is named "cur" or "new". */
- if (slash - filename < 4)
- return NULL;
-
- slash -= 4;
-
- if (*slash != '/')
- return NULL;
-
- dir = slash + 1;
-
- if (STRNCMP_LITERAL (dir, "cur/") == 0 ||
- STRNCMP_LITERAL (dir, "new/") == 0)
- {
- return dir;
- }
-
- return NULL;
-}
-
/* From the set of tags on 'message' and the flag2tag table, compute a
* set of maildir-flag actions to be taken, (flags that should be
* either set or cleared).
--
1.7.1
More information about the notmuch
mailing list