[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mutt-dev
Subject:    Spamassassin: Sort -by-score feature for mutt.
From:       Rogier Wolff <mutt-list () harddisk-recovery ! nl>
Date:       2004-02-25 17:10:27
Message-ID: 20040225171027.GD6085 () bitwizard ! nl
[Download RAW message or body]

Hi,

My colleague Bob just wrote the following patch. It implements sorting
by spamassassin score. There are "convert-to-mutt-score" configuration
hacks on the internet, but those are an incomplete hack.

The patch was built for our 1.3.8 debian-stable mutt, but applies
pretty cleanly to a 1.5.x tree.

		Roger. 

-- 
+-- Rogier Wolff -- www.harddisk-recovery.nl -- 0800 220 20 20 --
| Files foetsie, bestanden kwijt, alle data weg?!
| Blijf kalm en neem contact op met Harddisk-recovery.nl!

["mutt-spamassassin.patch" (text/plain)]

diff -ur mutt-1.3.28-new/commands.c mutt-1.3.28/commands.c
--- mutt-1.3.28-new/commands.c	Wed Feb 25 15:06:13 2004
+++ mutt-1.3.28/commands.c	Wed Feb 25 15:06:35 2004
@@ -459,9 +459,9 @@
   int method = Sort; /* save the current method in case of abort */
 
   switch (mutt_multi_choice (reverse ?
-			     _("Rev-Sort (d)ate/(f)rm/(r)ecv/(s)ubj/t(o)/(t)hread/(u)nsort/si(z)e/s(c)ore?: ") :
-			     _("Sort (d)ate/(f)rm/(r)ecv/(s)ubj/t(o)/(t)hread/(u)nsort/si(z)e/s(c)ore?: "),
-			     _("dfrsotuzc")))
+			     _("Rev-Sort (d)ate/(f)rm/(r)ecv/(s)ubj/t(o)/(t)hread/(u)nsort/si(z)e/s(c)ore/s(p)am?: ") :
+			     _("Sort (d)ate/(f)rm/(r)ecv/(s)ubj/t(o)/(t)hread/(u)nsort/si(z)e/s(c)ore/s(p)am?: "),
+			     _("dfrsotuzcp")))
   {
   case -1: /* abort - don't resort */
     return -1;
@@ -500,6 +500,9 @@
   
   case 9: /* s(c)ore */ 
     Sort = SORT_SCORE;
+    break;
+  case 10: /* s(p)am */
+    Sort = SORT_SPAM;
     break;
   }
   if (reverse)
diff -ur mutt-1.3.28-new/init.h mutt-1.3.28/init.h
--- mutt-1.3.28-new/init.h	Wed Feb 25 15:06:15 2004
+++ mutt-1.3.28/init.h	Wed Feb 25 15:09:32 2004
@@ -2381,6 +2381,7 @@
   { "threads",		SORT_THREADS },
   { "to",		SORT_TO },
   { "score",		SORT_SCORE },
+  { "spam", 		SORT_SPAM },
   { NULL,		0 }
 };
 
diff -ur mutt-1.3.28-new/mutt.h mutt-1.3.28/mutt.h
--- mutt-1.3.28-new/mutt.h	Wed Feb 25 15:06:15 2004
+++ mutt-1.3.28/mutt.h	Wed Feb 25 15:06:35 2004
@@ -527,6 +524,8 @@
   LIST *references;		/* message references (in reverse order) */
   LIST *in_reply_to;		/* in-reply-to header content */
   LIST *userhdrs;		/* user defined headers */
+
+  int x_spam_hits;
 } ENVELOPE;
 
 typedef struct parameter
diff -ur mutt-1.3.28-new/parse.c mutt-1.3.28/parse.c
--- mutt-1.3.28-new/parse.c	Wed Feb 25 15:06:14 2004
+++ mutt-1.3.28/parse.c	Wed Feb 25 15:07:36 2004
@@ -1207,6 +1207,14 @@
       e->x_label = safe_strdup(p);
       matched = 1;
     }
+    else if (ascii_strcasecmp (line+1, "-Spam-Status") == 0)
+    {
+	    char *s = strstr(p, "hits=");
+	    if (s)
+		    e->x_spam_hits = 100 * strtod(s + 5, NULL);
+	    
+	    matched = 1;
+    }       
     
     default:
     break;
diff -ur mutt-1.3.28-new/sort.c mutt-1.3.28/sort.c
--- mutt-1.3.28-new/sort.c	Wed Feb 25 15:06:14 2004
+++ mutt-1.3.28/sort.c	Wed Feb 25 15:06:35 2004
@@ -37,6 +37,17 @@
 if (!code) \
   code = (*((HEADER **)a))->index - (*((HEADER **)b))->index;
 
+int compare_spam (const void *a, const void *b)
+{
+  HEADER **pa = (HEADER **) a;
+  HEADER **pb = (HEADER **) b;
+  
+  int result = (*pa)->env->x_spam_hits - (*pb)->env->x_spam_hits;
+  AUXSORT(result,a,b);
+  return (SORTCODE (result));
+}
+
+
 int compare_score (const void *a, const void *b)
 {
   HEADER **pa = (HEADER **) a;
@@ -168,6 +179,8 @@
       return (compare_to);
     case SORT_SCORE:
       return (compare_score);
+    case SORT_SPAM:
+      return (compare_spam);
     default:
       return (NULL);
   }
diff -ur mutt-1.3.28-new/sort.h mutt-1.3.28/sort.h
--- mutt-1.3.28-new/sort.h	Wed Feb 25 15:06:15 2004
+++ mutt-1.3.28/sort.h	Wed Feb 25 15:06:35 2004
@@ -29,6 +29,7 @@
 #define SORT_ADDRESS	11
 #define SORT_KEYID	12
 #define SORT_TRUST	13
+#define SORT_SPAM 	14
 #define SORT_MASK	0xf
 #define SORT_REVERSE	(1<<4)
 #define SORT_LAST	(1<<5)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic