On Tue, 12 Nov 2013, Peter Zijlstra <peterz@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@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@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@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch