changeset: 6857:91b3449f426b
user:      David Champion <[email protected]>
date:      Wed Nov 16 16:05:02 2016 -0800
link:      http://dev.mutt.org/hg/mutt/rev/91b3449f426b

Adds the '@' pattern modifier to limit matches to known aliases.

Example: ~f joe matches messages from joe. @~f joe matches messages from
any joe who is defined as an alias.

Pushed by Kevin McCarthy with two minor cosmetic fixes.

diffs (122 lines):

diff -r 03aa03293c1d -r 91b3449f426b doc/manual.xml.head
--- a/doc/manual.xml.head       Wed Nov 16 15:43:50 2016 -0800
+++ b/doc/manual.xml.head       Wed Nov 16 16:05:02 2016 -0800
@@ -4359,6 +4359,29 @@
 <command>macro</command>'s commands into its history.
 </para>
 
+<para>
+You can restrict address pattern matching to aliases that you have
+defined with the "@" modifier.  This example matches messages whose
+recipients are all from Germany, and who are known to your alias list.
+</para>
+
+<para>
+<screen>
+^@~C \.de$
+</screen>
+</para>
+
+<para>
+To match any defined alias, use a regular expression that matches any
+string.  This example matches messages whose senders are known aliases.
+</para>
+
+<para>
+<screen>
+@~f .
+</screen>
+</para>
+
 </sect3>
 
 </sect2>
diff -r 03aa03293c1d -r 91b3449f426b mutt.h
--- a/mutt.h    Wed Nov 16 15:43:50 2016 -0800
+++ b/mutt.h    Wed Nov 16 16:05:02 2016 -0800
@@ -860,6 +860,7 @@
   unsigned int stringmatch : 1;
   unsigned int groupmatch : 1;
   unsigned int ign_case : 1;           /* ignore case for local stringmatch 
searches */
+  unsigned int isalias : 1;
   int min;
   int max;
   struct pattern_t *next;
diff -r 03aa03293c1d -r 91b3449f426b pattern.c
--- a/pattern.c Wed Nov 16 15:43:50 2016 -0800
+++ b/pattern.c Wed Nov 16 16:05:02 2016 -0800
@@ -783,6 +783,7 @@
   int alladdr = 0;
   int or = 0;
   int implicit = 1;    /* used to detect logical AND operator */
+  int isalias = 0;
   const struct pattern_flags *entry;
   char *p;
   char *buf;
@@ -805,6 +806,10 @@
        ps.dptr++;
        not = !not;
        break;
+      case '@':
+       ps.dptr++;
+       isalias = !isalias;
+       break;
       case '|':
        if (!or)
        {
@@ -830,6 +835,7 @@
        implicit = 0;
        not = 0;
        alladdr = 0;
+       isalias = 0;
        break;
       case '%':
       case '=':
@@ -859,8 +865,10 @@
          last = tmp;
          tmp->not ^= not;
          tmp->alladdr |= alladdr;
+         tmp->isalias |= isalias;
          not = 0;
          alladdr = 0;
+         isalias = 0;
          /* compile the sub-expression */
          buf = mutt_substrdup (ps.dptr + 1, p);
          if ((tmp2 = mutt_pattern_comp (buf, flags, err)) == NULL)
@@ -888,10 +896,12 @@
        tmp = new_pattern ();
        tmp->not = not;
        tmp->alladdr = alladdr;
+       tmp->isalias = isalias;
         tmp->stringmatch = (*ps.dptr == '=') ? 1 : 0;
         tmp->groupmatch  = (*ps.dptr == '%') ? 1 : 0;
        not = 0;
        alladdr = 0;
+       isalias = 0;
 
        if (last)
          last->next = tmp;
@@ -957,8 +967,10 @@
        last = tmp;
        tmp->not ^= not;
        tmp->alladdr |= alladdr;
+       tmp->isalias |= isalias;
        not = 0;
        alladdr = 0;
+       isalias = 0;
        ps.dptr = p + 1; /* restore location */
        break;
       default:
@@ -1010,8 +1022,10 @@
   {
     for (a = va_arg (ap, ADDRESS *) ; a ; a = a->next)
     {
-      if (pat->alladdr ^ ((a->mailbox && patmatch (pat, a->mailbox) == 0) ||
-          (match_personal && a->personal && patmatch (pat, a->personal) == 0)))
+      if (pat->alladdr ^
+          ((!pat->isalias || alias_reverse_lookup (a)) &&
+           ((a->mailbox && !patmatch (pat, a->mailbox)) ||
+           (match_personal && a->personal && !patmatch (pat, a->personal) ))))
       {
        va_end (ap);
        return (! pat->alladdr); /* Found match, or non-match if alladdr */

Reply via email to