[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