Attached is a patch which implement an auto-subscribe feature. When you load a mailbox, Mutt will parse the List-Post header field and add it to the 'subscribe' list automatically, unless it matches something on the 'unlists' or 'unsubscribe' list.

me
diff -r 2cd62f40d840 hcache.c
--- a/hcache.c  Sun Apr 11 20:00:38 2010 -0700
+++ b/hcache.c  Mon Apr 12 14:16:21 2010 -0700
@@ -481,6 +481,9 @@
   restore_list(&e->references, d, off, 0);
   restore_list(&e->in_reply_to, d, off, 0);
   restore_list(&e->userhdrs, d, off, convert);
+
+  if (e->list_post)
+    mutt_auto_subscribe(e->list_post);
 }
 
 static int
diff -r 2cd62f40d840 init.c
--- a/init.c    Sun Apr 11 20:00:38 2010 -0700
+++ b/init.c    Mon Apr 12 14:16:21 2010 -0700
@@ -413,16 +413,10 @@
   if (!s || !*s)
     return 0;
 
-  if (!(rx = mutt_compile_regexp (s, flags)))
-  {
-    snprintf (err->data, err->dsize, "Bad regexp: %s\n", s);
-    return -1;
-  }
-
   /* check to make sure the item is not already on this list */
   for (last = *list; last; last = last->next)
   {
-    if (ascii_strcasecmp (rx->pattern, last->rx->pattern) == 0)
+    if (ascii_strcasecmp (s, last->rx->pattern) == 0)
     {
       /* already on the list, so just ignore it */
       last = NULL;
@@ -434,6 +428,13 @@
 
   if (!*list || last)
   {
+    /* delay compilation until after dupe check to improve performance. */
+    if (!(rx = mutt_compile_regexp (s, flags)))
+    {
+      snprintf (err->data, err->dsize, "Bad regexp: %s\n", s);
+      return -1;
+    }
+
     t = mutt_new_rx_list();
     t->rx = rx;
     if (last)
@@ -444,8 +445,6 @@
     else
       *list = last = t;
   }
-  else /* duplicate */
-    mutt_free_regexp (&rx);
 
   return 0;
 }
diff -r 2cd62f40d840 parse.c
--- a/parse.c   Sun Apr 11 20:00:38 2010 -0700
+++ b/parse.c   Mon Apr 12 14:16:21 2010 -0700
@@ -966,6 +966,40 @@
   cur->attach_valid = 0;
 }
 
+/* The presence of the List-Post header field indicates the user is
+ * subscribed to this list.  Unless the list is explicitly on the
+ * unlists or unsubscribe list or it matches the current subscribe
+ * list, automatically add it to the subscribed lists.
+ *
+ * The Subscribed list is checked first since users will often
+ * filter mail from a list into a separate folder, so we want to
+ * short-circuit the other checks as quickly as possible.
+ */
+void mutt_auto_subscribe(const char *mailto)
+{
+  ENVELOPE *lpenv = mutt_new_envelope(); /* parsed envelope from the List-Post 
mailto: URL */
+
+  if ((url_parse_mailto(lpenv, NULL, mailto) != -1) &&
+      lpenv->to && lpenv->to->mailbox &&
+      !mutt_match_rx_list(lpenv->to->mailbox, SubscribedLists) &&
+      !mutt_match_rx_list(lpenv->to->mailbox, UnMailLists) &&
+      !mutt_match_rx_list(lpenv->to->mailbox, UnSubscribedLists))
+  {
+    BUFFER err;
+    char errbuf[STRING];
+
+    memset(&err, 0, sizeof(err));
+    err.data = errbuf;
+    err.dsize = sizeof(errbuf);
+
+    /* mutt_add_to_rx_list() detects duplicates, so it is safe to
+     * try to add here without any checks. */
+    mutt_add_to_rx_list(&MailLists, lpenv->to->mailbox, REG_ICASE, &err);
+    mutt_add_to_rx_list(&SubscribedLists, lpenv->to->mailbox, REG_ICASE, &err);
+  }
+  mutt_free_envelope(&lpenv);
+}
+
 int mutt_parse_rfc822_line (ENVELOPE *e, HEADER *hdr, char *line, char *p, 
short user_hdrs, short weed,
                            short do_2047, LIST **lastp)
 {
@@ -1110,6 +1144,7 @@
          {
            FREE (&e->list_post);
            e->list_post = mutt_substrdup (beg, end);
+           mutt_auto_subscribe(e->list_post);
            break;
          }
        }
diff -r 2cd62f40d840 protos.h
--- a/protos.h  Sun Apr 11 20:00:38 2010 -0700
+++ b/protos.h  Mon Apr 12 14:16:21 2010 -0700
@@ -162,6 +162,7 @@
 void mutt_alias_menu (char *, size_t, ALIAS *);
 void mutt_allow_interrupt (int);
 void mutt_attach_init (BODY *);
+void mutt_auto_subscribe (const char *);
 void mutt_block_signals (void);
 void mutt_block_signals_system (void);
 int mutt_body_handler (BODY *, STATE *);
diff -r 2cd62f40d840 url.c
--- a/url.c     Sun Apr 11 20:00:38 2010 -0700
+++ b/url.c     Mon Apr 12 14:16:21 2010 -0700
@@ -303,6 +303,7 @@
       goto out;
     }
   }
+  rc = 0;
 
 out:
   FREE (&tmp);

Attachment: pgptSzuVFrVGF.pgp
Description: PGP signature



Reply via email to