[PATCH] notmuch: Add "maildir:" search option
Jani Nikula
jani at nikula.org
Sun Jan 12 07:53:52 PST 2014
On Tue, 12 Nov 2013, Peter Zijlstra <peterz at infradead.org> wrote:
> Subject: notmuch: Add "maildir:" search option
>
> The current "folder:" search terms are near useless when you have
> recursive folders, introduce a boolean "maildir:" search term to
> exactly match the maildir folder.
Hi Peter -
Per some discussion on IRC about the usefulness of the current "folder:"
prefix, I went ahead and sent patches to make "folder:" a boolean prefix
[1]. It's not the same as your "maildir:" implementation, but I believe
you could use it to achieve the things you want with that. In
particular, my proposed "folder:" prefix is the literal path from
maildir root, and does not make any assumptions about maildir - i.e. it
requires the final cur/new too. (That can be useful for some mutt users
who need the cur/new distinction.)
I am not opposed to adding another prefix like "maildir:" that does make
assumptions on the mail storage and transformations on the path, but I
do think it would be less important with the boolean "folder:" in place.
BR,
Jani.
[1] id:cover.1389304779.git.jani at nikula.org
>
> Given a Maildir++ layout like:
>
> ~/Maildir/
> ~/Maildir/cur
> ~/Maildir/new
> ~/Maildir/tmp
> ~/Maildir/.Sent
> ~/Maildir/.Sent/cur
> ~/Maildir/.Sent/new
> ~/Maildir/.Sent/tmp
> ~/Maildir/.INBOX.LKML
> ~/Maildir/.INBOX.LKML/cur
> ~/Maildir/.INBOX.LKML/new
> ~/Maildir/.INBOX.LKML/tmp
> ~/Maildir/.INBOX.LKML.netdev
> ~/Maildir/.INBOX.LKML.netdev/cur
> ~/Maildir/.INBOX.LKML.netdev/new
> ~/Maildir/.INBOX.LKML.netdev/tmp
> ~/Maildir/.INBOX.LKML.arch
> ~/Maildir/.INBOX.LKML.arch/cur
> ~/Maildir/.INBOX.LKML.arch/new
> ~/Maildir/.INBOX.LKML.arch/tmp
>
> This patch generates the following search index:
>
> $ delve -a Maildir/.notmuch/xapian/ | ~/s XMAILDIR
> XMAILDIR:INBOX
> XMAILDIR:INBOX/LKML
> XMAILDIR:INBOX/LKML/arch
> XMAILDIR:INBOX/LKML/netdev
> XMAILDIR:Sent
>
> Which allows one (me!!1) to pose queries like:
>
> maildir:INBOX and not tag:list
>
> to more easily find offlist mail (from people like my family who don't
> actually send their stuff over LKML :-).
>
> Signed-off-by: Peter Zijlstra <peterz at infradead.org>
> ---
>
> XXX: now I need to go figure out how to do searches like:
>
> subject:PATCH/0
>
> which would mandate that PATCH is the first word occurring in the
> subject. I think the position index holds enough information but I
> need to look into that and obviously the query parser needs work for
> this.
>
>
> lib/database.cc | 7 ++++---
> lib/message.cc | 40 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 44 insertions(+), 3 deletions(-)
>
> diff --git a/lib/database.cc b/lib/database.cc
> index a021bf17253c..53aeaa68954d 100644
> --- a/lib/database.cc
> +++ b/lib/database.cc
> @@ -208,15 +208,16 @@ static prefix_t BOOLEAN_PREFIX_EXTERNAL[] = {
> { "thread", "G" },
> { "tag", "K" },
> { "is", "K" },
> - { "id", "Q" }
> + { "id", "Q" },
> + { "maildir", "XMAILDIR:" },
> };
>
> static prefix_t PROBABILISTIC_PREFIX[]= {
> { "from", "XFROM" },
> { "to", "XTO" },
> { "attachment", "XATTACHMENT" },
> - { "subject", "XSUBJECT"},
> - { "folder", "XFOLDER"}
> + { "subject", "XSUBJECT" },
> + { "folder", "XFOLDER" },
> };
>
> const char *
> diff --git a/lib/message.cc b/lib/message.cc
> index 1b4637950f8e..45a727a6208f 100644
> --- a/lib/message.cc
> +++ b/lib/message.cc
> @@ -22,6 +22,7 @@
> #include "database-private.h"
>
> #include <stdint.h>
> +#include <string.h>
>
> #include <gmime/gmime.h>
>
> @@ -485,6 +486,8 @@ _notmuch_message_add_filename (notmuch_message_t *message,
> notmuch_status_t status;
> void *local = talloc_new (message);
> char *direntry;
> + char *maildir;
> + int i;
>
> if (filename == NULL)
> INTERNAL_ERROR ("Message filename cannot be NULL.");
> @@ -507,6 +510,43 @@ _notmuch_message_add_filename (notmuch_message_t *message,
> /* New terms allow user to search with folder: specification. */
> _notmuch_message_gen_terms (message, "folder", directory);
>
> + /* Convert the directory into a maildir path */
> + maildir = talloc_strdup(local, directory);
> +
> + /* Strip the maildir "cur", "new" directory entries. */
> + i = strlen(maildir);
> + if (strncmp(maildir + i - 3, "cur", 3) == 0 ||
> + strncmp(maildir + i - 3, "new", 3) == 0) {
> + maildir[i - 3] = '\0';
> + i -= 3;
> + }
> +
> + /* Strip trailing '/' */
> + while (maildir[i-1] == '/') {
> + maildir[i-1] = '\0';
> + i--;
> + }
> +
> + /* Strip leading '/' */
> + while (maildir[0] == '/')
> + maildir++;
> +
> + /* Strip leading '.' */
> + while (maildir[0] == '.')
> + maildir++;
> +
> + /* Replace all remaining '.' with '/' */
> + for (i = 0; maildir[i]; i++) {
> + if (maildir[i] == '.')
> + maildir[i] = '/';
> + }
> +
> + /* If there's no string left, we're the "INBOX" */
> + if (maildir[0] == '\0')
> + maildir = talloc_strdup(local, "INBOX");
> +
> + _notmuch_message_add_term (message, "maildir", maildir);
> +
> talloc_free (local);
>
> return NOTMUCH_STATUS_SUCCESS;
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
More information about the notmuch
mailing list