aboutsummaryrefslogtreecommitdiffstats
path: root/mail/mutt/files
diff options
context:
space:
mode:
authorcrees <crees@FreeBSD.org>2012-07-22 17:15:04 +0800
committercrees <crees@FreeBSD.org>2012-07-22 17:15:04 +0800
commit684ed7d3237ce53b07278b691fb9f1bd419b4876 (patch)
tree48afad7ae2c1b5fd6c866fadb03127860561cb60 /mail/mutt/files
parent2606632901a94a288ceae0e73b855dc4f4e840c3 (diff)
downloadfreebsd-ports-gnome-684ed7d3237ce53b07278b691fb9f1bd419b4876.tar.gz
freebsd-ports-gnome-684ed7d3237ce53b07278b691fb9f1bd419b4876.tar.zst
freebsd-ports-gnome-684ed7d3237ce53b07278b691fb9f1bd419b4876.zip
Move mail/mutt to mail/mutt14
Move mail/mutt-lite to mail/mutt14-lite Move mail/mutt-devel to mail/mutt Moving mail/mutt-devel-lite to mail/mutt-lite will follow next to avoid breaking the cvs exporter PR: ports/169546 Suggested by: obrien Approved by: maintainer
Diffstat (limited to 'mail/mutt/files')
-rw-r--r--mail/mutt/files/extra-patch-aspell11
-rw-r--r--mail/mutt/files/extra-patch-doc-ref22
-rw-r--r--mail/mutt/files/extra-patch-doc-xml11
-rw-r--r--mail/mutt/files/extra-patch-greeting160
-rw-r--r--mail/mutt/files/extra-patch-ifdef79
-rw-r--r--mail/mutt/files/extra-patch-maildir-mtime52
-rw-r--r--mail/mutt/files/extra-patch-maildir-mtime-nntp44
-rw-r--r--mail/mutt/files/extra-patch-no-mbox-manpage29
-rw-r--r--mail/mutt/files/extra-patch-nodoc-contrib28
-rw-r--r--mail/mutt/files/extra-patch-parent-child-match169
-rw-r--r--mail/mutt/files/extra-patch-pgp-dw1039
-rw-r--r--mail/mutt/files/extra-patch-reverse_reply92
-rw-r--r--mail/mutt/files/extra-patch-sidebar1603
-rw-r--r--mail/mutt/files/extra-patch-sidebar-nntp1616
-rw-r--r--mail/mutt/files/extra-patch-signature-menu729
-rw-r--r--mail/mutt/files/extra-patch-smime-outlook11
-rw-r--r--mail/mutt/files/extra-patch-trash-purge403
-rw-r--r--mail/mutt/files/patch-0275
-rw-r--r--mail/mutt/files/patch-0313
-rw-r--r--mail/mutt/files/patch-0544
-rw-r--r--mail/mutt/files/patch-084
-rw-r--r--mail/mutt/files/patch-Makefile.am13
-rw-r--r--mail/mutt/files/patch-Makefile.am.doc11
-rw-r--r--mail/mutt/files/patch-aclocal.m411
-rw-r--r--mail/mutt/files/patch-bdb11
-rw-r--r--mail/mutt/files/patch-color-eol62
-rw-r--r--mail/mutt/files/patch-configure.ac9
-rw-r--r--mail/mutt/files/patch-configure.in14
-rw-r--r--mail/mutt/files/patch-contrib-Makefile.am11
-rw-r--r--mail/mutt/files/patch-contrib-Makefile.in11
-rw-r--r--mail/mutt/files/patch-crypt-gpgme.c10
-rw-r--r--mail/mutt/files/patch-date-conditional147
-rw-r--r--mail/mutt/files/patch-doc-manual.xml.head10
-rw-r--r--mail/mutt/files/patch-doc-mutt.man34
-rw-r--r--mail/mutt/files/patch-examples119
-rw-r--r--mail/mutt/files/patch-gnutls-CN-validation29
-rw-r--r--mail/mutt/files/patch-imap-message.c15
-rw-r--r--mail/mutt/files/patch-m4-gssapi.m433
-rw-r--r--mail/mutt/files/patch-mktemp30
-rw-r--r--mail/mutt/files/patch-nbsp22
-rw-r--r--mail/mutt/files/patch-pgp134
-rw-r--r--mail/mutt/files/patch-smime-self66
-rw-r--r--mail/mutt/files/patch-smime-sender54
-rw-r--r--mail/mutt/files/patch-threadcomplete80
-rw-r--r--mail/mutt/files/patch-z22
45 files changed, 6845 insertions, 347 deletions
diff --git a/mail/mutt/files/extra-patch-aspell b/mail/mutt/files/extra-patch-aspell
new file mode 100644
index 000000000000..05a3706764e5
--- /dev/null
+++ b/mail/mutt/files/extra-patch-aspell
@@ -0,0 +1,11 @@
+--- doc/Muttrc.head.orig Thu Jan 24 13:10:47 2002
++++ doc/Muttrc.head Tue Nov 9 08:53:14 2004
+@@ -19,6 +19,8 @@
+ macro index <f1> "!less @docdir@/manual.txt\n" "Show Mutt documentation"
+ macro pager <f1> "!less @docdir@/manual.txt\n" "Show Mutt documentation"
+
++set ispell="/usr/local/bin/aspell --mode=email check"
++
+ # If Mutt is unable to determine your site's domain name correctly, you can
+ # set the default here.
+ #
diff --git a/mail/mutt/files/extra-patch-doc-ref b/mail/mutt/files/extra-patch-doc-ref
index 99222e0bceb0..9679f4c276f1 100644
--- a/mail/mutt/files/extra-patch-doc-ref
+++ b/mail/mutt/files/extra-patch-doc-ref
@@ -1,12 +1,12 @@
---- doc/mutt.man.orig Mon Jul 13 12:50:38 1998
-+++ doc/mutt.man Thu Oct 1 22:15:40 1998
-@@ -20,7 +20,8 @@
- .SH DESCRIPTION
- Mutt is a small but very powerful text based program for reading electronic
- mail under unix operating systems, including support color terminals, MIME,
--and a threaded sorting mode.
-+and a threaded sorting mode. Details of how to use all of this is
+--- doc/mutt.man.orig 2009-02-06 13:52:38.000000000 +0100
++++ doc/mutt.man 2009-02-06 13:55:05.000000000 +0100
+@@ -69,7 +69,8 @@
+ .PP
+ Mutt is a small but very powerful text based program for reading and sending electronic
+ mail under unix operating systems, including support for color terminals, MIME,
+-OpenPGP, and a threaded sorting mode.
++OpenPGP, and a threaded sorting mode. Details of how to use all of this is
+available in \fI${DOCSDIR}\fP.
- .SH OPTIONS
- .IP "-a \fIfile\fP"
- Attach a file to your message using MIME.
+ .PP
+ .I Note:
+ .IR
diff --git a/mail/mutt/files/extra-patch-doc-xml b/mail/mutt/files/extra-patch-doc-xml
new file mode 100644
index 000000000000..9e652c0a56f9
--- /dev/null
+++ b/mail/mutt/files/extra-patch-doc-xml
@@ -0,0 +1,11 @@
+--- doc/Makefile.am.orig 2010-09-17 16:23:30.000000000 +0200
++++ doc/Makefile.am 2010-09-17 16:25:01.000000000 +0200
+@@ -47,7 +47,7 @@
+
+ all: makedoc-all
+
+-makedoc-all: mutt.1 smime_keys.1 muttrc.man
++makedoc-all: mutt.1 smime_keys.1 muttrc.man manual.html stamp-doc-chunked manual.txt
+
+ install-data-local: makedoc-all instdoc
+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(mandir)/man1
diff --git a/mail/mutt/files/extra-patch-greeting b/mail/mutt/files/extra-patch-greeting
new file mode 100644
index 000000000000..a1f4bc113156
--- /dev/null
+++ b/mail/mutt/files/extra-patch-greeting
@@ -0,0 +1,160 @@
+diff -urN mutt-1.5.19/globals.h mutt-1.5.19-vc/globals.h
+--- mutt-1.5.19/globals.h 2009-01-04 01:27:10.000000000 +0200
++++ mutt-1.5.19-vc/globals.h 2009-02-09 19:30:31.000000000 +0200
+@@ -52,6 +52,7 @@
+ WHERE char *FolderFormat;
+ WHERE char *ForwFmt;
+ WHERE char *Fqdn;
++WHERE char *Greeting;
+ WHERE char *HdrFmt;
+ WHERE char *HistFile;
+ WHERE char *Homedir;
+diff -urN mutt-1.5.19/hdrline.c mutt-1.5.19-vc/hdrline.c
+--- mutt-1.5.19/hdrline.c 2009-01-05 21:20:53.000000000 +0200
++++ mutt-1.5.19-vc/hdrline.c 2009-02-09 19:30:31.000000000 +0200
+@@ -741,3 +741,62 @@
+ {
+ mutt_FormatString (dst, dstlen, 0, s, hdr_format_str, (unsigned long) hfi, flags);
+ }
++
++/* %n = recipient name
++ * %u = user (login) name of recipient
++ * %v = first name of recipient */
++const char *
++greeting_string (char *dest,
++ size_t destlen,
++ size_t col,
++ char op,
++ const char *src,
++ const char *prefix,
++ const char *ifstring,
++ const char *elsestring,
++ unsigned long data,
++ format_flag flags)
++{
++ HEADER *hdr = (HEADER *)data;
++ char *p, buf2[SHORT_STRING];
++
++ dest[0] = '\0';
++ switch (op)
++ {
++ case 'n':
++ mutt_format_s (dest, destlen, prefix, mutt_get_name (hdr->env->to));
++ break;
++
++ case 'u':
++ if (hdr->env->to)
++ {
++ strfcpy (buf2, mutt_addr_for_display (hdr->env->to), sizeof (buf2));
++ if ((p = strpbrk (buf2, "%@")))
++ *p = '\0';
++ }
++ else
++ buf2[0] = '\0';
++ mutt_format_s (dest, destlen, prefix, buf2);
++ break;
++
++ case 'v':
++ if (hdr->env->to)
++ mutt_format_s (buf2, sizeof (buf2), prefix, mutt_get_name (hdr->env->to));
++ else if (hdr->env->cc)
++ mutt_format_s (buf2, sizeof (buf2), prefix, mutt_get_name (hdr->env->cc));
++ else
++ *buf2 = '\0';
++ if ((p = strpbrk (buf2, " %@")))
++ *p = '\0';
++ mutt_format_s (dest, destlen, prefix, buf2);
++ break;
++
++ default:
++ snprintf (dest, destlen, "%%%s%c", prefix, op);
++ break;
++ }
++ if (flags & M_FORMAT_OPTIONAL)
++ mutt_FormatString (dest, destlen, col, elsestring, greeting_string, data, flags);
++
++ return(src);
++}
+diff -urN mutt-1.5.19/init.h mutt-1.5.19-vc/init.h
+--- mutt-1.5.19/init.h 2009-01-05 21:20:53.000000000 +0200
++++ mutt-1.5.19-vc/init.h 2009-02-09 19:30:31.000000000 +0200
+@@ -745,6 +745,22 @@
+ ** .pp
+ ** This setting defaults to the contents of the environment variable \fC$$$EMAIL\fP.
+ */
++ { "greeting", DT_STR, R_NONE, UL &Greeting, UL "" },
++ /*
++ ** .pp
++ ** When set, this is the string that will precede every message as a
++ ** greeting phrase to the recipients.
++ ** .pp
++ ** ``Format strings'' are similar to the strings used in the ``C''
++ ** function printf to format output (see the man page for more detail).
++ ** The following sequences are defined in Mutt:
++ ** .pp
++ ** .dl
++ ** .dt %n .dd recipient name
++ ** .dt %u .dd user (login) name of recipient
++ ** .dt %v .dd first name of recipient
++ ** .de
++ */
+ { "gecos_mask", DT_RX, R_NONE, UL &GecosMask, UL "^[^,]*" },
+ /*
+ ** .pp
+diff -urN mutt-1.5.19/PATCHES mutt-1.5.19-vc/PATCHES
+--- mutt-1.5.19/PATCHES 2008-03-19 22:07:06.000000000 +0200
++++ mutt-1.5.19-vc/PATCHES 2009-02-09 19:30:31.000000000 +0200
+@@ -0,0 +1 @@
++vc.greeting
+diff -urN mutt-1.5.19/protos.h mutt-1.5.19-vc/protos.h
+--- mutt-1.5.19/protos.h 2009-01-05 21:20:53.000000000 +0200
++++ mutt-1.5.19-vc/protos.h 2009-02-09 19:32:15.000000000 +0200
+@@ -526,6 +526,9 @@
+ void ci_bounce_message (HEADER *, int *);
+ int ci_send_message (int, HEADER *, char *, CONTEXT *, HEADER *);
+
++const char *greeting_string (char *, size_t, size_t, char, const char *, const char *,
++ const char *, const char *, unsigned long, format_flag);
++
+ /* prototypes for compatibility functions */
+
+ #ifndef HAVE_SETENV
+diff -urN mutt-1.5.19/send.c mutt-1.5.19-vc/send.c
+--- mutt-1.5.19/send.c.orig 2010-09-17 16:49:09.000000000 +0200
++++ mutt-1.5.19-vc/send.c 2010-09-17 16:53:15.000000000 +0200
+@@ -469,6 +469,18 @@
+ }
+ }
+
++void mutt_make_greeting (HEADER *hdr, FILE *out, int flags)
++{
++ char buffer[STRING];
++ if (Greeting)
++ {
++ mutt_FormatString(buffer, sizeof(buffer), 0, Greeting, greeting_string,
++ (unsigned long) hdr, flags);
++ fputs(buffer, out);
++ fputc ('\n', out);
++ }
++}
++
+ void mutt_make_post_indent (CONTEXT *ctx, HEADER *cur, FILE *out)
+ {
+ char buffer[STRING];
+@@ -1003,7 +1015,6 @@
+ }
+ }
+
+-
+ /* look through the recipients of the message we are replying to, and if
+ we find an address that matches $alternates, we use that as the default
+ from field */
+@@ -1439,6 +1450,8 @@
+ if (option (OPTHDRS))
+ process_user_header (msg->env);
+
++ mutt_make_greeting(msg, tempfp, flags);
++
+ if (flags & SENDBATCH)
+ mutt_copy_stream (stdin, tempfp);
+
diff --git a/mail/mutt/files/extra-patch-ifdef b/mail/mutt/files/extra-patch-ifdef
new file mode 100644
index 000000000000..03f18dee9626
--- /dev/null
+++ b/mail/mutt/files/extra-patch-ifdef
@@ -0,0 +1,79 @@
+--- mutt-1.5.4.orig/init.c 2003-03-04 08:49:48.000000000 +0100
++++ mutt-1.5.4/init.c 2003-07-22 20:14:47.000000000 +0200
+@@ -349,6 +349,52 @@ static void remove_from_list (LIST **l,
+ }
+ }
+
++static int parse_ifdef (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err)
++{
++ int i, j, res = 0;
++ BUFFER token;
++
++ memset (&token, 0, sizeof (token));
++ mutt_extract_token (tmp, s, 0);
++
++ /* is the item defined as a variable or a function? */
++ if (!(res = (mutt_option_index (tmp->data) != -1)))
++ for (i = 0; !res && i < MENU_MAX; i++)
++ {
++ struct binding_t *b = km_get_table (Menus[i].value);
++
++ if (!b)
++ continue;
++
++ for (j = 0; b[j].name; j++)
++ if (!ascii_strncasecmp (tmp->data, b[j].name, mutt_strlen (tmp->data))
++ && (mutt_strlen (b[j].name) == mutt_strlen (tmp->data)))
++ {
++ res = 1;
++ break;
++ }
++ }
++
++ if (!MoreArgs (s))
++ {
++ snprintf (err->data, err->dsize, _("ifdef: too few arguments"));
++ return (-1);
++ }
++ mutt_extract_token (tmp, s, M_TOKEN_SPACE);
++
++ if (res)
++ {
++ if (mutt_parse_rc_line (tmp->data, &token, err) == -1)
++ {
++ mutt_error ("Erreur: %s", err->data);
++ FREE (&token.data);
++ return (-1);
++ }
++ FREE (&token.data);
++ }
++ return 0;
++}
++
+ static int parse_unignore (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
+ {
+ do
+diff -pruN mutt-1.5.4.orig/init.h mutt-1.5.4/init.h
+--- mutt-1.5.4.orig/init.h.orig 2009-06-22 15:48:16.000000000 +0200
++++ mutt-1.5.4/init.h 2009-06-22 15:49:28.000000000 +0200
+@@ -3658,6 +3658,7 @@
+ static int parse_unlists (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+ static int parse_alias (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+ static int parse_unalias (BUFFER *, BUFFER *, unsigned long, BUFFER *);
++static int parse_ifdef (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+ static int parse_ignore (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+ static int parse_unignore (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+ static int parse_source (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+@@ -3715,6 +3716,7 @@
+ { "hdr_order", parse_list, UL &HeaderOrderList },
+ #ifdef HAVE_ICONV
+ { "iconv-hook", mutt_parse_hook, M_ICONVHOOK },
++ { "ifdef", parse_ifdef, 0 },
+ #endif
+ { "ignore", parse_ignore, 0 },
+ { "lists", parse_lists, 0 },
+diff -pruN mutt-1.5.4.orig/PATCHES mutt-1.5.4/PATCHES
+--- mutt-1.5.4.orig/PATCHES 2003-03-19 22:33:37.000000000 +0100
++++ mutt-1.5.4/PATCHES 2003-07-22 20:14:47.000000000 +0200
+@@ -0,0 +1 @@
++patch-1.5.4.cd.ifdef.1
diff --git a/mail/mutt/files/extra-patch-maildir-mtime b/mail/mutt/files/extra-patch-maildir-mtime
new file mode 100644
index 000000000000..b5c27bc30861
--- /dev/null
+++ b/mail/mutt/files/extra-patch-maildir-mtime
@@ -0,0 +1,52 @@
+--- PATCHES Dec 2002 17:44:54 -0000 3.6
++++ PATCHES Feb 2004 13:19:42 -0000
+@@ -0,0 +1 @@
++patch-1.5.7.ust.maildir-mtime.2
+--- browser.c.orig Wed Jan 26 13:41:04 2005
++++ browser.c Wed Feb 9 09:20:14 2005
+@@ -27,6 +27,7 @@
+ #ifdef USE_IMAP
+ #include "imap.h"
+ #endif
++#include "mx.h"
+
+ #include <stdlib.h>
+ #include <dirent.h>
+@@ -346,6 +347,21 @@
+ menu->data = state->entry;
+ }
+
++static void check_maildir_times (BUFFY *buf, struct stat *st)
++{
++ char buffer[_POSIX_PATH_MAX + SHORT_STRING];
++ struct stat s;
++
++ if(!buf || buf->magic != M_MAILDIR)
++ return;
++
++ snprintf (buffer, sizeof (buffer), "%s/tmp", buf->path);
++ if (lstat (buffer, &s) != 0)
++ return;
++
++ st->st_mtime = s.st_mtime;
++}
++
+ static int examine_directory (MUTTMENU *menu, struct browser_state *state,
+ char *d, const char *prefix)
+ {
+@@ -409,6 +425,7 @@
+ tmp = Incoming;
+ while (tmp && mutt_strcmp (buffer, tmp->path))
+ tmp = tmp->next;
++ check_maildir_times (tmp, &s);
+ add_folder (menu, state, de->d_name, &s, (tmp) ? tmp->new : 0);
+ }
+ closedir (dp);
+@@ -454,6 +471,7 @@
+ strfcpy (buffer, NONULL(tmp->path), sizeof (buffer));
+ mutt_pretty_mailbox (buffer);
+
++ check_maildir_times (tmp, &s);
+ add_folder (menu, state, buffer, &s, tmp->new);
+ }
+ while ((tmp = tmp->next));
diff --git a/mail/mutt/files/extra-patch-maildir-mtime-nntp b/mail/mutt/files/extra-patch-maildir-mtime-nntp
new file mode 100644
index 000000000000..bc8f7fb79b31
--- /dev/null
+++ b/mail/mutt/files/extra-patch-maildir-mtime-nntp
@@ -0,0 +1,44 @@
+--- PATCHES Dec 2002 17:44:54 -0000 3.6
++++ PATCHES Feb 2004 13:19:42 -0000
+@@ -0,0 +1 @@
++patch-1.5.7.ust.maildir-mtime.2
+--- browser.c.orig Tue Feb 8 10:29:57 2005
++++ browser.c Tue Feb 8 10:29:58 2005
+@@ -31,4 +31,5 @@
+ #include "nntp.h"
+ #endif
++#include "mx.h"
+
+ #include <stdlib.h>
+@@ -473,4 +474,19 @@
+ }
+
++static void check_maildir_times (BUFFY *buf, struct stat *st)
++{
++ char buffer[_POSIX_PATH_MAX + SHORT_STRING];
++ struct stat s;
++
++ if(!buf || buf->magic != M_MAILDIR)
++ return;
++
++ snprintf (buffer, sizeof (buffer), "%s/tmp", buf->path);
++ if (lstat (buffer, &s) != 0)
++ return;
++
++ st->st_mtime = s.st_mtime;
++}
++
+ /* get list of all files/newsgroups with mask */
+ static int examine_directory (MUTTMENU *menu, struct browser_state *state,
+@@ -562,4 +578,5 @@
+ while (tmp && mutt_strcmp (buffer, tmp->path))
+ tmp = tmp->next;
++ check_maildir_times (tmp, &s);
+ add_folder (menu, state, de->d_name, &s, NULL, (tmp) ? tmp->new : 0);
+ }
+@@ -637,4 +654,5 @@
+ mutt_pretty_mailbox (buffer);
+
++ check_maildir_times (tmp, &s);
+ add_folder (menu, state, buffer, &s, NULL, tmp->new);
+ }
diff --git a/mail/mutt/files/extra-patch-no-mbox-manpage b/mail/mutt/files/extra-patch-no-mbox-manpage
new file mode 100644
index 000000000000..02f79155dd30
--- /dev/null
+++ b/mail/mutt/files/extra-patch-no-mbox-manpage
@@ -0,0 +1,29 @@
+--- doc/Makefile.am.orig 2008-05-30 08:00:04.000000000 +0100
++++ doc/Makefile.am 2008-09-19 18:55:55.000000000 +0100
+@@ -18,8 +18,6 @@
+ gen-map-doc \
+ muttrc.man.head \
+ muttrc.man.tail \
+- mbox.man \
+- mmdf.man \
+ manual.xml.head \
+ manual.xml.tail \
+ instdoc.sh.in \
+@@ -57,8 +55,6 @@
+ test x@DOTLOCK_TARGET@ = x || ./instdoc $(srcdir)/dotlock.man \
+ $(DESTDIR)$(mandir)/man1/mutt_dotlock.1
+ ./instdoc muttrc.man $(DESTDIR)$(mandir)/man5/muttrc.5
+- ./instdoc $(srcdir)/mbox.man $(DESTDIR)$(mandir)/man5/mbox.5
+- ./instdoc $(srcdir)/mmdf.man $(DESTDIR)$(mandir)/man5/mmdf.5
+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(docdir)
+ for f in $(topsrcdir_DOCFILES) ; do \
+ $(INSTALL) -m 644 $(top_srcdir)/$$f $(DESTDIR)$(docdir) ; \
+@@ -83,7 +79,7 @@
+ for f in mutt.1 mutt_dotlock.1 flea.1 muttbug.1 ; do \
+ rm -f $(DESTDIR)$(mandir)/man1/$$f ; \
+ done
+- for f in muttrc.5 mbox.5 mmdf.5 ; do \
++ for f in muttrc.5 ; do \
+ rm -f $(DESTDIR)$(mandir)/man5/$$f ; \
+ done
+ for f in $(srcdir_DOCFILES) $(topsrcdir_DOCFILES) $(HTML_DOCFILES) ; \
diff --git a/mail/mutt/files/extra-patch-nodoc-contrib b/mail/mutt/files/extra-patch-nodoc-contrib
new file mode 100644
index 000000000000..3a079bb2cdeb
--- /dev/null
+++ b/mail/mutt/files/extra-patch-nodoc-contrib
@@ -0,0 +1,28 @@
+--- Makefile.am.orig Fri Feb 11 14:54:08 2005
++++ Makefile.am Fri Feb 11 14:55:33 2005
+@@ -10,7 +10,7 @@
+ IMAP_INCLUDES = -I$(top_srcdir)/imap
+ endif
+
+-SUBDIRS = m4 po intl contrib $(IMAP_SUBDIR) . doc
++SUBDIRS = m4 po intl $(IMAP_SUBDIR) . doc
+
+ bin_SCRIPTS = muttbug flea @SMIMEAUX_TARGET@
+
+--- doc/Makefile.am.orig 2008-05-19 19:43:38.000000000 +0200
++++ doc/Makefile.am 2008-05-19 19:45:35.000000000 +0200
+@@ -60,14 +60,6 @@
+ ./instdoc muttrc.man $(DESTDIR)$(mandir)/man5/muttrc.5
+ ./instdoc $(srcdir)/mbox.man $(DESTDIR)$(mandir)/man5/mbox.5
+ ./instdoc $(srcdir)/mmdf.man $(DESTDIR)$(mandir)/man5/mmdf.5
+- $(top_srcdir)/mkinstalldirs $(DESTDIR)$(docdir)
+- for f in $(topsrcdir_DOCFILES) ; do \
+- $(INSTALL) -m 644 $(top_srcdir)/$$f $(DESTDIR)$(docdir) ; \
+- done
+- for f in $(srcdir_DOCFILES) ; do \
+- $(INSTALL) -m 644 $(srcdir)/$$f $(DESTDIR)$(docdir) ; \
+- done
+- -$(INSTALL) -m 644 manual.txt $(DESTDIR)$(docdir)
+ $(INSTALL) -m 644 Muttrc $(DESTDIR)$(sysconfdir)/Muttrc.dist
+ -if [ -f $(DESTDIR)$(pkgdatadir)/Muttrc ] ; then \
+ mv $(DESTDIR)$(pkgdatadir)/Muttrc* $(DESTDIR)$(sysconfdir) ; \
diff --git a/mail/mutt/files/extra-patch-parent-child-match b/mail/mutt/files/extra-patch-parent-child-match
new file mode 100644
index 000000000000..f9e95e46742a
--- /dev/null
+++ b/mail/mutt/files/extra-patch-parent-child-match
@@ -0,0 +1,169 @@
+--- mutt-1.5.20/doc/manual.xml.head 2009-05-30 19:20:08.000000000 +0200
++++ mutt-1.5.20-parentchildmatch/doc/manual.xml.head 2009-07-18 01:09:23.000000000 +0200
+@@ -3947,6 +3947,22 @@ With the <command>reset</command> comman
+ which allows you to reset all variables to their system defaults.
+ </para>
+
++<para>
++<emphasis role="bold">Parent and child match</emphasis>.
++You can tell mutt that the following pattern has to be matched against
++the parent message with &lt; or one of its childs with &gt;.
++This example matches all mails which have at least an unread duplicate
++message:
++</para>
++
++<para>
++
++<screen>
++>(~= ~N)
++</screen>
++
++</para>
++
+ </sect2>
+
+ <sect2 id="set-myvar">
+diff -urNp mutt-1.5.20/mutt.h mutt-1.5.20-parentchildmatch/mutt.h
+--- mutt-1.5.20/mutt.h 2009-06-13 00:15:42.000000000 +0200
++++ mutt-1.5.20-parentchildmatch/mutt.h 2009-07-18 01:14:21.000000000 +0200
+@@ -819,6 +819,8 @@ typedef struct pattern_t
+ unsigned int alladdr : 1;
+ unsigned int stringmatch : 1;
+ unsigned int groupmatch : 1;
++ unsigned int parentmatch : 1;
++ unsigned int childsmatch : 1;
+ unsigned int ign_case : 1; /* ignore case for local stringmatch searches */
+ int min;
+ int max;
+diff -urNp mutt-1.5.20/pattern.c mutt-1.5.20-parentchildmatch/pattern.c
+--- mutt-1.5.20/pattern.c 2009-06-03 22:48:31.000000000 +0200
++++ mutt-1.5.20-parentchildmatch/pattern.c 2009-07-18 01:09:23.000000000 +0200
+@@ -45,6 +45,7 @@ static int eat_regexp (pattern_t *pat, B
+ static int eat_date (pattern_t *pat, BUFFER *, BUFFER *);
+ static int eat_range (pattern_t *pat, BUFFER *, BUFFER *);
+ static int patmatch (const pattern_t *pat, const char *buf);
++static int pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h);
+
+ static struct pattern_flags
+ {
+@@ -769,6 +770,8 @@ pattern_t *mutt_pattern_comp (/* const *
+ pattern_t *last = NULL;
+ int not = 0;
+ int alladdr = 0;
++ int parentmatch = 0;
++ int childsmatch = 0;
+ int or = 0;
+ int implicit = 1; /* used to detect logical AND operator */
+ struct pattern_flags *entry;
+@@ -793,6 +796,24 @@ pattern_t *mutt_pattern_comp (/* const *
+ ps.dptr++;
+ not = !not;
+ break;
++ case '<':
++ ps.dptr++;
++ if (childsmatch) {
++ snprintf (err->data, err->dsize, _("cannot use both < and > as a pattern modifier"));
++ mutt_pattern_free (&curlist);
++ return NULL;
++ }
++ parentmatch = 1;
++ break;
++ case '>':
++ ps.dptr++;
++ if (parentmatch) {
++ snprintf (err->data, err->dsize, _("cannot use both < and > as a pattern modifier"));
++ mutt_pattern_free (&curlist);
++ return NULL;
++ }
++ childsmatch = 1;
++ break;
+ case '|':
+ if (!or)
+ {
+@@ -818,6 +839,8 @@ pattern_t *mutt_pattern_comp (/* const *
+ implicit = 0;
+ not = 0;
+ alladdr = 0;
++ parentmatch = 0;
++ childsmatch = 0;
+ break;
+ case '%':
+ case '=':
+@@ -841,8 +864,12 @@ pattern_t *mutt_pattern_comp (/* const *
+ last = tmp;
+ tmp->not ^= not;
+ tmp->alladdr |= alladdr;
++ tmp->parentmatch |= parentmatch;
++ tmp->childsmatch |= childsmatch;
+ not = 0;
+ alladdr = 0;
++ parentmatch = 0;
++ childsmatch = 0;
+ /* compile the sub-expression */
+ buf = mutt_substrdup (ps.dptr + 1, p);
+ if ((tmp2 = mutt_pattern_comp (buf, flags, err)) == NULL)
+@@ -870,10 +897,14 @@ pattern_t *mutt_pattern_comp (/* const *
+ tmp = new_pattern ();
+ tmp->not = not;
+ tmp->alladdr = alladdr;
++ tmp->parentmatch = parentmatch;
++ tmp->childsmatch = childsmatch;
+ tmp->stringmatch = (*ps.dptr == '=') ? 1 : 0;
+ tmp->groupmatch = (*ps.dptr == '%') ? 1 : 0;
+ not = 0;
+ alladdr = 0;
++ parentmatch = 0;
++ childsmatch = 0;
+
+ if (last)
+ last->next = tmp;
+@@ -939,8 +970,12 @@ pattern_t *mutt_pattern_comp (/* const *
+ last = tmp;
+ tmp->not ^= not;
+ tmp->alladdr |= alladdr;
++ tmp->parentmatch |= parentmatch;
++ tmp->childsmatch |= childsmatch;
+ not = 0;
+ alladdr = 0;
++ parentmatch = 0;
++ childsmatch = 0;
+ ps.dptr = p + 1; /* restore location */
+ break;
+ default:
+@@ -1081,6 +1116,36 @@ static int match_threadcomplete(struct p
+ int
+ mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h)
+ {
++ THREAD *t;
++
++ if (pat->parentmatch) {
++ if (h->thread && h->thread->parent && h->thread->parent->message)
++ return pattern_exec (pat, flags, ctx, h->thread->parent->message);
++ else
++ return pat->not;
++ }
++ if (pat->childsmatch) {
++ if (!h->thread)
++ return pat->not;
++ if (!h->thread->child)
++ return pat->not;
++ t = h->thread->child;
++ while (t->prev)
++ t = t->prev;
++ for (; t; t = t->next) {
++ if (!t->message)
++ continue;
++ if (pattern_exec (pat, flags, ctx, t->message))
++ return !pat->not;
++ }
++ return pat->not;
++ }
++ return pattern_exec (pat, flags, ctx, h);
++}
++
++static int
++pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h)
++{
+ switch (pat->op)
+ {
+ case M_AND:
diff --git a/mail/mutt/files/extra-patch-pgp-dw b/mail/mutt/files/extra-patch-pgp-dw
new file mode 100644
index 000000000000..e75bc51e2403
--- /dev/null
+++ b/mail/mutt/files/extra-patch-pgp-dw
@@ -0,0 +1,1039 @@
+--- PATCHES Dec 2002 17:44:54 -0000 3.6
++++ PATCHES Feb 2004 06:07:13 -0000
+@@ -0,0 +1,4 @@
++patch-1.5.6.dw.multiple-crypt-hook.2
++patch-1.5.6.dw.confirm-crypt-hook.1
++patch-1.5.6.dw.crypt-autoselectkey.1
++patch-1.5.6.dw.pgp-menu-traditional.2
+--- compose.c Oct 2003 20:34:59 -0000 3.14
++++ compose.c Feb 2004 06:07:13 -0000
+@@ -133,2 +133,9 @@ static void redraw_crypt_lines (HEADER *
+ addstr (_("Clear"));
++
++ if ((WithCrypto & APPLICATION_PGP))
++ if ((msg->security & (ENCRYPT | SIGN)))
++ if ((msg->security & INLINE))
++ addstr (_(" (inline)"));
++ else
++ addstr (_(" (PGP/MIME)"));
+ clrtoeol ();
+@@ -158,2 +165,3 @@ static int pgp_send_menu (HEADER *msg, i
+ {
++ int use_autoinline = 0;
+ pgp_key_t p;
+@@ -164,7 +172,10 @@ static int pgp_send_menu (HEADER *msg, i
+
+- switch (mutt_multi_choice (_("PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "),
+- N_("esabf")))
++ if (!(msg->security & (SIGN | ENCRYPT)))
++ use_autoinline = 1;
++
++ switch (mutt_multi_choice (_("PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "),
++ N_("esabif")))
+ {
+ case 1: /* (e)ncrypt */
+- msg->security |= ENCRYPT;
++ msg->security ^= ENCRYPT;
+ break;
+@@ -172,3 +183,3 @@ static int pgp_send_menu (HEADER *msg, i
+ case 2: /* (s)ign */
+- msg->security |= SIGN;
++ msg->security ^= SIGN;
+ break;
+@@ -199,6 +210,16 @@ static int pgp_send_menu (HEADER *msg, i
+ case 4: /* (b)oth */
+- msg->security = ENCRYPT | SIGN;
++ if ((msg->security & (ENCRYPT | SIGN)) == (ENCRYPT | SIGN))
++ msg->security = 0;
++ else
++ msg->security |= (ENCRYPT | SIGN);
+ break;
+
+- case 5: /* (f)orget it */
++ case 5: /* (i)nline */
++ if ((msg->security & (ENCRYPT | SIGN)))
++ msg->security ^= INLINE;
++ else
++ msg->security &= ~INLINE;
++ break;
++
++ case 6: /* (f)orget it */
+ msg->security = 0;
+@@ -207,6 +228,16 @@ static int pgp_send_menu (HEADER *msg, i
+
+- if (msg->security && msg->security != APPLICATION_PGP)
+- msg->security |= APPLICATION_PGP;
+- else
+- msg->security = 0;
++ if (msg->security)
++ {
++ if (!(msg->security & (ENCRYPT | SIGN)))
++ {
++ msg->security = 0;
++ }
++ else
++ {
++ msg->security |= APPLICATION_PGP;
++
++ if (use_autoinline && option (OPTPGPAUTOINLINE))
++ msg->security |= INLINE;
++ }
++ }
+
+--- crypt.c Jan 2004 19:59:38 -0000 3.22
++++ crypt.c Feb 2004 06:07:13 -0000
+@@ -161,3 +161,3 @@ int crypt_valid_passphrase(int flags)
+
+-int mutt_protect (HEADER *msg, HEADER *cur, char *keylist)
++int mutt_protect (HEADER *msg, char *keylist)
+ {
+@@ -166,3 +166,2 @@ int mutt_protect (HEADER *msg, HEADER *c
+ BODY *tmp_pgp_pbody = NULL;
+- int traditional = 0;
+ int flags = (WithCrypto & APPLICATION_PGP)? msg->security: 0;
+@@ -176,29 +175,9 @@ int mutt_protect (HEADER *msg, HEADER *c
+
+- if ((WithCrypto & APPLICATION_PGP) && (msg->security & APPLICATION_PGP))
++ if ((WithCrypto & APPLICATION_PGP) && ((msg->security & PGPINLINE) == PGPINLINE))
+ {
+- if ((msg->content->type == TYPETEXT) &&
+- !ascii_strcasecmp (msg->content->subtype, "plain"))
+- {
+- if (cur && cur->security && option (OPTPGPAUTOTRAD)
+- && (option (OPTCRYPTREPLYENCRYPT)
+- || option (OPTCRYPTREPLYSIGN)
+- || option (OPTCRYPTREPLYSIGNENCRYPTED)))
+- {
+- if(mutt_is_application_pgp(cur->content))
+- traditional = 1;
+- }
+- else
+- {
+- if ((i = query_quadoption (OPT_PGPTRADITIONAL, _("Create a traditional (inline) PGP message?"))) == -1)
+- return -1;
+- else if (i == M_YES)
+- traditional = 1;
+- }
+- }
+- if (traditional)
++ /* they really want to send it inline... go for it */
++ if (!isendwin ()) mutt_endwin _("Invoking PGP...");
++ pbody = crypt_pgp_traditional_encryptsign (msg->content, flags, keylist);
++ if (pbody)
+ {
+- if (!isendwin ()) mutt_endwin _("Invoking PGP...");
+- if (!(pbody = crypt_pgp_traditional_encryptsign (msg->content, flags, keylist)))
+- return -1;
+-
+ msg->content = pbody;
+@@ -206,2 +185,8 @@ int mutt_protect (HEADER *msg, HEADER *c
+ }
++
++ /* otherwise inline won't work...ask for revert */
++ if ((i = query_quadoption (OPT_PGPMIMEASK, _("Message can't be sent inline. Revert to using PGP/MIME?"))) != M_YES)
++ return -1;
++
++ /* go ahead with PGP/MIME */
+ }
+@@ -393,2 +378,5 @@ int mutt_is_application_pgp (BODY *m)
+ }
++ if (t)
++ t |= PGPINLINE;
++
+ return t;
+--- hook.c Jan 2004 09:52:55 -0000 3.8
++++ hook.c Feb 2004 06:07:13 -0000
+@@ -119,3 +119,7 @@ int mutt_parse_hook (BUFFER *buf, BUFFER
+ {
++#ifdef M_CRYPTHOOK
++ if (data & (M_FOLDERHOOK | M_SENDHOOK | M_MESSAGEHOOK | M_ACCOUNTHOOK | M_REPLYHOOK | M_CRYPTHOOK))
++#else
+ if (data & (M_FOLDERHOOK | M_SENDHOOK | M_MESSAGEHOOK | M_ACCOUNTHOOK | M_REPLYHOOK))
++#endif
+ {
+@@ -445,5 +449,21 @@ char *mutt_iconv_hook (const char *chs)
+
+-char *mutt_crypt_hook (ADDRESS *adr)
++LIST *mutt_crypt_hook (ADDRESS *adr)
+ {
+- return _mutt_string_hook (adr->mailbox, M_CRYPTHOOK);
++ HOOK *hook;
++ LIST *key_list = NULL;
++
++ if (!adr && !adr->mailbox)
++ return (NULL);
++
++ for (hook = Hooks; hook; hook = hook->next)
++ {
++ if (!hook->command)
++ continue;
++ if (!(hook->type & M_CRYPTHOOK))
++ continue;
++
++ if ((regexec (hook->rx.rx, adr->mailbox, 0, NULL, 0) == 0) ^ hook->rx.not)
++ key_list = mutt_add_list (key_list, hook->command);
++ }
++ return (key_list);
+ }
+--- init.h Feb 2004 17:10:43 -0000 3.43
++++ init.h Feb 2004 06:07:14 -0000
+@@ -1205,2 +1205,12 @@ struct option_t MuttVars[] = {
+ */
++
++
++ { "pgp_autoselectkey", DT_SYN, R_NONE, UL "crypt_autoselectkey", 0 },
++ { "crypt_autoselectkey", DT_BOOL, R_NONE, OPTCRYPTAUTOSELECT, 0 },
++ /*
++ ** .pp
++ ** If set, then a list of keys is not presented for selection when only
++ ** one matching key is available. This may be useful in conjunction with
++ ** the \fIcrypt-hook\fP command.
++ */
+ { "pgp_autosign", DT_SYN, R_NONE, UL "crypt_autosign", 0 },
+@@ -1230,2 +1240,11 @@ struct option_t MuttVars[] = {
+ */
++ { "pgp_confirmhook", DT_SYN, R_NONE, UL "crypt_confirmhook", 1 },
++ { "crypt_confirmhook", DT_BOOL, R_NONE, OPTCRYPTCONFIRMHOOK, 1 },
++ /*
++ ** .pp
++ ** If set, then you will be prompted for confirmation of keys when using
++ ** the \fIcrypt-hook\fP command. If unset, no such confirmation prompt will
++ ** be presented. This is generally considered unsafe, especially where
++ ** typos are concerned.
++ */
+ { "pgp_ignore_subkeys", DT_BOOL, R_NONE, OPTPGPIGNORESUB, 1},
+@@ -1374,2 +1393,44 @@ struct option_t MuttVars[] = {
+ */
++ { "pgp_create_traditional", DT_SYN, R_NONE, UL "pgp_autoinline", 0 },
++ { "pgp_autoinline", DT_BOOL, R_NONE, OPTPGPAUTOINLINE, 0 },
++ /*
++ ** .pp
++ ** This option controls whether Mutt generates old-style inline
++ ** (traditional) PGP encrypted or signed messages under certain
++ ** circumstances. This can be overridden by use of the \fIpgp-menu\fP,
++ ** when inline is not required.
++ ** .pp
++ ** Note that Mutt might automatically use PGP/MIME for messages
++ ** which consist of more than a single MIME part. Mutt can be
++ ** configured to ask before sending PGP/MIME messages when inline
++ ** (traditional) would not work.
++ ** See also: ``$$pgp_mime_ask''.
++ ** .pp
++ ** Also note that using the old-style PGP message format is \fBstrongly\fP
++ ** \fBdeprecated\fP.
++ ** (PGP only)
++ */
++ { "pgp_auto_traditional", DT_SYN, R_NONE, UL "pgp_replyinline", 0 },
++ { "pgp_replyinline", DT_BOOL, R_NONE, OPTPGPREPLYINLINE, 0 },
++ /*
++ ** .pp
++ ** Setting this variable will cause Mutt to always attempt to
++ ** create an inline (traditional) message when replying to a
++ ** message which is PGP encrypted/signed inline. This can be
++ ** overridden by use of the \fIpgp-menu\fP, when inline is not
++ ** required. This option does not automatically detect if the
++ ** (replied-to) message is inline; instead it relies on Mutt
++ ** internals for previously checked/flagged messages.
++ ** .pp
++ ** Note that Mutt might automatically use PGP/MIME for messages
++ ** which consist of more than a single MIME part. Mutt can be
++ ** configured to ask before sending PGP/MIME messages when inline
++ ** (traditional) would not work.
++ ** See also: ``$$pgp_mime_ask''.
++ ** .pp
++ ** Also note that using the old-style PGP message format is \fBstrongly\fP
++ ** \fBdeprecated\fP.
++ ** (PGP only)
++ **
++ */
+ { "pgp_show_unusable", DT_BOOL, R_NONE, OPTPGPSHOWUNUSABLE, 1 },
+@@ -1423,11 +1484,8 @@ struct option_t MuttVars[] = {
+ */
+- { "pgp_create_traditional", DT_QUAD, R_NONE, OPT_PGPTRADITIONAL, M_NO },
++ { "pgp_mime_ask", DT_QUAD, R_NONE, OPT_PGPMIMEASK, M_NO },
+ /*
+ ** .pp
+- ** This option controls whether Mutt generates old-style inline PGP
+- ** encrypted or signed messages.
+- ** .pp
+- ** Note that PGP/MIME will be used automatically for messages which have
+- ** a character set different from us-ascii, or which consist of more than
+- ** a single MIME part.
++ ** This option controls whether Mutt will prompt you for
++ ** automatically sending a (signed/encrypted) message using
++ ** PGP/MIME when inline (traditional) fails (for any reason).
+ ** .pp
+@@ -1435,19 +1493,2 @@ struct option_t MuttVars[] = {
+ ** \fBdeprecated\fP.
+- ** (PGP only)
+- */
+- { "pgp_auto_traditional", DT_BOOL, R_NONE, OPTPGPAUTOTRAD, 0 },
+- /*
+- ** .pp
+- ** This option causes Mutt to generate an old-style inline PGP
+- ** encrypted or signed message when replying to an old-style
+- ** message, and a PGP/MIME message when replying to a PGP/MIME
+- ** message. Note that this option is only meaningful when using
+- ** ``$$crypt_replyencrypt'', ``$$crypt_replysign'', or
+- ** ``$$crypt_replysignencrypted''.
+- ** .pp
+- ** Also note that PGP/MIME will be used automatically for messages
+- ** which have a character set different from us-ascii, or which
+- ** consist of more than a single MIME part.
+- ** .pp
+- ** This option overrides ``$$pgp_create_traditional''
+ ** (PGP only)
+--- mutt.h Feb 2004 17:10:43 -0000 3.23
++++ mutt.h Feb 2004 06:07:14 -0000
+@@ -278,3 +278,2 @@ enum
+ OPT_MOVE,
+- OPT_PGPTRADITIONAL, /* create old-style PGP messages */
+ #ifdef USE_POP
+@@ -284,2 +283,3 @@ enum
+ OPT_POSTPONE,
++ OPT_PGPMIMEASK, /* ask to revert to PGP/MIME when inline fails */
+ OPT_PRINT,
+@@ -431,2 +431,3 @@ enum
+
++ OPTCRYPTAUTOSELECT,
+ OPTCRYPTAUTOSIGN,
+@@ -442,2 +443,3 @@ enum
+ OPTSDEFAULTDECRYPTKEY,
++ OPTCRYPTCONFIRMHOOK,
+ OPTPGPIGNORESUB,
+@@ -445,3 +447,2 @@ enum
+ OPTPGPLONGIDS,
+- OPTPGPAUTOTRAD,
+ #if 0
+@@ -453,2 +454,4 @@ enum
+ OPTPGPSHOWUNUSABLE,
++ OPTPGPAUTOINLINE,
++ OPTPGPREPLYINLINE,
+
+@@ -642,4 +645,4 @@ typedef struct header
+ {
+- unsigned int security : 9; /* bit 0-6: flags, bit 7,8: application.
+- see: crypt.h pgplib.h, smime.h */
++ unsigned int security : 10; /* bit 0-7: flags, bit 8,9: application.
++ see: mutt_crypt.h */
+
+--- mutt_crypt.h Dec 2003 13:04:20 -0000 3.5
++++ mutt_crypt.h Feb 2004 06:07:14 -0000
+@@ -38,6 +38,7 @@
+ #define SIGNOPAQUE (1 << 5)
+-/* (1 << 6) is used by PGPKEY below. */
++#define KEYBLOCK (1 << 6) /* KEY too generic? */
++#define INLINE (1 << 7)
+
+-#define APPLICATION_PGP (1 << 7)
+-#define APPLICATION_SMIME (1 << 8)
++#define APPLICATION_PGP (1 << 8)
++#define APPLICATION_SMIME (1 << 9)
+
+@@ -46,3 +47,4 @@
+ #define PGPGOODSIGN (APPLICATION_PGP | GOODSIGN)
+-#define PGPKEY (APPLICATION_PGP | (1 << 6))
++#define PGPKEY (APPLICATION_PGP | KEYBLOCK)
++#define PGPINLINE (APPLICATION_PGP | INLINE)
+
+@@ -105,3 +107,3 @@ typedef struct pgp_keyinfo *pgp_key_t;
+
+-int mutt_protect (HEADER *, HEADER *, char *);
++int mutt_protect (HEADER *, char *);
+
+--- pgp.c Sep 2003 13:03:26 -0000 3.26
++++ pgp.c Feb 2004 06:07:14 -0000
+@@ -1018,2 +1018,4 @@ char *pgp_findKeys (ADDRESS *to, ADDRESS
+ size_t keylist_used = 0;
++ LIST *hook_list = NULL;
++ LIST *hook = NULL;
+ ADDRESS *tmp = NULL, *addr = NULL;
+@@ -1051,66 +1053,93 @@ char *pgp_findKeys (ADDRESS *to, ADDRESS
+ q = p;
+- k_info = NULL;
+
+- if ((keyID = mutt_crypt_hook (p)) != NULL)
++ /*
++ * grab the list of matching hooks (matching on recipient address)
++ * process each entry singly so that auto key selection still works
++ */
++ hook_list = mutt_crypt_hook (p);
++ hook = hook_list;
++ while (1)
+ {
+ int r;
+- snprintf (buf, sizeof (buf), _("Use keyID = \"%s\" for %s?"), keyID, p->mailbox);
+- if ((r = mutt_yesorno (buf, M_YES)) == M_YES)
++
++ k_info = NULL;
++ key = NULL;
++
++ if (hook)
+ {
+- if (is_numerical_keyid (keyID))
++ keyID = (char *)hook->data;
++ snprintf (buf, sizeof (buf), _("Use keyID = \"%s\" for %s?"), keyID, p->mailbox);
++ if (!option(OPTCRYPTCONFIRMHOOK) || (r = mutt_yesorno (buf, M_YES)) == M_YES)
+ {
+- if (strncmp (keyID, "0x", 2) == 0)
+- keyID += 2;
+- goto bypass_selection; /* you don't see this. */
++ if (is_numerical_keyid (keyID))
++ {
++ if (strncmp (keyID, "0x", 2) == 0)
++ keyID += 2;
++ goto bypass_selection; /* you don't see this. */
++ }
++
++ /* check for e-mail address */
++ if ((t = strchr (keyID, '@')) &&
++ (addr = rfc822_parse_adrlist (NULL, keyID)))
++ {
++ if (fqdn) rfc822_qualify (addr, fqdn);
++ q = addr;
++ }
++ else
++ k_info = pgp_getkeybystr (keyID, KEYFLAG_CANENCRYPT, PGP_PUBRING);
+ }
+-
+- /* check for e-mail address */
+- if ((t = strchr (keyID, '@')) &&
+- (addr = rfc822_parse_adrlist (NULL, keyID)))
++ else if (r == -1)
+ {
+- if (fqdn) rfc822_qualify (addr, fqdn);
+- q = addr;
++ /*
++ * yes, this implies that if one key fails they all do
++ */
++ FREE (&keylist);
++ rfc822_free_address (&tmp);
++ rfc822_free_address (&addr);
++ mutt_free_list (&hook_list);
++ return NULL;
+ }
+- else
+- k_info = pgp_getkeybystr (keyID, KEYFLAG_CANENCRYPT, PGP_PUBRING);
+ }
+- else if (r == -1)
+- {
+- FREE (&keylist);
+- rfc822_free_address (&tmp);
+- rfc822_free_address (&addr);
+- return NULL;
+- }
+- }
+
+- if (k_info == NULL)
+- pgp_invoke_getkeys (q);
+-
+- if (k_info == NULL && (k_info = pgp_getkeybyaddr (q, KEYFLAG_CANENCRYPT, PGP_PUBRING)) == NULL)
+- {
+- snprintf (buf, sizeof (buf), _("Enter keyID for %s: "), q->mailbox);
++ if (k_info == NULL)
++ pgp_invoke_getkeys (q);
+
+- if ((key = pgp_ask_for_key (buf, q->mailbox,
+- KEYFLAG_CANENCRYPT, PGP_PUBRING)) == NULL)
++ if (k_info == NULL && (k_info = pgp_getkeybyaddr (q, KEYFLAG_CANENCRYPT, PGP_PUBRING)) == NULL)
+ {
+- FREE (&keylist);
+- rfc822_free_address (&tmp);
+- rfc822_free_address (&addr);
+- return NULL;
++ snprintf (buf, sizeof (buf), _("Enter keyID for %s: "), q->mailbox);
++
++ if ((key = pgp_ask_for_key (buf, q->mailbox,
++ KEYFLAG_CANENCRYPT, PGP_PUBRING)) == NULL)
++ {
++ FREE (&keylist);
++ rfc822_free_address (&tmp);
++ rfc822_free_address (&addr);
++ mutt_free_list (&hook_list);
++ return NULL;
++ }
+ }
+- }
+- else
+- key = k_info;
++ else
++ key = k_info;
+
+- keyID = pgp_keyid (key);
++ keyID = pgp_keyid (key);
+
+ bypass_selection:
+- keylist_size += mutt_strlen (keyID) + 4;
+- safe_realloc (&keylist, keylist_size);
+- sprintf (keylist + keylist_used, "%s0x%s", keylist_used ? " " : "", /* __SPRINTF_CHECKED__ */
+- keyID);
+- keylist_used = mutt_strlen (keylist);
++ keylist_size += mutt_strlen (keyID) + 4;
++ safe_realloc (&keylist, keylist_size);
++ sprintf (keylist + keylist_used, "%s0x%s", keylist_used ? " " : "", /* __SPRINTF_CHECKED__ */
++ keyID);
++ keylist_used = mutt_strlen (keylist);
+
+- pgp_free_key (&key);
+- rfc822_free_address (&addr);
++ pgp_free_key (&key);
++ rfc822_free_address (&addr);
++
++ if (!hook_list)
++ break;
++
++ hook = hook->next;
++ if (!hook)
++ break;
++
++ }
++ mutt_free_list (&hook_list);
+
+--- pgpkey.c Oct 2003 19:55:39 -0000 3.8
++++ pgpkey.c Feb 2004 06:07:14 -0000
+@@ -437,4 +437,9 @@ static int pgp_id_matches_addr (ADDRESS
+
++
++#define pgp_trusted_id(uid) (!option(OPTPGPCHECKTRUST) \
++ || (pgp_id_is_valid((uid)) \
++ && pgp_id_is_strong((uid))))
++
+ static pgp_key_t pgp_select_key (pgp_key_t keys,
+- ADDRESS * p, const char *s)
++ ADDRESS * p, const char *s)
+ {
+@@ -452,2 +457,3 @@ static pgp_key_t pgp_select_key (pgp_key
+
++ int keymatch = 0; /* count matching keys */
+ int unusable = 0;
+@@ -481,2 +487,3 @@ static pgp_key_t pgp_select_key (pgp_key
+ }
++ keymatch++;
+ }
+@@ -489,2 +496,17 @@ static pgp_key_t pgp_select_key (pgp_key
+ }
++ else if (keymatch == 1 && option(OPTCRYPTAUTOSELECT))
++ {
++ /*
++ * Only one matching key...see if there's an id with enough trust to auto-select
++ */
++ kp = KeyTable[0]->parent;
++ for (a = kp->address; a; a = a->next)
++ {
++ if (pgp_trusted_id(a))
++ {
++ safe_free ((void **) &KeyTable);
++ return (kp);
++ }
++ }
++ }
+
+@@ -599,5 +621,3 @@ static pgp_key_t pgp_select_key (pgp_key
+
+- if (option (OPTPGPCHECKTRUST) &&
+- (!pgp_id_is_valid (KeyTable[menu->current])
+- || !pgp_id_is_strong (KeyTable[menu->current])))
++ if (!pgp_trusted_id(KeyTable[menu->current]))
+ {
+--- postpone.c Sep 2003 17:22:09 -0000 3.9
++++ postpone.c Feb 2004 06:07:14 -0000
+@@ -486,2 +486,7 @@ int mutt_parse_crypt_hdr (char *p, int s
+
++ case 'i':
++ case 'I':
++ pgp |= INLINE;
++ break;
++
+ default:
+--- protos.h Feb 2004 17:10:43 -0000 3.19
++++ protos.h Feb 2004 06:07:14 -0000
+@@ -131,3 +131,3 @@ const char *mutt_get_name (ADDRESS *);
+ char *mutt_get_parameter (const char *, PARAMETER *);
+-char *mutt_crypt_hook (ADDRESS *);
++LIST *mutt_crypt_hook (ADDRESS *);
+ char *mutt_make_date (char *, size_t);
+--- send.c Jan 2004 10:03:46 -0000 3.29
++++ send.c Feb 2004 06:07:14 -0000
+@@ -1258,2 +1258,9 @@ ci_send_message (int flags, /* send mod
+ msg->security |= SIGN;
++ if ((WithCrypto & APPLICATION_PGP) && (msg->security & (ENCRYPT | SIGN)))
++ {
++ if (option (OPTPGPAUTOINLINE))
++ msg->security |= INLINE;
++ if (option (OPTPGPREPLYINLINE) && cur && (cur->security & INLINE))
++ msg->security |= INLINE;
++ }
+ }
+@@ -1496,3 +1503,3 @@ main_loop:
+ if ((crypt_get_keys (msg, &pgpkeylist) == -1) ||
+- mutt_protect (msg, cur, pgpkeylist) == -1)
++ mutt_protect (msg, pgpkeylist) == -1)
+ {
+@@ -1576,3 +1583,3 @@ main_loop:
+
+- if (mutt_protect (msg, cur, pgpkeylist) == -1)
++ if (mutt_protect (msg, pgpkeylist) == -1)
+ {
+--- sendlib.c Sep 2003 13:03:26 -0000 3.24
++++ sendlib.c Feb 2004 06:07:14 -0000
+@@ -2407,2 +2407,4 @@ int mutt_write_fcc (const char *path, HE
+ }
++ if (hdr->security & INLINE)
++ fputc ('I', msg->fp);
+ fputc ('\n', msg->fp);
+--- doc/manual.sgml.head Feb 2004 17:45:33 -0000 3.26
++++ doc/manual.sgml.head Feb 2004 06:07:15 -0000
+@@ -1450,3 +1450,5 @@ normally use. The crypt-hook command pr
+ specify the ID of the public key to be used when encrypting messages to
+-a certain recipient.
++a certain recipient. You may use multiple pgp-hook's with the same
++pattern; multiple matching pgp-hook's result in the use of multiple
++keyids for recipient.
+
+--- doc/muttrc.man.head Feb 2004 17:10:43 -0000 3.10
++++ doc/muttrc.man.head Feb 2004 06:07:15 -0000
+@@ -297,3 +297,6 @@ to a certain recipient. The meaning of
+ broadly: This can be a different e-mail address, a numerical key ID,
+-or even just an arbitrary search string.
++or even just an arbitrary search string. You may use multiple
++\fBpgp-hook\fPs with the same \fIpattern\fP; multiple matching
++\fBpgp-hook\fPs result in the use of multiple \fIkey-id\fPs for
++recipient.
+ .TP
+--- po/ca.po Feb 2004 18:26:11 -0000 3.13
++++ po/ca.po Feb 2004 06:07:15 -0000
+@@ -603,10 +603,10 @@ msgstr "Xifra amb: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP: (x)ifra, (s)igna, si(g)na com a, (a)mbdós, o en (c)lar? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP: (x)ifra, (s)igna, s(i)gna com a, (a)mbdós, en (l)ínia, o en (c)lar? "
+
+ # ivb (2003/03/26)
+-# ivb (x)ifra, (s)igna, si(g)na com a, (a)mbdós, (c)lar
++# ivb (x)ifra, (s)igna, s(i)gna com a, (a)mbdós, en (l)ínia, o en (c)lar
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "xsgac"
++msgid "esabif"
++msgstr "xsialc"
+
+--- po/cs.po Feb 2004 18:26:11 -0000 3.12
++++ po/cs.po Feb 2004 06:07:16 -0000
+@@ -683,4 +683,4 @@ msgstr "Za¹ifrovat pomocí:"
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP - (¹)ifrovat, (p)odepsat, podepsat (j)ako, (o)bojí, èi (n)ic?"
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP - (¹)ifrovat, (p)odepsat, podepsat (j)ako, (o)bojí, pøí(m)ý, èi (n)ic?"
+
+@@ -688,4 +688,4 @@ msgstr "PGP - (¹)ifrovat, (p)odepsat, po
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "¹pjon"
++msgid "esabif"
++msgstr "¹pjomn"
+
+--- po/da.po Feb 2004 18:26:11 -0000 3.11
++++ po/da.po Feb 2004 06:07:16 -0000
+@@ -578,8 +578,8 @@ msgstr "Kryptér"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "(k)ryptér, (u)nderskriv, underskriv (s)om, (b)egge, (i)ngen PGP"
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "(k)ryptér, (u)nderskriv, underskriv (s)om, (b)egge, i(n)tegreret, (i)ngen PGP"
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "kusbi"
++msgid "esabif"
++msgstr "kusbni"
+
+--- po/de.po Feb 2004 18:26:11 -0000 3.15
++++ po/de.po Feb 2004 06:07:16 -0000
+@@ -569,8 +569,8 @@ msgstr "Verschlüsseln mit: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP (v)erschl., (s)ign., sign. (a)ls, (b)eides, (k)ein PGP? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP (v)erschl., (s)ign., sign. (a)ls, (b)eides, (i)nline, (k)ein PGP? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "vsabk"
++msgid "esabif"
++msgstr "vsabik"
+
+--- po/el.po Feb 2004 18:26:11 -0000 3.12
++++ po/el.po Feb 2004 06:07:17 -0000
+@@ -700,4 +700,4 @@ msgstr "ÊñõðôïãñÜöçóç ìå: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, Þ (f)orget it? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)êåßìåíï, Þ (f)orget it? "
+
+@@ -706,4 +706,4 @@ msgstr "PGP (e)ncrypt, (s)ign, sign (a)s
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "esabf"
++msgid "esabif"
++msgstr "esabif"
+
+--- po/eo.po Feb 2004 18:26:11 -0000 3.13
++++ po/eo.po Feb 2004 06:07:17 -0000
+@@ -571,8 +571,8 @@ msgstr "Æifri per: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP æ(i)fri, (s)ubskribi, subskribi (k)iel, (a)mbaý, aý (f)orgesi? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP æ(i)fri, (s)ubskribi, subskribi (k)iel, (a)mbaý, \"i(n)line\", aý (f)orgesi? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "iskaf"
++msgid "esabif"
++msgstr "iskanf"
+
+--- po/es.po Feb 2004 18:26:11 -0000 3.14
++++ po/es.po Feb 2004 06:07:17 -0000
+@@ -576,4 +576,4 @@ msgstr "Cifrar"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "¿co(d)ificar, f(i)rmar (c)omo, amb(o)s o ca(n)celar? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "¿co(d)ificar, f(i)rmar (c)omo, amb(o)s, inc(l)uido, o ca(n)celar? "
+
+@@ -581,4 +581,4 @@ msgstr "¿co(d)ificar, f(i)rmar (c)omo, a
+ #, fuzzy
+-msgid "esabf"
+-msgstr "dicon"
++msgid "esabif"
++msgstr "dicoln"
+
+--- po/et.po Feb 2004 18:26:11 -0000 3.13
++++ po/et.po Feb 2004 06:07:18 -0000
+@@ -571,8 +571,8 @@ msgstr "Krüpti kasutades: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP (k)rüpti, (a)llkiri, allk. ku(i), (m)õlemad või (u)nusta? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP (k)rüpti, (a)llkiri, allk. ku(i), (m)õlemad, k(e)hasse, või (u)nusta? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "kaimu"
++msgid "esabif"
++msgstr "kaimeu"
+
+--- po/fr.po Feb 2004 18:26:11 -0000 3.23
++++ po/fr.po Feb 2004 06:07:18 -0000
+@@ -596,8 +596,8 @@ msgstr "Chiffrer avec : "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "(c)hiffrer PGP, (s)igner, (e)n tant que, les (d)eux, ou (o)ublier ? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "(c)hiffrer PGP, (s)igner, (e)n tant que, les (d)eux, en (l)igne, ou (o)ublier ? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "csedo"
++msgid "esabif"
++msgstr "csedlo"
+
+--- po/gl.po Feb 2004 18:26:11 -0000 3.11
++++ po/gl.po Feb 2004 06:07:18 -0000
+@@ -580,8 +580,8 @@ msgstr "Encriptar"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "¿(e)ncriptar, (f)irmar, firmar (c)omo, (a)mbas ou (o)lvidar? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "¿(e)ncriptar, (f)irmar, firmar (c)omo, (a)mbas, (i)nterior, ou (o)lvidar? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "efcao"
++msgid "esabif"
++msgstr "efcaio"
+
+--- po/hu.po Feb 2004 18:26:11 -0000 3.12
++++ po/hu.po Feb 2004 06:07:19 -0000
+@@ -571,8 +571,8 @@ msgstr "Titkosítás: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP (t)itkosít, (a)láír, aláír (m)int, titkosít é(s) aláír, mé(g)se? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP (t)itkosít, (a)láír, aláír (m)int, titkosít é(s) aláír, (b)eágyazott, mé(g)se? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "tamsg"
++msgid "esabif"
++msgstr "tamsbg"
+
+--- po/id.po Feb 2004 18:26:12 -0000 3.14
++++ po/id.po Feb 2004 06:07:19 -0000
+@@ -572,8 +572,8 @@ msgstr "Enkrip dengan: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP (e)nkrip, (t)andatangan, tandatangan (s)bg, ke(d)uanya, (b)atal? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP (e)nkrip, (t)andatangan, tandatangan (s)bg, ke(d)uanya, (i)nline, (b)atal? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "etsdb"
++msgid "esabif"
++msgstr "etsdib"
+
+--- po/it.po Feb 2004 18:26:12 -0000 3.11
++++ po/it.po Feb 2004 06:07:19 -0000
+@@ -582,8 +582,8 @@ msgstr "Crittografa"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "cifra(e), firma(s), firma come(a), entrambi(b), annulla(f) "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "cifra(e), firma(s), firma come(a), entrambi(b), in l(i)nea , annulla(f) "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "esabf"
++msgid "esabif"
++msgstr "esabif"
+
+--- po/ja.po Feb 2004 18:26:12 -0000 3.21
++++ po/ja.po Feb 2004 06:07:20 -0000
+@@ -569,8 +569,8 @@ msgstr " °Å¹æ²½Êý¼°: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP (e)°Å¹æ²½,(s)½ð̾,(a)..¤È¤·¤Æ½ð̾,(b)ξ¼Ô,(f)²ò½ü?"
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP (e)°Å¹æ²½,(s)½ð̾,(a)..¤È¤·¤Æ½ð̾,(b)ξ¼Ô,(i)nline,(f)²ò½ü?"
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "esabf"
++msgid "esabif"
++msgstr "esabif"
+
+--- po/ko.po Feb 2004 18:26:12 -0000 3.15
++++ po/ko.po Feb 2004 06:07:20 -0000
+@@ -570,8 +570,8 @@ msgstr "¾Ïȣȭ ¹æ½Ä: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP ¾Ïȣȭ(e), ¼­¸í(s), »ç¿ë ¼­¸í(a), µÑ ´Ù(b), Ãë¼Ò(f)? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP ¾Ïȣȭ(e), ¼­¸í(s), »ç¿ë ¼­¸í(a), µÑ ´Ù(b), (i)nline, Ãë¼Ò(f)? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "esabf"
++msgid "esabif"
++msgstr "esabif"
+
+--- po/lt.po Feb 2004 18:26:12 -0000 3.11
++++ po/lt.po Feb 2004 06:07:20 -0000
+@@ -578,5 +578,5 @@ msgstr "Uþðifruoti"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
+ msgstr ""
+-"(u)þðifruot, pa(s)iraðyt, pasiraðyt k(a)ip, a(b)u, rinktis (m)ic algoritmà, "
++"(u)þðifruot, pa(s)iraðyt, pasiraðyt k(a)ip, a(b)u, (l)aiðke, "
+ "ar (p)amirðti?"
+@@ -585,4 +585,4 @@ msgstr ""
+ #, fuzzy
+-msgid "esabf"
+-msgstr "usabmp"
++msgid "esabif"
++msgstr "usablp"
+
+@@ -598,4 +598,3 @@ msgid ""
+ msgstr ""
+-"(u)þðifruot, pa(s)iraðyt, pasiraðyt k(a)ip, a(b)u, rinktis (m)ic algoritmà, "
+-"ar (p)amirðti?"
++"(u)þðifruot, pa(s)iraðyt, uþðifruo(t) su, pasiraðyt k(a)ip, a(b)u, ar (p)amirðti?"
+
+@@ -604,3 +603,3 @@ msgstr ""
+ msgid "eswabf"
+-msgstr "usabmp"
++msgstr "ustabp"
+
+--- po/nl.po Feb 2004 18:26:12 -0000 3.16
++++ po/nl.po Feb 2004 06:07:21 -0000
+@@ -568,8 +568,8 @@ msgstr "Versleutelen met: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP (v)ersleutel, (o)ndertekenen, ondert. (a)ls, (b)eiden, (g)een? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP (v)ersleutel, (o)ndertekenen, ondert. (a)ls, (b)eiden, ber(i)cht, (g)een? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "voabg"
++msgid "esabif"
++msgstr "voabig"
+
+--- po/pl.po Feb 2004 18:26:12 -0000 3.17
++++ po/pl.po Feb 2004 06:07:21 -0000
+@@ -571,8 +571,8 @@ msgstr "Zaszyfruj u¿ywaj±c: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP: (z)aszyfruj, podpi(s)z, podpisz j(a)ko, o(b)a, b(e)z PGP? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP: (z)aszyfruj, podpi(s)z, podpisz j(a)ko, o(b)a, (i)nline, b(e)z PGP? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "zsabe"
++msgid "esabif"
++msgstr "zsabie"
+
+--- po/pt_BR.po Feb 2004 18:26:13 -0000 3.12
++++ po/pt_BR.po Feb 2004 06:07:21 -0000
+@@ -581,5 +581,5 @@ msgstr "Encriptar"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
+ msgstr ""
+-"(e)ncripa, a(s)sina, assina (c)omo, (a)mbos, escolhe (m)ic, ou es(q)uece? "
++"(e)ncripa, a(s)sina, assina (c)omo, (a)mbos, em l(i)nha, ou es(q)uece? "
+
+@@ -587,4 +587,4 @@ msgstr ""
+ #, fuzzy
+-msgid "esabf"
+-msgstr "escamq"
++msgid "esabif"
++msgstr "escaiq"
+
+@@ -600,3 +600,3 @@ msgid ""
+ msgstr ""
+-"(e)ncripa, a(s)sina, assina (c)omo, (a)mbos, escolhe (m)ic, ou es(q)uece? "
++"(e)ncripa, a(s)sina, e(n)cripa com, assina (c)omo, (a)mbos, ou es(q)uece? "
+
+@@ -605,3 +605,3 @@ msgstr ""
+ msgid "eswabf"
+-msgstr "escamq"
++msgstr "esncaq"
+
+--- po/ru.po Feb 2004 18:26:13 -0000 3.19
++++ po/ru.po Feb 2004 06:07:22 -0000
+@@ -577,8 +577,8 @@ msgstr "úÁÛÉÆÒÏ×ÁÔØ: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP (e)ÛÉÆÒ, (s)ÐÏÄÐÉÓØ, (a)ÐÏÄÐÉÓØ ËÁË, (b)ÏÂÁ, (f)ÏÔËÁÚÁÔØÓÑ? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP (e)ÛÉÆÒ, (s)ÐÏÄÐÉÓØ, (a)ÐÏÄÐÉÓØ ËÁË, (b)ÏÂÁ, (i)nline, (f)ÏÔËÁÚÁÔØÓÑ? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "esabf"
++msgid "esabif"
++msgstr "esabif"
+
+--- po/sk.po Feb 2004 18:26:13 -0000 3.11
++++ po/sk.po Feb 2004 06:07:22 -0000
+@@ -586,5 +586,5 @@ msgstr "Za¹ifruj"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
+ msgstr ""
+-"(e)-¹ifr, (s)-podp, podp (a)ko, o(b)e, oznaè alg. mi(c), alebo (f)-zabudnú» "
++"(e)-¹ifr, (s)-podp, podp (a)ko, o(b)e, (i)nline, alebo (f)-zabudnú» "
+ "na to? "
+@@ -593,4 +593,4 @@ msgstr ""
+ #, fuzzy
+-msgid "esabf"
+-msgstr "esabmf"
++msgid "esabif"
++msgstr "esabif"
+
+@@ -606,4 +606,3 @@ msgid ""
+ msgstr ""
+-"(e)-¹ifr, (s)-podp, podp (a)ko, o(b)e, oznaè alg. mi(c), alebo (f)-zabudnú» "
+-"na to? "
++"(e)-¹ifr, (s)-podp, (w)-¹ifr s, podp (a)ko, o(b)e, alebo (f)-zabudnú» na to? "
+
+@@ -612,3 +611,3 @@ msgstr ""
+ msgid "eswabf"
+-msgstr "esabmf"
++msgstr "eswabf"
+
+--- po/sv.po Feb 2004 18:26:13 -0000 3.12
++++ po/sv.po Feb 2004 06:07:22 -0000
+@@ -568,8 +568,8 @@ msgstr "Kryptera med: "
+ #: compose.c:165
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "PGP: (k)ryptera, (s)ignera, signera s(o)m, (b)åda, eller sk(i)ppa det?"
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "PGP: (k)ryptera, (s)ignera, signera s(o)m, (b)åda, i(n)fogat, eller sk(i)ppa det?"
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "ksobi"
++msgid "esabif"
++msgstr "ksobni"
+
+--- po/tr.po Feb 2004 18:26:13 -0000 3.11
++++ po/tr.po Feb 2004 06:07:22 -0000
+@@ -577,5 +577,5 @@ msgstr "Þifrele"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
+ msgstr ""
+-"þ(i)frele, i(m)zala, (f)arklý imzala, i(k)isi de, mi(c) algoritmini seç "
++"þ(i)frele, i(m)zala, (f)arklý imzala, i(k)isi de, (i)nline, "
+ "yoksa i(p)talmý? "
+@@ -583,4 +583,4 @@ msgstr ""
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "imfkcp"
++msgid "esabif"
++msgstr "imfkip"
+
+--- po/uk.po Feb 2004 18:26:13 -0000 3.12
++++ po/uk.po Feb 2004 06:07:23 -0000
+@@ -572,8 +572,8 @@ msgstr "ûÉÆÒÕ×ÁÎÎÑ"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
+-msgstr "ÛÉÆÒ.(e), ЦÄÐ.(s), ЦÄÐ. ÑË(a), ÕÓÅ(b) ÞÉ ×¦ÄͦÎÁ(f)? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
++msgstr "ÛÉÆÒ.(e), ЦÄÐ.(s), ЦÄÐ. ÑË(a), ÕÓÅ(b), (i)nline ÞÉ ×¦ÄͦÎÁ(f)? "
+
+ #: compose.c:166
+-msgid "esabf"
+-msgstr ""
++msgid "esabif"
++msgstr "esabif"
+
+--- po/zh_CN.po Feb 2004 18:26:13 -0000 3.11
++++ po/zh_CN.po Feb 2004 06:07:23 -0000
+@@ -585,5 +585,5 @@ msgstr "¼ÓÃÜ"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
+ msgstr ""
+-"(e)¼ÓÃÜ, (s)Ç©Ãû, (a)ÓñðµÄÉí·ÝÇ©, (b)Á½Õß½ÔÒª, Ñ¡Ôñ (m)ic ÑÝËã·¨ »ò (f)·Å"
++"(e)¼ÓÃÜ, (s)Ç©Ãû, (a)ÓñðµÄÉí·ÝÇ©, (b)Á½Õß½ÔÒª, (i)nline, »ò (f)·Å"
+ "Æú£¿"
+@@ -591,4 +591,4 @@ msgstr ""
+ #: compose.c:166
+-msgid "esabf"
+-msgstr ""
++msgid "esabif"
++msgstr "esabif"
+
+--- po/zh_TW.po Feb 2004 18:26:13 -0000 3.11
++++ po/zh_TW.po Feb 2004 06:07:24 -0000
+@@ -577,3 +577,3 @@ msgstr "加密"
+ #, fuzzy
+-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
++msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
+ msgstr "(1)加密, (2)ç°½å, (3)用別的身份簽, (4)兩者皆è¦, 或 (5)放棄?"
+@@ -581,4 +581,4 @@ msgstr "(1)加密, (2)ç°½å, (3)用別ç
+ #: compose.c:166
+-msgid "esabf"
+-msgstr "12345"
++msgid "esabif"
++msgstr "1234i5"
+
diff --git a/mail/mutt/files/extra-patch-reverse_reply b/mail/mutt/files/extra-patch-reverse_reply
new file mode 100644
index 000000000000..4605f77de67d
--- /dev/null
+++ b/mail/mutt/files/extra-patch-reverse_reply
@@ -0,0 +1,92 @@
+diff -u PATCHES PATCHES
+--- PATCHES
++++ PATCHES
+@@ -0,0 +1 @@
++patch-1.5.6.cb.reverse_reply.2
+--- init.h.orig 2005-03-01 16:56:02.000000000 +0100
++++ init.h 2005-05-25 18:20:57.000000000 +0200
+@@ -2257,6 +2257,13 @@
+ ** possibly including eventual real names. When it is unset, mutt will
+ ** override any such real names with the setting of the $realname variable.
+ */
++ { "reverse_reply", DT_BOOL, R_NONE, OPTREVREPLY, 0 },
++ /*
++ ** .pp
++ ** When set, this variable uses the name from your aliases in the To and Cc
++ ** headers of reply mails you send, like $reverse_alias does in the index.
++ ** When unset, the headers taken from the original mail are left unchanged.
++ */
+ { "rfc2047_parameters", DT_BOOL, R_NONE, OPTRFC2047PARAMS, 0 },
+ /*
+ ** .pp
+--- mutt.h.orig 2005-02-28 16:13:57.000000000 +0100
++++ mutt.h 2005-05-25 18:20:57.000000000 +0200
+@@ -410,6 +410,7 @@
+ OPTREVALIAS,
+ OPTREVNAME,
+ OPTREVREAL,
++ OPTREVREPLY,
+ OPTRFC2047PARAMS,
+ OPTSAVEADDRESS,
+ OPTSAVEEMPTY,
+--- protos.h.orig Wed Jul 12 01:32:28 2006
++++ protos.h Mon Jul 17 16:14:16 2006
+@@ -92,6 +92,7 @@
+ ADDRESS *mutt_lookup_alias (const char *s);
+ ADDRESS *mutt_remove_duplicates (ADDRESS *);
+ ADDRESS *mutt_remove_xrefs (ADDRESS *, ADDRESS *);
++ADDRESS *mutt_reverse_address (ADDRESS *);
+ ADDRESS *mutt_expand_aliases (ADDRESS *);
+ ADDRESS *mutt_parse_adrlist (ADDRESS *, const char *);
+
+--- send.c.orig 2005-02-03 19:47:53.000000000 +0100
++++ send.c 2005-05-25 18:20:57.000000000 +0200
+@@ -588,6 +588,10 @@
+ /* the CC field can get cluttered, especially with lists */
+ env->to = mutt_remove_duplicates (env->to);
+ env->cc = mutt_remove_duplicates (env->cc);
++ if (option (OPTREVREPLY)){
++ env->to = mutt_reverse_address (env->to);
++ env->cc = mutt_reverse_address (env->cc);
++ }
+ env->cc = mutt_remove_xrefs (env->to, env->cc);
+ }
+
+--- sendlib.c.orig 2005-02-21 05:45:57.000000000 +0100
++++ sendlib.c 2005-05-25 18:20:57.000000000 +0200
+@@ -2341,6 +2341,35 @@
+ }
+ }
+
++/* given a list of addresses, return a list of reverse_alias'ed addresses */
++ADDRESS *mutt_reverse_address (ADDRESS *addr)
++{
++ ADDRESS *top,*tmp,*alias;
++
++ if (addr == NULL)
++ return NULL;
++
++ if ((alias = alias_reverse_lookup (addr)) && alias->personal) {
++ tmp = rfc822_cpy_adr_real(alias);
++ tmp->next = addr->next;
++ addr->next = NULL;
++ rfc822_free_address(&addr);
++ addr = tmp;
++ }
++
++ for (top = addr; top->next != NULL; top = tmp) {
++ tmp = top->next;
++ if ((alias = alias_reverse_lookup (tmp)) && alias->personal) {
++ top->next = rfc822_cpy_adr_real(alias);
++ top->next->next = tmp->next;
++ tmp->next = NULL;
++ rfc822_free_address(&tmp);
++ tmp = top->next;
++ }
++ }
++ return addr;
++}
++
+ int mutt_write_fcc (const char *path, HEADER *hdr, const char *msgid, int post, char *fcc)
+ {
+ CONTEXT f;
diff --git a/mail/mutt/files/extra-patch-sidebar b/mail/mutt/files/extra-patch-sidebar
new file mode 100644
index 000000000000..eeb4a4940bc3
--- /dev/null
+++ b/mail/mutt/files/extra-patch-sidebar
@@ -0,0 +1,1603 @@
+--- orig/buffy.c.orig 2010-09-18 14:12:40.000000000 +0200
++++ new/buffy.c 2010-09-18 14:17:36.000000000 +0200
+@@ -161,6 +161,49 @@
+ }
+ }
+
++static int buffy_compare_name(const void *a, const void *b) {
++ const BUFFY *b1 = * (BUFFY * const *) a;
++ const BUFFY *b2 = * (BUFFY * const *) b;
++
++ return mutt_strcoll(b1->path, b2->path);
++}
++
++static BUFFY *buffy_sort(BUFFY *b)
++{
++ BUFFY *tmp = b;
++ int buffycount = 0;
++ BUFFY **ary;
++ int i;
++
++ if (!option(OPTSIDEBARSORT))
++ return b;
++
++ for (; tmp != NULL; tmp = tmp->next)
++ buffycount++;
++
++ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary));
++
++ tmp = b;
++ for (i = 0; tmp != NULL; tmp = tmp->next, i++) {
++ ary[i] = tmp;
++ }
++
++ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name);
++
++ for (i = 0; i < buffycount - 1; i++) {
++ ary[i]->next = ary[i+1];
++ }
++ ary[buffycount - 1]->next = NULL;
++ for (i = 1; i < buffycount; i++) {
++ ary[i]->prev = ary[i-1];
++ }
++ ary[0]->prev = NULL;
++
++ tmp = ary[0];
++ free(ary);
++ return tmp;
++}
++
+ BUFFY *mutt_find_mailbox (const char *path)
+ {
+ BUFFY *tmp = NULL;
+@@ -282,6 +325,7 @@
+ else
+ (*tmp)->size = 0;
+ }
++ Incoming = buffy_sort(Incoming);
+ return 0;
+ }
+
+@@ -371,12 +415,17 @@
+ return rc;
+ }
+
++#define STAT_CHECK_SIZE (sb.st_size > tmp->size)
++#define STAT_CHECK_TIME (sb.st_mtime > sb.st_atime || (tmp->newly_created && sb.st_ctime == sb.st_mtime && sb.st_ctime == sb.st_atime))
++#define STAT_CHECK (option(OPTCHECKMBOXSIZE) ? STAT_CHECK_SIZE : STAT_CHECK_TIME)
++
+ int mutt_buffy_check (int force)
+ {
+ BUFFY *tmp;
+ struct stat sb;
+ struct stat contex_sb;
+ time_t t;
++ CONTEXT *ctx;
+
+ sb.st_size=0;
+ contex_sb.st_dev=0;
+@@ -416,6 +465,8 @@
+
+ for (tmp = Incoming; tmp; tmp = tmp->next)
+ {
++ if ( tmp->new == 1 )
++ tmp->has_new = 1;
+ if (tmp->magic != M_IMAP)
+ {
+ tmp->new = 0;
+@@ -455,18 +506,122 @@
+ {
+ case M_MBOX:
+ case M_MMDF:
+- if (buffy_mbox_hasnew (tmp, &sb) > 0)
+- BuffyCount++;
+- break;
++ {
++ if (STAT_CHECK || tmp->msgcount == 0)
++ {
++ BUFFY b = *tmp;
++ int msgcount = 0;
++ int msg_unread = 0;
++ /* parse the mailbox, to see how much mail there is */
++ ctx = mx_open_mailbox( tmp->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL);
++ if(ctx)
++ {
++ msgcount = ctx->msgcount;
++ msg_unread = ctx->unread;
++ mx_close_mailbox(ctx, 0);
++ }
++ *tmp = b;
++ tmp->msgcount = msgcount;
++ tmp->msg_unread = msg_unread;
++ if(STAT_CHECK) {
++ tmp->has_new = tmp->new = 1;
++ BuffyCount++;
++ }
++ }
++ else if (option(OPTCHECKMBOXSIZE))
++ {
++ /* some other program has deleted mail from the folder */
++ tmp->size = (off_t) sb.st_size;
++ }
++ if (tmp->newly_created &&
++ (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
++ tmp->newly_created = 0;
++ }
++ break;
++
+
+ case M_MAILDIR:
+- if (buffy_maildir_hasnew (tmp) > 0)
+- BuffyCount++;
++ {
++ char path[_POSIX_PATH_MAX];
++ DIR *dirp;
++ struct dirent *de;
++ /* count new message */
++ snprintf (path, sizeof (path), "%s/new", tmp->path);
++ if ((dirp = opendir (path)) == NULL)
++ {
++ tmp->magic = 0;
++ break;
++ }
++ tmp->msgcount = 0;
++ tmp->msg_unread = 0;
++ tmp->msg_flagged = 0;
++ while ((de = readdir (dirp)) != NULL)
++ {
++ char *p;
++ if (*de->d_name != '.' &&
++ (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
++ {
++ tmp->has_new = tmp->new = 1;
++ tmp->msgcount++;
++ tmp->msg_unread++;
++ }
++ }
++ if(tmp->msg_unread)
++ BuffyCount++;
++
++ closedir (dirp);
++
++ /*
++ * count read messages (for folderlist (sidebar) we also need to count
++ * messages in cur so that we the total number of messages
++ */
++ snprintf (path, sizeof (path), "%s/cur", tmp->path);
++ if ((dirp = opendir (path)) == NULL)
++ {
++ tmp->magic = 0;
++ break;
++ }
++ while ((de = readdir (dirp)) != NULL)
++ {
++ char *p;
++ if (*de->d_name != '.') {
++ if ((p = strstr (de->d_name, ":2,"))) {
++ if (!strchr (p + 3, 'T')) {
++ tmp->msgcount++;
++ if ( !strchr (p + 3, 'S'))
++ tmp->msg_unread++;
++ if (strchr(p + 3, 'F'))
++ tmp->msg_flagged++;
++ }
++ } else
++ tmp->msgcount++;
++ }
++ }
++ closedir (dirp);
++ }
+ break;
+
+ case M_MH:
+- if ((tmp->new = mh_buffy (tmp->path)) > 0)
+- BuffyCount++;
++ {
++ DIR *dp;
++ char path[_POSIX_PATH_MAX];
++ struct dirent *de;
++ if ((tmp->new = mh_buffy (tmp->path)) > 0)
++ BuffyCount++;
++
++ if ((dp = opendir (path)) == NULL)
++ break;
++ tmp->msgcount = 0;
++ while ((de = readdir (dp)))
++ {
++ if (mh_valid_message (de->d_name))
++ {
++ tmp->msgcount++;
++ tmp->has_new = tmp->new = 1;
++ }
++ }
++ closedir (dp);
++ }
+ break;
+ }
+ }
+*** mutt-1.5.20-orig/buffy.h 2009-04-30 00:36:16.000000000 -0500
+--- mutt-1.5.20-patched/buffy.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 25,31 ****
+--- 25,36 ----
+ char path[_POSIX_PATH_MAX];
+ off_t size;
+ struct buffy_t *next;
++ struct buffy_t *prev;
+ short new; /* mailbox has new mail */
++ short has_new; /* set it new if new and not read */
++ int msgcount; /* total number of messages */
++ int msg_unread; /* number of unread messages */
++ int msg_flagged; /* number of flagged messages */
+ short notified; /* user has been notified */
+ short magic; /* mailbox type */
+ short newly_created; /* mbox or mmdf just popped into existence */
+*** mutt-1.5.20-orig/color.c 2009-05-18 19:11:35.000000000 -0500
+--- mutt-1.5.20-patched/color.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 93,98 ****
+--- 93,100 ----
+ { "bold", MT_COLOR_BOLD },
+ { "underline", MT_COLOR_UNDERLINE },
+ { "index", MT_COLOR_INDEX },
++ { "sidebar_new", MT_COLOR_NEW },
++ { "sidebar_flagged", MT_COLOR_FLAGGED },
+ { NULL, 0 }
+ };
+
+*** mutt-1.5.20-orig/curs_main.c 2009-06-13 21:48:36.000000000 -0500
+--- mutt-1.5.20-patched/curs_main.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 26,32 ****
+--- 26,34 ----
+ #include "mailbox.h"
+ #include "mapping.h"
+ #include "sort.h"
++ #include "buffy.h"
+ #include "mx.h"
++ #include "sidebar.h"
+
+ #ifdef USE_POP
+ #include "pop.h"
+***************
+*** 523,530 ****
+ menu->redraw |= REDRAW_STATUS;
+ if (do_buffy_notify)
+ {
+! if (mutt_buffy_notify () && option (OPTBEEPNEW))
+! beep ();
+ }
+ else
+ do_buffy_notify = 1;
+--- 525,536 ----
+ menu->redraw |= REDRAW_STATUS;
+ if (do_buffy_notify)
+ {
+! if (mutt_buffy_notify ())
+! {
+! menu->redraw |= REDRAW_FULL;
+! if (option (OPTBEEPNEW))
+! beep ();
+! }
+ }
+ else
+ do_buffy_notify = 1;
+***************
+*** 536,541 ****
+--- 542,548 ----
+ if (menu->redraw & REDRAW_FULL)
+ {
+ menu_redraw_full (menu);
++ draw_sidebar(menu->menu);
+ mutt_show_error ();
+ }
+
+***************
+*** 558,567 ****
+--- 565,577 ----
+
+ if (menu->redraw & REDRAW_STATUS)
+ {
++ DrawFullLine = 1;
+ menu_status_line (buf, sizeof (buf), menu, NONULL (Status));
++ DrawFullLine = 0;
+ CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2);
+ SETCOLOR (MT_COLOR_STATUS);
+ BKGDSET (MT_COLOR_STATUS);
++ set_buffystats(Context);
+ mutt_paddstr (COLS, buf);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+***************
+*** 575,581 ****
+ menu->oldcurrent = -1;
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+--- 585,591 ----
+ menu->oldcurrent = -1;
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, SidebarWidth + 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+***************
+*** 1055,1060 ****
+--- 1065,1071 ----
+ menu->redraw = REDRAW_FULL;
+ break;
+
++ case OP_SIDEBAR_OPEN:
+ case OP_MAIN_CHANGE_FOLDER:
+ case OP_MAIN_NEXT_UNREAD_MAILBOX:
+
+***************
+*** 1086,1092 ****
+ {
+ mutt_buffy (buf, sizeof (buf));
+
+! if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1)
+ {
+ if (menu->menu == MENU_PAGER)
+ {
+--- 1097,1107 ----
+ {
+ mutt_buffy (buf, sizeof (buf));
+
+! if ( op == OP_SIDEBAR_OPEN ) {
+! if(!CurBuffy)
+! break;
+! strncpy( buf, CurBuffy->path, sizeof(buf) );
+! } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1)
+ {
+ if (menu->menu == MENU_PAGER)
+ {
+***************
+*** 1104,1109 ****
+--- 1119,1125 ----
+ }
+
+ mutt_expand_path (buf, sizeof (buf));
++ set_curbuffy(buf);
+ if (mx_get_magic (buf) <= 0)
+ {
+ mutt_error (_("%s is not a mailbox."), buf);
+***************
+*** 2183,2188 ****
+--- 2199,2210 ----
+ mutt_what_key();
+ break;
+
++ case OP_SIDEBAR_SCROLL_UP:
++ case OP_SIDEBAR_SCROLL_DOWN:
++ case OP_SIDEBAR_NEXT:
++ case OP_SIDEBAR_PREV:
++ scroll_sidebar(op, menu->menu);
++ break;
+ default:
+ if (menu->menu == MENU_MAIN)
+ km_error_key (MENU_MAIN);
+*** mutt-1.5.20-orig/flags.c 2008-12-16 21:50:09.000000000 -0600
+--- mutt-1.5.20-patched/flags.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 22,29 ****
+--- 22,31 ----
+
+ #include "mutt.h"
+ #include "mutt_curses.h"
++ #include "mutt_menu.h"
+ #include "sort.h"
+ #include "mx.h"
++ #include "sidebar.h"
+
+ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
+ {
+***************
+*** 263,268 ****
+--- 265,271 ----
+ */
+ if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged))
+ h->searched = 0;
++ draw_sidebar(0);
+ }
+
+ void mutt_tag_set_flag (int flag, int bf)
+*** mutt-1.5.20-orig/functions.h 2009-04-30 00:36:17.000000000 -0500
+--- mutt-1.5.20-patched/functions.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 168,173 ****
+--- 168,178 ----
+ { "decrypt-save", OP_DECRYPT_SAVE, NULL },
+
+
++ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL },
++ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL },
++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL },
++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL },
++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL },
+ { NULL, 0, NULL }
+ };
+
+***************
+*** 268,273 ****
+--- 273,283 ----
+
+ { "what-key", OP_WHAT_KEY, NULL },
+
++ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL },
++ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL },
++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL },
++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL },
++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL },
+ { NULL, 0, NULL }
+ };
+
+*** mutt-1.5.20-orig/globals.h 2009-06-03 15:48:31.000000000 -0500
+--- mutt-1.5.20-patched/globals.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 117,122 ****
+--- 117,123 ----
+ WHERE char *SendCharset;
+ WHERE char *Sendmail;
+ WHERE char *Shell;
++ WHERE char *SidebarDelim;
+ WHERE char *Signature;
+ WHERE char *SimpleSearch;
+ #if USE_SMTP
+***************
+*** 206,211 ****
+--- 207,215 ----
+ WHERE short ScoreThresholdRead;
+ WHERE short ScoreThresholdFlag;
+
++ WHERE struct buffy_t *CurBuffy INITVAL(0);
++ WHERE short DrawFullLine INITVAL(0);
++ WHERE short SidebarWidth;
+ #ifdef USE_IMAP
+ WHERE short ImapKeepalive;
+ WHERE short ImapPipelineDepth;
+*** mutt-1.5.20-orig/init.h 2009-06-13 16:35:21.000000000 -0500
+--- mutt-1.5.20-patched/init.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 1941,1946 ****
+--- 1941,1967 ----
+ ** not used.
+ ** (PGP only)
+ */
++ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, "|"},
++ /*
++ ** .pp
++ ** This specifies the delimiter between the sidebar (if visible) and
++ ** other screens.
++ */
++ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 },
++ /*
++ ** .pp
++ ** This specifies whether or not to show sidebar (left-side list of folders).
++ */
++ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 },
++ /*
++ ** .pp
++ ** This specifies whether or not to sort the sidebar alphabetically.
++ */
++ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 },
++ /*
++ ** .pp
++ ** The width of the sidebar.
++ */
+ { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0},
+ /*
+ ** .pp
+*** mutt-1.5.20-orig/mailbox.h 2009-04-30 00:36:17.000000000 -0500
+--- mutt-1.5.20-patched/mailbox.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 27,32 ****
+--- 27,33 ----
+ #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses
+ * safe_fopen() for mbox-style folders.
+ */
++ #define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */
+
+ /* mx_open_new_message() */
+ #define M_ADD_FROM 1 /* add a From_ line */
+--- orig/Makefile.am.orig 2010-09-18 13:23:19.000000000 +0200
++++ new/Makefile.am 2010-09-18 13:25:19.000000000 +0200
+@@ -34,7 +34,7 @@
+ score.c send.c sendlib.c signal.c sort.c \
+ status.c system.c thread.c charset.c history.c lib.c \
+ muttlib.c editmsg.c mbyte.c \
+- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c
++ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c
+
+ nodist_mutt_SOURCES = $(BUILT_SOURCES)
+
+--- orig/Makefile.in.orig 2010-09-18 13:23:19.000000000 +0200
++++ new/Makefile.in 2010-09-18 13:27:19.000000000 +0200
+@@ -89,7 +89,7 @@
+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \
+ history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \
+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \
+- ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT)
++ ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) sidebar.$(OBJEXT)
+ am__objects_1 =
+ am__objects_2 = patchlist.$(OBJEXT) $(am__objects_1)
+ nodist_mutt_OBJECTS = $(am__objects_2)
+@@ -363,7 +363,7 @@
+ score.c send.c sendlib.c signal.c sort.c \
+ status.c system.c thread.c charset.c history.c lib.c \
+ muttlib.c editmsg.c mbyte.c \
+- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c
++ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c
+
+ nodist_mutt_SOURCES = $(BUILT_SOURCES)
+ mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \
+@@ -397,7 +397,7 @@
+ README.SSL smime.h group.h \
+ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \
+ ChangeLog mkchangelog.sh mutt_idna.h \
+- snprintf.c regex.c crypt-gpgme.h hcachever.sh.in
++ snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in
+
+ EXTRA_SCRIPTS = smime_keys
+ mutt_dotlock_SOURCES = mutt_dotlock.c
+*** mutt-1.5.20-orig/mbox.c 2009-06-10 23:29:41.000000000 -0500
+--- mutt-1.5.20-patched/mbox.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 100,105 ****
+--- 100,106 ----
+ mutt_perror (ctx->path);
+ return (-1);
+ }
++ ctx->atime = sb.st_atime;
+ ctx->mtime = sb.st_mtime;
+ ctx->size = sb.st_size;
+
+***************
+*** 255,260 ****
+--- 256,262 ----
+
+ ctx->size = sb.st_size;
+ ctx->mtime = sb.st_mtime;
++ ctx->atime = sb.st_atime;
+
+ #ifdef NFS_ATTRIBUTE_HACK
+ if (sb.st_mtime > sb.st_atime)
+*** mutt-1.5.20-orig/menu.c 2009-06-01 11:29:32.000000000 -0500
+--- mutt-1.5.20-patched/menu.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 24,29 ****
+--- 24,30 ----
+ #include "mutt_curses.h"
+ #include "mutt_menu.h"
+ #include "mbyte.h"
++ #include "sidebar.h"
+
+ #include <string.h>
+ #include <stdlib.h>
+***************
+*** 156,162 ****
+ {
+ char *scratch = safe_strdup (s);
+ int shift = option (OPTARROWCURSOR) ? 3 : 0;
+! int cols = COLS - shift;
+
+ mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1);
+ s[n - 1] = 0;
+--- 157,163 ----
+ {
+ char *scratch = safe_strdup (s);
+ int shift = option (OPTARROWCURSOR) ? 3 : 0;
+! int cols = COLS - shift - SidebarWidth;
+
+ mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1);
+ s[n - 1] = 0;
+***************
+*** 207,212 ****
+--- 208,214 ----
+ char buf[LONG_STRING];
+ int i;
+
++ draw_sidebar(1);
+ for (i = menu->top; i < menu->top + menu->pagelen; i++)
+ {
+ if (i < menu->max)
+***************
+*** 217,223 ****
+ if (option (OPTARROWCURSOR))
+ {
+ attrset (menu->color (i));
+! CLEARLINE (i - menu->top + menu->offset);
+
+ if (i == menu->current)
+ {
+--- 219,225 ----
+ if (option (OPTARROWCURSOR))
+ {
+ attrset (menu->color (i));
+! CLEARLINE_WIN (i - menu->top + menu->offset);
+
+ if (i == menu->current)
+ {
+***************
+*** 246,259 ****
+ BKGDSET (MT_COLOR_INDICATOR);
+ }
+
+! CLEARLINE (i - menu->top + menu->offset);
+ print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+ }
+ }
+ else
+! CLEARLINE (i - menu->top + menu->offset);
+ }
+ menu->redraw = 0;
+ }
+--- 248,261 ----
+ BKGDSET (MT_COLOR_INDICATOR);
+ }
+
+! CLEARLINE_WIN (i - menu->top + menu->offset);
+ print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+ }
+ }
+ else
+! CLEARLINE_WIN (i - menu->top + menu->offset);
+ }
+ menu->redraw = 0;
+ }
+***************
+*** 268,274 ****
+ return;
+ }
+
+! move (menu->oldcurrent + menu->offset - menu->top, 0);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+
+--- 270,276 ----
+ return;
+ }
+
+! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+
+***************
+*** 283,295 ****
+ clrtoeol ();
+ menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
+ menu_pad_string (buf, sizeof (buf));
+! move (menu->oldcurrent + menu->offset - menu->top, 3);
+ print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1);
+ SETCOLOR (MT_COLOR_NORMAL);
+ }
+
+ /* now draw it in the new location */
+! move (menu->current + menu->offset - menu->top, 0);
+ attrset (menu->color (menu->current));
+ ADDCOLOR (MT_COLOR_INDICATOR);
+ addstr ("->");
+--- 285,297 ----
+ clrtoeol ();
+ menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
+ menu_pad_string (buf, sizeof (buf));
+! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3);
+ print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1);
+ SETCOLOR (MT_COLOR_NORMAL);
+ }
+
+ /* now draw it in the new location */
+! move (menu->current + menu->offset - menu->top, SidebarWidth);
+ attrset (menu->color (menu->current));
+ ADDCOLOR (MT_COLOR_INDICATOR);
+ addstr ("->");
+***************
+*** 310,316 ****
+ attrset (menu->color (menu->current));
+ ADDCOLOR (MT_COLOR_INDICATOR);
+ BKGDSET (MT_COLOR_INDICATOR);
+! CLEARLINE (menu->current - menu->top + menu->offset);
+ print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+--- 312,318 ----
+ attrset (menu->color (menu->current));
+ ADDCOLOR (MT_COLOR_INDICATOR);
+ BKGDSET (MT_COLOR_INDICATOR);
+! CLEARLINE_WIN (menu->current - menu->top + menu->offset);
+ print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+***************
+*** 322,328 ****
+ {
+ char buf[LONG_STRING];
+
+! move (menu->current + menu->offset - menu->top, 0);
+ menu_make_entry (buf, sizeof (buf), menu, menu->current);
+ menu_pad_string (buf, sizeof (buf));
+
+--- 324,330 ----
+ {
+ char buf[LONG_STRING];
+
+! move (menu->current + menu->offset - menu->top, SidebarWidth);
+ menu_make_entry (buf, sizeof (buf), menu, menu->current);
+ menu_pad_string (buf, sizeof (buf));
+
+***************
+*** 876,882 ****
+
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+--- 878,884 ----
+
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, SidebarWidth + 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+*** mutt-1.5.20-orig/mutt_curses.h 2008-11-11 13:55:47.000000000 -0600
+--- mutt-1.5.20-patched/mutt_curses.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 64,69 ****
+--- 64,70 ----
+ #undef lines
+ #endif /* lines */
+
++ #define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol()
+ #define CLEARLINE(x) move(x,0), clrtoeol()
+ #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x)
+ #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0)
+***************
+*** 126,131 ****
+--- 127,134 ----
+ MT_COLOR_BOLD,
+ MT_COLOR_UNDERLINE,
+ MT_COLOR_INDEX,
++ MT_COLOR_NEW,
++ MT_COLOR_FLAGGED,
+ MT_COLOR_MAX
+ };
+
+*** mutt-1.5.20-orig/mutt.h 2009-06-12 17:15:42.000000000 -0500
+--- mutt-1.5.20-patched/mutt.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 418,423 ****
+--- 418,425 ----
+ OPTSAVEEMPTY,
+ OPTSAVENAME,
+ OPTSCORE,
++ OPTSIDEBAR,
++ OPTSIDEBARSORT,
+ OPTSIGDASHES,
+ OPTSIGONTOP,
+ OPTSORTRE,
+***************
+*** 854,859 ****
+--- 856,862 ----
+ {
+ char *path;
+ FILE *fp;
++ time_t atime;
+ time_t mtime;
+ off_t size;
+ off_t vsize;
+***************
+*** 888,893 ****
+--- 891,897 ----
+ unsigned int quiet : 1; /* inhibit status messages? */
+ unsigned int collapsed : 1; /* are all threads collapsed? */
+ unsigned int closing : 1; /* mailbox is being closed */
++ unsigned int peekonly : 1; /* just taking a glance, revert atime */
+
+ /* driver hooks */
+ void *data; /* driver specific data */
+*** mutt-1.5.20-orig/muttlib.c 2009-05-18 19:11:35.000000000 -0500
+--- mutt-1.5.20-patched/muttlib.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 1232,1237 ****
+--- 1232,1239 ----
+ pl = pw = 1;
+
+ /* see if there's room to add content, else ignore */
++ if ( DrawFullLine )
++ {
+ if ((col < COLS && wlen < destlen) || soft)
+ {
+ int pad;
+***************
+*** 1274,1279 ****
+--- 1276,1327 ----
+ col += wid;
+ src += pl;
+ }
++ }
++ else
++ {
++ if ((col < COLS-SidebarWidth && wlen < destlen) || soft)
++ {
++ int pad;
++
++ /* get contents after padding */
++ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags);
++ len = mutt_strlen (buf);
++ wid = mutt_strwidth (buf);
++
++ /* try to consume as many columns as we can, if we don't have
++ * memory for that, use as much memory as possible */
++ pad = (COLS - SidebarWidth - col - wid) / pw;
++ if (pad > 0 && wlen + (pad * pl) + len > destlen)
++ pad = ((signed)(destlen - wlen - len)) / pl;
++ if (pad > 0)
++ {
++ while (pad--)
++ {
++ memcpy (wptr, src, pl);
++ wptr += pl;
++ wlen += pl;
++ col += pw;
++ }
++ }
++ else if (soft && pad < 0)
++ {
++ /* \0-terminate dest for length computation in mutt_wstr_trunc() */
++ *wptr = 0;
++ /* make sure right part is at most as wide as display */
++ len = mutt_wstr_trunc (buf, destlen, COLS, &wid);
++ /* truncate left so that right part fits completely in */
++ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col);
++ wptr = dest + wlen;
++ }
++ if (len + wlen > destlen)
++ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL);
++ memcpy (wptr, buf, len);
++ wptr += len;
++ wlen += len;
++ col += wid;
++ src += pl;
++ }
++ }
+ break; /* skip rest of input */
+ }
+ else if (ch == '|')
+*** mutt-1.5.20-orig/mx.c 2009-06-10 23:29:41.000000000 -0500
+--- mutt-1.5.20-patched/mx.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 581,586 ****
+--- 581,587 ----
+ * M_APPEND open mailbox for appending
+ * M_READONLY open mailbox in read-only mode
+ * M_QUIET only print error messages
++ * M_PEEK revert atime where applicable
+ * ctx if non-null, context struct to use
+ */
+ CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx)
+***************
+*** 603,608 ****
+--- 604,611 ----
+ ctx->quiet = 1;
+ if (flags & M_READONLY)
+ ctx->readonly = 1;
++ if (flags & M_PEEK)
++ ctx->peekonly = 1;
+
+ if (flags & (M_APPEND|M_NEWFOLDER))
+ {
+***************
+*** 702,710 ****
+--- 705,725 ----
+ void mx_fastclose_mailbox (CONTEXT *ctx)
+ {
+ int i;
++ #ifndef BUFFY_SIZE
++ struct utimbuf ut;
++ #endif
+
+ if(!ctx)
+ return;
++ #ifndef BUFFY_SIZE
++ /* fix up the times so buffy won't get confused */
++ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime)
++ {
++ ut.actime = ctx->atime;
++ ut.modtime = ctx->mtime;
++ utime (ctx->path, &ut);
++ }
++ #endif
+
+ if (ctx->mx_close)
+ ctx->mx_close (ctx);
+*** mutt-1.5.20-orig/OPS 2009-05-13 00:01:13.000000000 -0500
+--- mutt-1.5.20-patched/OPS 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 178,180 ****
+--- 178,185 ----
+ OP_MAIN_SHOW_LIMIT "show currently active limit pattern"
+ OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread"
+ OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads"
++ OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page"
++ OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page"
++ OP_SIDEBAR_NEXT "go down to next mailbox"
++ OP_SIDEBAR_PREV "go to previous mailbox"
++ OP_SIDEBAR_OPEN "open hilighted mailbox"
+--- orig/pager.c.orig 2010-09-18 13:23:19.000000000 +0200
++++ new/pager.c 2010-09-18 14:03:08.000000000 +0200
+@@ -29,6 +29,7 @@
+ #include "pager.h"
+ #include "attach.h"
+ #include "mbyte.h"
++#include "sidebar.h"
+
+ #include "mutt_crypt.h"
+
+@@ -1104,6 +1105,7 @@
+ if (check_attachment_marker ((char *)buf) == 0)
+ wrap_cols = COLS;
+
++ wrap_cols -= SidebarWidth;
+ /* FIXME: this should come from lineInfo */
+ memset(&mbstate, 0, sizeof(mbstate));
+
+@@ -1778,7 +1780,7 @@
+ if ((redraw & REDRAW_BODY) || topline != oldtopline)
+ {
+ do {
+- move (bodyoffset, 0);
++ move (bodyoffset, SidebarWidth);
+ curline = oldtopline = topline;
+ lines = 0;
+ force_redraw = 0;
+@@ -1791,6 +1793,7 @@
+ &QuoteList, &q_level, &force_redraw, &SearchRE) > 0)
+ lines++;
+ curline++;
++ move(lines + bodyoffset, SidebarWidth);
+ }
+ last_offset = lineInfo[curline].offset;
+ } while (force_redraw);
+@@ -1804,6 +1807,7 @@
+ addch ('~');
+ addch ('\n');
+ lines++;
++ move(lines + bodyoffset, SidebarWidth);
+ }
+ /* We are going to update the pager status bar, so it isn't
+ * necessary to reset to normal color now. */
+@@ -1827,21 +1831,21 @@
+ /* print out the pager status bar */
+ SETCOLOR (MT_COLOR_STATUS);
+ BKGDSET (MT_COLOR_STATUS);
+- CLEARLINE (statusoffset);
++ CLEARLINE_WIN (statusoffset);
+
+ if (IsHeader (extra) || IsMsgAttach (extra))
+ {
+- size_t l1 = COLS * MB_LEN_MAX;
++ size_t l1 = (COLS-SidebarWidth) * MB_LEN_MAX;
+ size_t l2 = sizeof (buffer);
+ hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr;
+ mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT);
+- mutt_paddstr (COLS, buffer);
++ mutt_paddstr (COLS-SidebarWidth, buffer);
+ }
+ else
+ {
+ char bn[STRING];
+ snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str);
+- mutt_paddstr (COLS, bn);
++ mutt_paddstr (COLS-SidebarWidth, bn);
+ }
+ BKGDSET (MT_COLOR_NORMAL);
+ SETCOLOR (MT_COLOR_NORMAL);
+@@ -1852,18 +1856,23 @@
+ /* redraw the pager_index indicator, because the
+ * flags for this message might have changed. */
+ menu_redraw_current (index);
++ draw_sidebar(MENU_PAGER);
+
+ /* print out the index status bar */
+ menu_status_line (buffer, sizeof (buffer), index, NONULL(Status));
+
+- move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0);
++ move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), SidebarWidth);
+ SETCOLOR (MT_COLOR_STATUS);
+ BKGDSET (MT_COLOR_STATUS);
+- mutt_paddstr (COLS, buffer);
++ mutt_paddstr (COLS-SidebarWidth, buffer);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+ }
+
++ /* if we're not using the index, update every time */
++ if ( index == 0 )
++ draw_sidebar(MENU_PAGER);
++
+ redraw = 0;
+
+ if (option(OPTBRAILLEFRIENDLY)) {
+@@ -2852,6 +2861,13 @@
+ mutt_what_key ();
+ break;
+
++ case OP_SIDEBAR_SCROLL_UP:
++ case OP_SIDEBAR_SCROLL_DOWN:
++ case OP_SIDEBAR_NEXT:
++ case OP_SIDEBAR_PREV:
++ scroll_sidebar(ch, MENU_PAGER);
++ break;
++
+ default:
+ ch = -1;
+ break;
+*** mutt-1.5.20-orig/PATCHES 2008-11-11 13:55:46.000000000 -0600
+--- mutt-1.5.20-patched/PATCHES 2009-06-19 22:20:31.000000000 -0500
+***************
+*** 0 ****
+--- 1 ----
++ patch-1.5.20.sidebar.20090619.txt
+*** mutt-1.5.20-orig/sidebar.c 1969-12-31 18:00:00.000000000 -0600
+--- mutt-1.5.20-patched/sidebar.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 0 ****
+--- 1,333 ----
++ /*
++ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu>
++ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
++ */
++
++
++ #if HAVE_CONFIG_H
++ # include "config.h"
++ #endif
++
++ #include "mutt.h"
++ #include "mutt_menu.h"
++ #include "mutt_curses.h"
++ #include "sidebar.h"
++ #include "buffy.h"
++ #include <libgen.h>
++ #include "keymap.h"
++ #include <stdbool.h>
++
++ /*BUFFY *CurBuffy = 0;*/
++ static BUFFY *TopBuffy = 0;
++ static BUFFY *BottomBuffy = 0;
++ static int known_lines = 0;
++
++ static int quick_log10(int n)
++ {
++ char string[32];
++ sprintf(string, "%d", n);
++ return strlen(string);
++ }
++
++ void calc_boundaries (int menu)
++ {
++ BUFFY *tmp = Incoming;
++
++ if ( known_lines != LINES ) {
++ TopBuffy = BottomBuffy = 0;
++ known_lines = LINES;
++ }
++ for ( ; tmp->next != 0; tmp = tmp->next )
++ tmp->next->prev = tmp;
++
++ if ( TopBuffy == 0 && BottomBuffy == 0 )
++ TopBuffy = Incoming;
++ if ( BottomBuffy == 0 ) {
++ int count = LINES - 2 - (menu != MENU_PAGER || option(OPTSTATUSONTOP));
++ BottomBuffy = TopBuffy;
++ while ( --count && BottomBuffy->next )
++ BottomBuffy = BottomBuffy->next;
++ }
++ else if ( TopBuffy == CurBuffy->next ) {
++ int count = LINES - 2 - (menu != MENU_PAGER);
++ BottomBuffy = CurBuffy;
++ tmp = BottomBuffy;
++ while ( --count && tmp->prev)
++ tmp = tmp->prev;
++ TopBuffy = tmp;
++ }
++ else if ( BottomBuffy == CurBuffy->prev ) {
++ int count = LINES - 2 - (menu != MENU_PAGER);
++ TopBuffy = CurBuffy;
++ tmp = TopBuffy;
++ while ( --count && tmp->next )
++ tmp = tmp->next;
++ BottomBuffy = tmp;
++ }
++ }
++
++ char *make_sidebar_entry(char *box, int size, int new, int flagged)
++ {
++ static char *entry = 0;
++ char *c;
++ int i = 0;
++ int delim_len = strlen(SidebarDelim);
++
++ c = realloc(entry, SidebarWidth - delim_len + 2);
++ if ( c ) entry = c;
++ entry[SidebarWidth - delim_len + 1] = 0;
++ for (; i < SidebarWidth - delim_len + 1; entry[i++] = ' ' );
++ i = strlen(box);
++ strncpy( entry, box, i < (SidebarWidth - delim_len + 1) ? i : (SidebarWidth - delim_len + 1) );
++
++ if (size == -1)
++ sprintf(entry + SidebarWidth - delim_len - 3, "?");
++ else if ( new ) {
++ if (flagged > 0) {
++ sprintf(
++ entry + SidebarWidth - delim_len - 5 - quick_log10(size) - quick_log10(new) - quick_log10(flagged),
++ "% d(%d)[%d]", size, new, flagged);
++ } else {
++ sprintf(
++ entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(new),
++ "% d(%d)", size, new);
++ }
++ } else if (flagged > 0) {
++ sprintf( entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(flagged), "% d[%d]", size, flagged);
++ } else {
++ sprintf( entry + SidebarWidth - delim_len - 1 - quick_log10(size), "% d", size);
++ }
++ return entry;
++ }
++
++ void set_curbuffy(char buf[LONG_STRING])
++ {
++ BUFFY* tmp = CurBuffy = Incoming;
++
++ if (!Incoming)
++ return;
++
++ while(1) {
++ if(!strcmp(tmp->path, buf)) {
++ CurBuffy = tmp;
++ break;
++ }
++
++ if(tmp->next)
++ tmp = tmp->next;
++ else
++ break;
++ }
++ }
++
++ int draw_sidebar(int menu) {
++
++ int lines = option(OPTHELP) ? 1 : 0;
++ BUFFY *tmp;
++ #ifndef USE_SLANG_CURSES
++ attr_t attrs;
++ #endif
++ short delim_len = strlen(SidebarDelim);
++ short color_pair;
++
++ static bool initialized = false;
++ static int prev_show_value;
++ static short saveSidebarWidth;
++
++ /* initialize first time */
++ if(!initialized) {
++ prev_show_value = option(OPTSIDEBAR);
++ saveSidebarWidth = SidebarWidth;
++ if(!option(OPTSIDEBAR)) SidebarWidth = 0;
++ initialized = true;
++ }
++
++ /* save or restore the value SidebarWidth */
++ if(prev_show_value != option(OPTSIDEBAR)) {
++ if(prev_show_value && !option(OPTSIDEBAR)) {
++ saveSidebarWidth = SidebarWidth;
++ SidebarWidth = 0;
++ } else if(!prev_show_value && option(OPTSIDEBAR)) {
++ SidebarWidth = saveSidebarWidth;
++ }
++ prev_show_value = option(OPTSIDEBAR);
++ }
++
++
++ // if ( SidebarWidth == 0 ) return 0;
++ if (SidebarWidth > 0 && option (OPTSIDEBAR)
++ && delim_len >= SidebarWidth) {
++ unset_option (OPTSIDEBAR);
++ /* saveSidebarWidth = SidebarWidth; */
++ if (saveSidebarWidth > delim_len) {
++ SidebarWidth = saveSidebarWidth;
++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar."));
++ sleep (2);
++ } else {
++ SidebarWidth = 0;
++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value."));
++ sleep (4); /* the advise to set a sane value should be seen long enough */
++ }
++ saveSidebarWidth = 0;
++ return (0);
++ }
++
++ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) {
++ if (SidebarWidth > 0) {
++ saveSidebarWidth = SidebarWidth;
++ SidebarWidth = 0;
++ }
++ unset_option(OPTSIDEBAR);
++ return 0;
++ }
++
++ /* get attributes for divider */
++ SETCOLOR(MT_COLOR_STATUS);
++ #ifndef USE_SLANG_CURSES
++ attr_get(&attrs, &color_pair, 0);
++ #else
++ color_pair = attr_get();
++ #endif
++ SETCOLOR(MT_COLOR_NORMAL);
++
++ /* draw the divider */
++
++ for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) {
++ move(lines, SidebarWidth - delim_len);
++ addstr(NONULL(SidebarDelim));
++ #ifndef USE_SLANG_CURSES
++ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL);
++ #endif
++ }
++
++ if ( Incoming == 0 ) return 0;
++ lines = option(OPTHELP) ? 1 : 0; /* go back to the top */
++
++ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 )
++ calc_boundaries(menu);
++ if ( CurBuffy == 0 ) CurBuffy = Incoming;
++
++ tmp = TopBuffy;
++
++ SETCOLOR(MT_COLOR_NORMAL);
++
++ for ( ; tmp && lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); tmp = tmp->next ) {
++ if ( tmp == CurBuffy )
++ SETCOLOR(MT_COLOR_INDICATOR);
++ else if ( tmp->msg_unread > 0 )
++ SETCOLOR(MT_COLOR_NEW);
++ else if ( tmp->msg_flagged > 0 )
++ SETCOLOR(MT_COLOR_FLAGGED);
++ else
++ SETCOLOR(MT_COLOR_NORMAL);
++
++ move( lines, 0 );
++ if ( Context && !strcmp( tmp->path, Context->path ) ) {
++ tmp->msg_unread = Context->unread;
++ tmp->msgcount = Context->msgcount;
++ tmp->msg_flagged = Context->flagged;
++ }
++ // check whether Maildir is a prefix of the current folder's path
++ short maildir_is_prefix = 0;
++ if ( (strlen(tmp->path) > strlen(Maildir)) &&
++ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) )
++ maildir_is_prefix = 1;
++ // calculate depth of current folder and generate its display name with indented spaces
++ int sidebar_folder_depth = 0;
++ char *sidebar_folder_name;
++ sidebar_folder_name = basename(tmp->path);
++ if ( maildir_is_prefix ) {
++ char *tmp_folder_name;
++ int i;
++ tmp_folder_name = tmp->path + strlen(Maildir);
++ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) {
++ if (tmp_folder_name[i] == '/') sidebar_folder_depth++;
++ }
++ if (sidebar_folder_depth > 0) {
++ sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1);
++ for (i=0; i < sidebar_folder_depth; i++)
++ sidebar_folder_name[i]=' ';
++ sidebar_folder_name[i]=0;
++ strncat(sidebar_folder_name, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth);
++ }
++ }
++ printw( "%.*s", SidebarWidth - delim_len + 1,
++ make_sidebar_entry(sidebar_folder_name, tmp->msgcount,
++ tmp->msg_unread, tmp->msg_flagged));
++ if (sidebar_folder_depth > 0)
++ free(sidebar_folder_name);
++ lines++;
++ }
++ SETCOLOR(MT_COLOR_NORMAL);
++ for ( ; lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) {
++ int i = 0;
++ move( lines, 0 );
++ for ( ; i < SidebarWidth - delim_len; i++ )
++ addch(' ');
++ }
++ return 0;
++ }
++
++
++ void set_buffystats(CONTEXT* Context)
++ {
++ BUFFY *tmp = Incoming;
++ while(tmp) {
++ if(Context && !strcmp(tmp->path, Context->path)) {
++ tmp->msg_unread = Context->unread;
++ tmp->msgcount = Context->msgcount;
++ break;
++ }
++ tmp = tmp->next;
++ }
++ }
++
++ void scroll_sidebar(int op, int menu)
++ {
++ if(!SidebarWidth) return;
++ if(!CurBuffy) return;
++
++ switch (op) {
++ case OP_SIDEBAR_NEXT:
++ if ( CurBuffy->next == NULL ) return;
++ CurBuffy = CurBuffy->next;
++ break;
++ case OP_SIDEBAR_PREV:
++ if ( CurBuffy->prev == NULL ) return;
++ CurBuffy = CurBuffy->prev;
++ break;
++ case OP_SIDEBAR_SCROLL_UP:
++ CurBuffy = TopBuffy;
++ if ( CurBuffy != Incoming ) {
++ calc_boundaries(menu);
++ CurBuffy = CurBuffy->prev;
++ }
++ break;
++ case OP_SIDEBAR_SCROLL_DOWN:
++ CurBuffy = BottomBuffy;
++ if ( CurBuffy->next ) {
++ calc_boundaries(menu);
++ CurBuffy = CurBuffy->next;
++ }
++ break;
++ default:
++ return;
++ }
++ calc_boundaries(menu);
++ draw_sidebar(menu);
++ }
++
+*** mutt-1.5.20-orig/sidebar.h 1969-12-31 18:00:00.000000000 -0600
+--- mutt-1.5.20-patched/sidebar.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 0 ****
+--- 1,36 ----
++ /*
++ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu>
++ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
++ */
++
++ #ifndef SIDEBAR_H
++ #define SIDEBAR_H
++
++ struct MBOX_LIST {
++ char *path;
++ int msgcount;
++ int new;
++ } MBLIST;
++
++ /* parameter is whether or not to go to the status line */
++ /* used for omitting the last | that covers up the status bar in the index */
++ int draw_sidebar(int);
++ void scroll_sidebar(int, int);
++ void set_curbuffy(char*);
++ void set_buffystats(CONTEXT*);
++
++ #endif /* SIDEBAR_H */
+*** mutt-1.5.20-orig/doc/Muttrc 2009-06-14 13:53:24.000000000 -0500
+--- mutt-1.5.20-patched/doc/Muttrc 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 657,662 ****
+--- 657,682 ----
+ # $crypt_autosign, $crypt_replysign and $smime_is_default.
+ #
+ #
++ # set sidebar_visible=no
++ #
++ # Name: sidebar_visible
++ # Type: boolean
++ # Default: no
++ #
++ #
++ # This specifies whether or not to show sidebar (left-side list of folders).
++ #
++ #
++ # set sidebar_width=0
++ #
++ # Name: sidebar_width
++ # Type: number
++ # Default: 0
++ #
++ #
++ # The width of the sidebar.
++ #
++ #
+ # set crypt_autosign=no
+ #
+ # Name: crypt_autosign
+*** mutt-1.5.20-orig/imap/imap.c 2009-06-14 12:19:16.000000000 -0500
+--- mutt-1.5.20-patched/imap/imap.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 1521,1527 ****
+
+ imap_munge_mbox_name (munged, sizeof (munged), name);
+ snprintf (command, sizeof (command),
+! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged);
+
+ if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0)
+ {
+--- 1521,1527 ----
+
+ imap_munge_mbox_name (munged, sizeof (munged), name);
+ snprintf (command, sizeof (command),
+! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged);
+
+ if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0)
+ {
+*** mutt-1.5.20-orig/imap/command.c 2009-01-05 20:58:31.000000000 -0600
+--- mutt-1.5.20-patched/imap/command.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 1009,1014 ****
+--- 1009,1021 ----
+ opened */
+ status->uidnext = oldun;
+
++ /* Added to make the sidebar show the correct numbers */
++ if (status->messages)
++ {
++ inc->msgcount = status->messages;
++ inc->msg_unread = status->unseen;
++ }
++
+ FREE (&value);
+ return;
+ }
+--- orig/compose.c.orig 2010-04-14 20:50:19.000000000 +0200
++++ new/compose.c 2010-09-18 15:29:09.000000000 +0200
+@@ -72,7 +72,7 @@
+
+ #define HDR_XOFFSET 10
+ #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */
+-#define W (COLS - HDR_XOFFSET)
++#define W (COLS - HDR_XOFFSET - SidebarWidth)
+
+ static char *Prompts[] =
+ {
+@@ -112,7 +112,7 @@
+ {
+ int off = 0;
+
+- mvaddstr (HDR_CRYPT, 0, "Security: ");
++ mvaddstr (HDR_CRYPT, SidebarWidth, "Security: ");
+
+ if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0)
+ {
+@@ -144,7 +144,7 @@
+ }
+
+ clrtoeol ();
+- move (HDR_CRYPTINFO, 0);
++ move (HDR_CRYPTINFO, SidebarWidth);
+ clrtoeol ();
+
+ if ((WithCrypto & APPLICATION_PGP)
+@@ -161,7 +161,7 @@
+ && (msg->security & ENCRYPT)
+ && SmimeCryptAlg
+ && *SmimeCryptAlg) {
+- mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "),
++ mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "),
+ NONULL(SmimeCryptAlg));
+ off = 20;
+ }
+@@ -190,7 +190,7 @@
+ if (t && t[0] == '0' && t[1] == '\0')
+ t = "<random>";
+
+- if (c + mutt_strlen (t) + 2 >= COLS)
++ if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth)
+ break;
+
+ addstr (NONULL(t));
+@@ -242,7 +242,7 @@
+
+ buf[0] = 0;
+ rfc822_write_address (buf, sizeof (buf), addr, 1);
+- mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]);
++ mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]);
+ mutt_paddstr (W, buf);
+ }
+
+@@ -252,10 +252,10 @@
+ draw_envelope_addr (HDR_TO, msg->env->to);
+ draw_envelope_addr (HDR_CC, msg->env->cc);
+ draw_envelope_addr (HDR_BCC, msg->env->bcc);
+- mvprintw (HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]);
++ mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]);
+ mutt_paddstr (W, NONULL (msg->env->subject));
+ draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to);
+- mvprintw (HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]);
++ mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]);
+ mutt_paddstr (W, fcc);
+
+ if (WithCrypto)
+@@ -266,7 +266,7 @@
+ #endif
+
+ SETCOLOR (MT_COLOR_STATUS);
+- mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments"));
++ mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments"));
+ BKGDSET (MT_COLOR_STATUS);
+ clrtoeol ();
+
+@@ -304,7 +304,7 @@
+ /* redraw the expanded list so the user can see the result */
+ buf[0] = 0;
+ rfc822_write_address (buf, sizeof (buf), *addr, 1);
+- move (line, HDR_XOFFSET);
++ move (line, HDR_XOFFSET+SidebarWidth);
+ mutt_paddstr (W, buf);
+
+ return 0;
+@@ -549,7 +549,7 @@
+ if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0)
+ {
+ mutt_str_replace (&msg->env->subject, buf);
+- move (HDR_SUBJECT, HDR_XOFFSET);
++ move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth);
+ clrtoeol ();
+ if (msg->env->subject)
+ mutt_paddstr (W, msg->env->subject);
+@@ -566,7 +566,7 @@
+ {
+ strfcpy (fcc, buf, fcclen);
+ mutt_pretty_mailbox (fcc, fcclen);
+- move (HDR_FCC, HDR_XOFFSET);
++ move (HDR_FCC, HDR_XOFFSET + SidebarWidth);
+ mutt_paddstr (W, fcc);
+ fccSet = 1;
+ }
diff --git a/mail/mutt/files/extra-patch-sidebar-nntp b/mail/mutt/files/extra-patch-sidebar-nntp
new file mode 100644
index 000000000000..8a118ed2c019
--- /dev/null
+++ b/mail/mutt/files/extra-patch-sidebar-nntp
@@ -0,0 +1,1616 @@
+--- orig/buffy.c.orig 2010-09-18 14:12:40.000000000 +0200
++++ new/buffy.c 2010-09-18 14:17:36.000000000 +0200
+@@ -161,6 +161,49 @@
+ }
+ }
+
++static int buffy_compare_name(const void *a, const void *b) {
++ const BUFFY *b1 = * (BUFFY * const *) a;
++ const BUFFY *b2 = * (BUFFY * const *) b;
++
++ return mutt_strcoll(b1->path, b2->path);
++}
++
++static BUFFY *buffy_sort(BUFFY *b)
++{
++ BUFFY *tmp = b;
++ int buffycount = 0;
++ BUFFY **ary;
++ int i;
++
++ if (!option(OPTSIDEBARSORT))
++ return b;
++
++ for (; tmp != NULL; tmp = tmp->next)
++ buffycount++;
++
++ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary));
++
++ tmp = b;
++ for (i = 0; tmp != NULL; tmp = tmp->next, i++) {
++ ary[i] = tmp;
++ }
++
++ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name);
++
++ for (i = 0; i < buffycount - 1; i++) {
++ ary[i]->next = ary[i+1];
++ }
++ ary[buffycount - 1]->next = NULL;
++ for (i = 1; i < buffycount; i++) {
++ ary[i]->prev = ary[i-1];
++ }
++ ary[0]->prev = NULL;
++
++ tmp = ary[0];
++ free(ary);
++ return tmp;
++}
++
+ BUFFY *mutt_find_mailbox (const char *path)
+ {
+ BUFFY *tmp = NULL;
+@@ -282,6 +325,7 @@
+ else
+ (*tmp)->size = 0;
+ }
++ Incoming = buffy_sort(Incoming);
+ return 0;
+ }
+
+@@ -371,12 +415,17 @@
+ return rc;
+ }
+
++#define STAT_CHECK_SIZE (sb.st_size > tmp->size)
++#define STAT_CHECK_TIME (sb.st_mtime > sb.st_atime || (tmp->newly_created && sb.st_ctime == sb.st_mtime && sb.st_ctime == sb.st_atime))
++#define STAT_CHECK (option(OPTCHECKMBOXSIZE) ? STAT_CHECK_SIZE : STAT_CHECK_TIME)
++
+ int mutt_buffy_check (int force)
+ {
+ BUFFY *tmp;
+ struct stat sb;
+ struct stat contex_sb;
+ time_t t;
++ CONTEXT *ctx;
+
+ sb.st_size=0;
+ contex_sb.st_dev=0;
+@@ -416,6 +465,8 @@
+
+ for (tmp = Incoming; tmp; tmp = tmp->next)
+ {
++ if ( tmp->new == 1 )
++ tmp->has_new = 1;
+ if (tmp->magic != M_IMAP)
+ {
+ tmp->new = 0;
+@@ -455,18 +506,122 @@
+ {
+ case M_MBOX:
+ case M_MMDF:
+- if (buffy_mbox_hasnew (tmp, &sb) > 0)
+- BuffyCount++;
+- break;
++ {
++ if (STAT_CHECK || tmp->msgcount == 0)
++ {
++ BUFFY b = *tmp;
++ int msgcount = 0;
++ int msg_unread = 0;
++ /* parse the mailbox, to see how much mail there is */
++ ctx = mx_open_mailbox( tmp->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL);
++ if(ctx)
++ {
++ msgcount = ctx->msgcount;
++ msg_unread = ctx->unread;
++ mx_close_mailbox(ctx, 0);
++ }
++ *tmp = b;
++ tmp->msgcount = msgcount;
++ tmp->msg_unread = msg_unread;
++ if(STAT_CHECK) {
++ tmp->has_new = tmp->new = 1;
++ BuffyCount++;
++ }
++ }
++ else if (option(OPTCHECKMBOXSIZE))
++ {
++ /* some other program has deleted mail from the folder */
++ tmp->size = (off_t) sb.st_size;
++ }
++ if (tmp->newly_created &&
++ (sb.st_ctime != sb.st_mtime || sb.st_ctime != sb.st_atime))
++ tmp->newly_created = 0;
++ }
++ break;
++
+
+ case M_MAILDIR:
+- if (buffy_maildir_hasnew (tmp) > 0)
+- BuffyCount++;
++ {
++ char path[_POSIX_PATH_MAX];
++ DIR *dirp;
++ struct dirent *de;
++ /* count new message */
++ snprintf (path, sizeof (path), "%s/new", tmp->path);
++ if ((dirp = opendir (path)) == NULL)
++ {
++ tmp->magic = 0;
++ break;
++ }
++ tmp->msgcount = 0;
++ tmp->msg_unread = 0;
++ tmp->msg_flagged = 0;
++ while ((de = readdir (dirp)) != NULL)
++ {
++ char *p;
++ if (*de->d_name != '.' &&
++ (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')))
++ {
++ tmp->has_new = tmp->new = 1;
++ tmp->msgcount++;
++ tmp->msg_unread++;
++ }
++ }
++ if(tmp->msg_unread)
++ BuffyCount++;
++
++ closedir (dirp);
++
++ /*
++ * count read messages (for folderlist (sidebar) we also need to count
++ * messages in cur so that we the total number of messages
++ */
++ snprintf (path, sizeof (path), "%s/cur", tmp->path);
++ if ((dirp = opendir (path)) == NULL)
++ {
++ tmp->magic = 0;
++ break;
++ }
++ while ((de = readdir (dirp)) != NULL)
++ {
++ char *p;
++ if (*de->d_name != '.') {
++ if ((p = strstr (de->d_name, ":2,"))) {
++ if (!strchr (p + 3, 'T')) {
++ tmp->msgcount++;
++ if ( !strchr (p + 3, 'S'))
++ tmp->msg_unread++;
++ if (strchr(p + 3, 'F'))
++ tmp->msg_flagged++;
++ }
++ } else
++ tmp->msgcount++;
++ }
++ }
++ closedir (dirp);
++ }
+ break;
+
+ case M_MH:
+- if ((tmp->new = mh_buffy (tmp->path)) > 0)
+- BuffyCount++;
++ {
++ DIR *dp;
++ char path[_POSIX_PATH_MAX];
++ struct dirent *de;
++ if ((tmp->new = mh_buffy (tmp->path)) > 0)
++ BuffyCount++;
++
++ if ((dp = opendir (path)) == NULL)
++ break;
++ tmp->msgcount = 0;
++ while ((de = readdir (dp)))
++ {
++ if (mh_valid_message (de->d_name))
++ {
++ tmp->msgcount++;
++ tmp->has_new = tmp->new = 1;
++ }
++ }
++ closedir (dp);
++ }
+ break;
+ }
+ }
+*** mutt-1.5.20-orig/buffy.h 2009-04-30 00:36:16.000000000 -0500
+--- mutt-1.5.20-patched/buffy.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 25,31 ****
+--- 25,36 ----
+ char path[_POSIX_PATH_MAX];
+ off_t size;
+ struct buffy_t *next;
++ struct buffy_t *prev;
+ short new; /* mailbox has new mail */
++ short has_new; /* set it new if new and not read */
++ int msgcount; /* total number of messages */
++ int msg_unread; /* number of unread messages */
++ int msg_flagged; /* number of flagged messages */
+ short notified; /* user has been notified */
+ short magic; /* mailbox type */
+ short newly_created; /* mbox or mmdf just popped into existence */
+*** mutt-1.5.20-orig/color.c 2009-05-18 19:11:35.000000000 -0500
+--- mutt-1.5.20-patched/color.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 93,98 ****
+--- 93,100 ----
+ { "bold", MT_COLOR_BOLD },
+ { "underline", MT_COLOR_UNDERLINE },
+ { "index", MT_COLOR_INDEX },
++ { "sidebar_new", MT_COLOR_NEW },
++ { "sidebar_flagged", MT_COLOR_FLAGGED },
+ { NULL, 0 }
+ };
+
+*** mutt-1.5.20-orig/curs_main.c 2009-06-13 21:48:36.000000000 -0500
+--- mutt-1.5.20-patched/curs_main.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 26,32 ****
+--- 26,34 ----
+ #include "mailbox.h"
+ #include "mapping.h"
+ #include "sort.h"
++ #include "buffy.h"
+ #include "mx.h"
++ #include "sidebar.h"
+
+ #ifdef USE_POP
+ #include "pop.h"
+***************
+*** 523,530 ****
+ menu->redraw |= REDRAW_STATUS;
+ if (do_buffy_notify)
+ {
+! if (mutt_buffy_notify () && option (OPTBEEPNEW))
+! beep ();
+ }
+ else
+ do_buffy_notify = 1;
+--- 525,536 ----
+ menu->redraw |= REDRAW_STATUS;
+ if (do_buffy_notify)
+ {
+! if (mutt_buffy_notify ())
+! {
+! menu->redraw |= REDRAW_FULL;
+! if (option (OPTBEEPNEW))
+! beep ();
+! }
+ }
+ else
+ do_buffy_notify = 1;
+***************
+*** 536,541 ****
+--- 542,548 ----
+ if (menu->redraw & REDRAW_FULL)
+ {
+ menu_redraw_full (menu);
++ draw_sidebar(menu->menu);
+ mutt_show_error ();
+ }
+
+***************
+*** 558,567 ****
+--- 565,577 ----
+
+ if (menu->redraw & REDRAW_STATUS)
+ {
++ DrawFullLine = 1;
+ menu_status_line (buf, sizeof (buf), menu, NONULL (Status));
++ DrawFullLine = 0;
+ CLEARLINE (option (OPTSTATUSONTOP) ? 0 : LINES-2);
+ SETCOLOR (MT_COLOR_STATUS);
+ BKGDSET (MT_COLOR_STATUS);
++ set_buffystats(Context);
+ mutt_paddstr (COLS, buf);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+***************
+*** 575,581 ****
+ menu->oldcurrent = -1;
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+--- 585,591 ----
+ menu->oldcurrent = -1;
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, SidebarWidth + 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+***************
+*** 1055,1060 ****
+--- 1065,1071 ----
+ menu->redraw = REDRAW_FULL;
+ break;
+
++ case OP_SIDEBAR_OPEN:
+ case OP_MAIN_CHANGE_FOLDER:
+ case OP_MAIN_NEXT_UNREAD_MAILBOX:
+
+***************
+*** 1086,1092 ****
+ {
+ mutt_buffy (buf, sizeof (buf));
+
+! if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1)
+ {
+ if (menu->menu == MENU_PAGER)
+ {
+--- 1097,1107 ----
+ {
+ mutt_buffy (buf, sizeof (buf));
+
+! if ( op == OP_SIDEBAR_OPEN ) {
+! if(!CurBuffy)
+! break;
+! strncpy( buf, CurBuffy->path, sizeof(buf) );
+! } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1)
+ {
+ if (menu->menu == MENU_PAGER)
+ {
+***************
+*** 1104,1109 ****
+--- 1119,1125 ----
+ }
+
+ mutt_expand_path (buf, sizeof (buf));
++ set_curbuffy(buf);
+ if (mx_get_magic (buf) <= 0)
+ {
+ mutt_error (_("%s is not a mailbox."), buf);
+***************
+*** 2183,2188 ****
+--- 2199,2210 ----
+ mutt_what_key();
+ break;
+
++ case OP_SIDEBAR_SCROLL_UP:
++ case OP_SIDEBAR_SCROLL_DOWN:
++ case OP_SIDEBAR_NEXT:
++ case OP_SIDEBAR_PREV:
++ scroll_sidebar(op, menu->menu);
++ break;
+ default:
+ if (menu->menu == MENU_MAIN)
+ km_error_key (MENU_MAIN);
+*** mutt-1.5.20-orig/flags.c 2008-12-16 21:50:09.000000000 -0600
+--- mutt-1.5.20-patched/flags.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 22,29 ****
+--- 22,31 ----
+
+ #include "mutt.h"
+ #include "mutt_curses.h"
++ #include "mutt_menu.h"
+ #include "sort.h"
+ #include "mx.h"
++ #include "sidebar.h"
+
+ void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx)
+ {
+***************
+*** 263,268 ****
+--- 265,271 ----
+ */
+ if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged))
+ h->searched = 0;
++ draw_sidebar(0);
+ }
+
+ void mutt_tag_set_flag (int flag, int bf)
+*** mutt-1.5.20-orig/functions.h 2009-04-30 00:36:17.000000000 -0500
+--- mutt-1.5.20-patched/functions.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 168,173 ****
+--- 168,178 ----
+ { "decrypt-save", OP_DECRYPT_SAVE, NULL },
+
+
++ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL },
++ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL },
++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL },
++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL },
++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL },
+ { NULL, 0, NULL }
+ };
+
+***************
+*** 268,273 ****
+--- 273,283 ----
+
+ { "what-key", OP_WHAT_KEY, NULL },
+
++ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL },
++ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL },
++ { "sidebar-next", OP_SIDEBAR_NEXT, NULL },
++ { "sidebar-prev", OP_SIDEBAR_PREV, NULL },
++ { "sidebar-open", OP_SIDEBAR_OPEN, NULL },
+ { NULL, 0, NULL }
+ };
+
+*** mutt-1.5.20-orig/globals.h 2009-06-03 15:48:31.000000000 -0500
+--- mutt-1.5.20-patched/globals.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 117,122 ****
+--- 117,123 ----
+ WHERE char *SendCharset;
+ WHERE char *Sendmail;
+ WHERE char *Shell;
++ WHERE char *SidebarDelim;
+ WHERE char *Signature;
+ WHERE char *SimpleSearch;
+ #if USE_SMTP
+***************
+*** 206,211 ****
+--- 207,215 ----
+ WHERE short ScoreThresholdRead;
+ WHERE short ScoreThresholdFlag;
+
++ WHERE struct buffy_t *CurBuffy INITVAL(0);
++ WHERE short DrawFullLine INITVAL(0);
++ WHERE short SidebarWidth;
+ #ifdef USE_IMAP
+ WHERE short ImapKeepalive;
+ WHERE short ImapPipelineDepth;
+*** mutt-1.5.20-orig/init.h 2009-06-13 16:35:21.000000000 -0500
+--- mutt-1.5.20-patched/init.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 1941,1946 ****
+--- 1941,1967 ----
+ ** not used.
+ ** (PGP only)
+ */
++ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, "|"},
++ /*
++ ** .pp
++ ** This specifies the delimiter between the sidebar (if visible) and
++ ** other screens.
++ */
++ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 },
++ /*
++ ** .pp
++ ** This specifies whether or not to show sidebar (left-side list of folders).
++ */
++ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 },
++ /*
++ ** .pp
++ ** This specifies whether or not to sort the sidebar alphabetically.
++ */
++ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 },
++ /*
++ ** .pp
++ ** The width of the sidebar.
++ */
+ { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0},
+ /*
+ ** .pp
+*** mutt-1.5.20-orig/mailbox.h 2009-04-30 00:36:17.000000000 -0500
+--- mutt-1.5.20-patched/mailbox.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 27,32 ****
+--- 27,33 ----
+ #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses
+ * safe_fopen() for mbox-style folders.
+ */
++ #define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */
+
+ /* mx_open_new_message() */
+ #define M_ADD_FROM 1 /* add a From_ line */
+--- orig/Makefile.am.orig 2010-09-18 13:23:19.000000000 +0200
++++ new/Makefile.am 2010-09-18 13:25:19.000000000 +0200
+@@ -34,7 +34,7 @@
+ score.c send.c sendlib.c signal.c sort.c \
+ status.c system.c thread.c charset.c history.c lib.c \
+ muttlib.c editmsg.c mbyte.c \
+- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c
++ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c
+
+ nodist_mutt_SOURCES = $(BUILT_SOURCES)
+
+--- orig/Makefile.in.orig 2010-09-18 13:23:19.000000000 +0200
++++ new/Makefile.in 2010-09-18 13:27:19.000000000 +0200
+@@ -89,7 +89,7 @@
+ system.$(OBJEXT) thread.$(OBJEXT) charset.$(OBJEXT) \
+ history.$(OBJEXT) lib.$(OBJEXT) muttlib.$(OBJEXT) \
+ editmsg.$(OBJEXT) mbyte.$(OBJEXT) url.$(OBJEXT) \
+- ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT)
++ ascii.$(OBJEXT) crypt-mod.$(OBJEXT) safe_asprintf.$(OBJEXT) sidebar.$(OBJEXT)
+ am__objects_1 =
+ am__objects_2 = patchlist.$(OBJEXT) $(am__objects_1)
+ nodist_mutt_OBJECTS = $(am__objects_2)
+@@ -363,7 +363,7 @@
+ score.c send.c sendlib.c signal.c sort.c \
+ status.c system.c thread.c charset.c history.c lib.c \
+ muttlib.c editmsg.c mbyte.c \
+- url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c
++ url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c sidebar.c
+
+ nodist_mutt_SOURCES = $(BUILT_SOURCES)
+ mutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ $(LIBIMAP) $(MUTTLIBS) \
+@@ -397,7 +397,7 @@
+ README.SSL smime.h group.h \
+ muttbug pgppacket.h depcomp ascii.h BEWARE PATCHES patchlist.sh \
+ ChangeLog mkchangelog.sh mutt_idna.h \
+- snprintf.c regex.c crypt-gpgme.h hcachever.sh.in
++ snprintf.c regex.c crypt-gpgme.h sidebar.h hcachever.sh.in
+
+ EXTRA_SCRIPTS = smime_keys
+ mutt_dotlock_SOURCES = mutt_dotlock.c
+*** mutt-1.5.20-orig/mbox.c 2009-06-10 23:29:41.000000000 -0500
+--- mutt-1.5.20-patched/mbox.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 100,105 ****
+--- 100,106 ----
+ mutt_perror (ctx->path);
+ return (-1);
+ }
++ ctx->atime = sb.st_atime;
+ ctx->mtime = sb.st_mtime;
+ ctx->size = sb.st_size;
+
+***************
+*** 255,260 ****
+--- 256,262 ----
+
+ ctx->size = sb.st_size;
+ ctx->mtime = sb.st_mtime;
++ ctx->atime = sb.st_atime;
+
+ #ifdef NFS_ATTRIBUTE_HACK
+ if (sb.st_mtime > sb.st_atime)
+*** mutt-1.5.20-orig/menu.c 2009-06-01 11:29:32.000000000 -0500
+--- mutt-1.5.20-patched/menu.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 24,29 ****
+--- 24,30 ----
+ #include "mutt_curses.h"
+ #include "mutt_menu.h"
+ #include "mbyte.h"
++ #include "sidebar.h"
+
+ #include <string.h>
+ #include <stdlib.h>
+***************
+*** 156,162 ****
+ {
+ char *scratch = safe_strdup (s);
+ int shift = option (OPTARROWCURSOR) ? 3 : 0;
+! int cols = COLS - shift;
+
+ mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1);
+ s[n - 1] = 0;
+--- 157,163 ----
+ {
+ char *scratch = safe_strdup (s);
+ int shift = option (OPTARROWCURSOR) ? 3 : 0;
+! int cols = COLS - shift - SidebarWidth;
+
+ mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1);
+ s[n - 1] = 0;
+***************
+*** 207,212 ****
+--- 208,214 ----
+ char buf[LONG_STRING];
+ int i;
+
++ draw_sidebar(1);
+ for (i = menu->top; i < menu->top + menu->pagelen; i++)
+ {
+ if (i < menu->max)
+***************
+*** 217,223 ****
+ if (option (OPTARROWCURSOR))
+ {
+ attrset (menu->color (i));
+! CLEARLINE (i - menu->top + menu->offset);
+
+ if (i == menu->current)
+ {
+--- 219,225 ----
+ if (option (OPTARROWCURSOR))
+ {
+ attrset (menu->color (i));
+! CLEARLINE_WIN (i - menu->top + menu->offset);
+
+ if (i == menu->current)
+ {
+***************
+*** 246,259 ****
+ BKGDSET (MT_COLOR_INDICATOR);
+ }
+
+! CLEARLINE (i - menu->top + menu->offset);
+ print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+ }
+ }
+ else
+! CLEARLINE (i - menu->top + menu->offset);
+ }
+ menu->redraw = 0;
+ }
+--- 248,261 ----
+ BKGDSET (MT_COLOR_INDICATOR);
+ }
+
+! CLEARLINE_WIN (i - menu->top + menu->offset);
+ print_enriched_string (menu->color(i), (unsigned char *) buf, i != menu->current);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+ }
+ }
+ else
+! CLEARLINE_WIN (i - menu->top + menu->offset);
+ }
+ menu->redraw = 0;
+ }
+***************
+*** 268,274 ****
+ return;
+ }
+
+! move (menu->oldcurrent + menu->offset - menu->top, 0);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+
+--- 270,276 ----
+ return;
+ }
+
+! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+
+***************
+*** 283,295 ****
+ clrtoeol ();
+ menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
+ menu_pad_string (buf, sizeof (buf));
+! move (menu->oldcurrent + menu->offset - menu->top, 3);
+ print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1);
+ SETCOLOR (MT_COLOR_NORMAL);
+ }
+
+ /* now draw it in the new location */
+! move (menu->current + menu->offset - menu->top, 0);
+ attrset (menu->color (menu->current));
+ ADDCOLOR (MT_COLOR_INDICATOR);
+ addstr ("->");
+--- 285,297 ----
+ clrtoeol ();
+ menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent);
+ menu_pad_string (buf, sizeof (buf));
+! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3);
+ print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1);
+ SETCOLOR (MT_COLOR_NORMAL);
+ }
+
+ /* now draw it in the new location */
+! move (menu->current + menu->offset - menu->top, SidebarWidth);
+ attrset (menu->color (menu->current));
+ ADDCOLOR (MT_COLOR_INDICATOR);
+ addstr ("->");
+***************
+*** 310,316 ****
+ attrset (menu->color (menu->current));
+ ADDCOLOR (MT_COLOR_INDICATOR);
+ BKGDSET (MT_COLOR_INDICATOR);
+! CLEARLINE (menu->current - menu->top + menu->offset);
+ print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+--- 312,318 ----
+ attrset (menu->color (menu->current));
+ ADDCOLOR (MT_COLOR_INDICATOR);
+ BKGDSET (MT_COLOR_INDICATOR);
+! CLEARLINE_WIN (menu->current - menu->top + menu->offset);
+ print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+***************
+*** 322,328 ****
+ {
+ char buf[LONG_STRING];
+
+! move (menu->current + menu->offset - menu->top, 0);
+ menu_make_entry (buf, sizeof (buf), menu, menu->current);
+ menu_pad_string (buf, sizeof (buf));
+
+--- 324,330 ----
+ {
+ char buf[LONG_STRING];
+
+! move (menu->current + menu->offset - menu->top, SidebarWidth);
+ menu_make_entry (buf, sizeof (buf), menu, menu->current);
+ menu_pad_string (buf, sizeof (buf));
+
+***************
+*** 876,882 ****
+
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+--- 878,884 ----
+
+
+ if (option (OPTARROWCURSOR))
+! move (menu->current - menu->top + menu->offset, SidebarWidth + 2);
+ else if (option (OPTBRAILLEFRIENDLY))
+ move (menu->current - menu->top + menu->offset, 0);
+ else
+*** mutt-1.5.20-orig/mutt_curses.h 2008-11-11 13:55:47.000000000 -0600
+--- mutt-1.5.20-patched/mutt_curses.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 64,69 ****
+--- 64,70 ----
+ #undef lines
+ #endif /* lines */
+
++ #define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol()
+ #define CLEARLINE(x) move(x,0), clrtoeol()
+ #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x)
+ #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0)
+***************
+*** 126,131 ****
+--- 127,134 ----
+ MT_COLOR_BOLD,
+ MT_COLOR_UNDERLINE,
+ MT_COLOR_INDEX,
++ MT_COLOR_NEW,
++ MT_COLOR_FLAGGED,
+ MT_COLOR_MAX
+ };
+
+*** mutt-1.5.20-orig/mutt.h 2009-06-12 17:15:42.000000000 -0500
+--- mutt-1.5.20-patched/mutt.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 418,423 ****
+--- 418,425 ----
+ OPTSAVEEMPTY,
+ OPTSAVENAME,
+ OPTSCORE,
++ OPTSIDEBAR,
++ OPTSIDEBARSORT,
+ OPTSIGDASHES,
+ OPTSIGONTOP,
+ OPTSORTRE,
+***************
+*** 854,859 ****
+--- 856,862 ----
+ {
+ char *path;
+ FILE *fp;
++ time_t atime;
+ time_t mtime;
+ off_t size;
+ off_t vsize;
+***************
+*** 888,893 ****
+--- 891,897 ----
+ unsigned int quiet : 1; /* inhibit status messages? */
+ unsigned int collapsed : 1; /* are all threads collapsed? */
+ unsigned int closing : 1; /* mailbox is being closed */
++ unsigned int peekonly : 1; /* just taking a glance, revert atime */
+
+ /* driver hooks */
+ void *data; /* driver specific data */
+*** mutt-1.5.20-orig/muttlib.c 2009-05-18 19:11:35.000000000 -0500
+--- mutt-1.5.20-patched/muttlib.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 1232,1237 ****
+--- 1232,1239 ----
+ pl = pw = 1;
+
+ /* see if there's room to add content, else ignore */
++ if ( DrawFullLine )
++ {
+ if ((col < COLS && wlen < destlen) || soft)
+ {
+ int pad;
+***************
+*** 1274,1279 ****
+--- 1276,1327 ----
+ col += wid;
+ src += pl;
+ }
++ }
++ else
++ {
++ if ((col < COLS-SidebarWidth && wlen < destlen) || soft)
++ {
++ int pad;
++
++ /* get contents after padding */
++ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags);
++ len = mutt_strlen (buf);
++ wid = mutt_strwidth (buf);
++
++ /* try to consume as many columns as we can, if we don't have
++ * memory for that, use as much memory as possible */
++ pad = (COLS - SidebarWidth - col - wid) / pw;
++ if (pad > 0 && wlen + (pad * pl) + len > destlen)
++ pad = ((signed)(destlen - wlen - len)) / pl;
++ if (pad > 0)
++ {
++ while (pad--)
++ {
++ memcpy (wptr, src, pl);
++ wptr += pl;
++ wlen += pl;
++ col += pw;
++ }
++ }
++ else if (soft && pad < 0)
++ {
++ /* \0-terminate dest for length computation in mutt_wstr_trunc() */
++ *wptr = 0;
++ /* make sure right part is at most as wide as display */
++ len = mutt_wstr_trunc (buf, destlen, COLS, &wid);
++ /* truncate left so that right part fits completely in */
++ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col);
++ wptr = dest + wlen;
++ }
++ if (len + wlen > destlen)
++ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL);
++ memcpy (wptr, buf, len);
++ wptr += len;
++ wlen += len;
++ col += wid;
++ src += pl;
++ }
++ }
+ break; /* skip rest of input */
+ }
+ else if (ch == '|')
+*** mutt-1.5.20-orig/mx.c 2009-06-10 23:29:41.000000000 -0500
+--- mutt-1.5.20-patched/mx.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 581,586 ****
+--- 581,587 ----
+ * M_APPEND open mailbox for appending
+ * M_READONLY open mailbox in read-only mode
+ * M_QUIET only print error messages
++ * M_PEEK revert atime where applicable
+ * ctx if non-null, context struct to use
+ */
+ CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx)
+***************
+*** 603,608 ****
+--- 604,611 ----
+ ctx->quiet = 1;
+ if (flags & M_READONLY)
+ ctx->readonly = 1;
++ if (flags & M_PEEK)
++ ctx->peekonly = 1;
+
+ if (flags & (M_APPEND|M_NEWFOLDER))
+ {
+***************
+*** 702,710 ****
+--- 705,725 ----
+ void mx_fastclose_mailbox (CONTEXT *ctx)
+ {
+ int i;
++ #ifndef BUFFY_SIZE
++ struct utimbuf ut;
++ #endif
+
+ if(!ctx)
+ return;
++ #ifndef BUFFY_SIZE
++ /* fix up the times so buffy won't get confused */
++ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime)
++ {
++ ut.actime = ctx->atime;
++ ut.modtime = ctx->mtime;
++ utime (ctx->path, &ut);
++ }
++ #endif
+
+ if (ctx->mx_close)
+ ctx->mx_close (ctx);
+*** mutt-1.5.20-orig/OPS 2009-05-13 00:01:13.000000000 -0500
+--- mutt-1.5.20-patched/OPS 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 178,180 ****
+--- 178,185 ----
+ OP_MAIN_SHOW_LIMIT "show currently active limit pattern"
+ OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread"
+ OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads"
++ OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page"
++ OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page"
++ OP_SIDEBAR_NEXT "go down to next mailbox"
++ OP_SIDEBAR_PREV "go to previous mailbox"
++ OP_SIDEBAR_OPEN "open hilighted mailbox"
+--- orig/pager.c.orig 2010-09-18 13:23:19.000000000 +0200
++++ new/pager.c 2010-09-18 14:03:08.000000000 +0200
+@@ -29,6 +29,7 @@
+ #include "pager.h"
+ #include "attach.h"
+ #include "mbyte.h"
++#include "sidebar.h"
+
+ #include "mutt_crypt.h"
+
+@@ -1104,6 +1105,7 @@
+ if (check_attachment_marker ((char *)buf) == 0)
+ wrap_cols = COLS;
+
++ wrap_cols -= SidebarWidth;
+ /* FIXME: this should come from lineInfo */
+ memset(&mbstate, 0, sizeof(mbstate));
+
+@@ -1778,7 +1780,7 @@
+ if ((redraw & REDRAW_BODY) || topline != oldtopline)
+ {
+ do {
+- move (bodyoffset, 0);
++ move (bodyoffset, SidebarWidth);
+ curline = oldtopline = topline;
+ lines = 0;
+ force_redraw = 0;
+@@ -1791,6 +1793,7 @@
+ &QuoteList, &q_level, &force_redraw, &SearchRE) > 0)
+ lines++;
+ curline++;
++ move(lines + bodyoffset, SidebarWidth);
+ }
+ last_offset = lineInfo[curline].offset;
+ } while (force_redraw);
+@@ -1804,6 +1807,7 @@
+ addch ('~');
+ addch ('\n');
+ lines++;
++ move(lines + bodyoffset, SidebarWidth);
+ }
+ /* We are going to update the pager status bar, so it isn't
+ * necessary to reset to normal color now. */
+@@ -1827,21 +1831,21 @@
+ /* print out the pager status bar */
+ SETCOLOR (MT_COLOR_STATUS);
+ BKGDSET (MT_COLOR_STATUS);
+- CLEARLINE (statusoffset);
++ CLEARLINE_WIN (statusoffset);
+
+ if (IsHeader (extra) || IsMsgAttach (extra))
+ {
+- size_t l1 = COLS * MB_LEN_MAX;
++ size_t l1 = (COLS-SidebarWidth) * MB_LEN_MAX;
+ size_t l2 = sizeof (buffer);
+ hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr;
+ mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT);
+- mutt_paddstr (COLS, buffer);
++ mutt_paddstr (COLS-SidebarWidth, buffer);
+ }
+ else
+ {
+ char bn[STRING];
+ snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str);
+- mutt_paddstr (COLS, bn);
++ mutt_paddstr (COLS-SidebarWidth, bn);
+ }
+ BKGDSET (MT_COLOR_NORMAL);
+ SETCOLOR (MT_COLOR_NORMAL);
+@@ -1852,18 +1856,23 @@
+ /* redraw the pager_index indicator, because the
+ * flags for this message might have changed. */
+ menu_redraw_current (index);
++ draw_sidebar(MENU_PAGER);
+
+ /* print out the index status bar */
+ menu_status_line (buffer, sizeof (buffer), index, NONULL(Status));
+
+- move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0);
++ move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), SidebarWidth);
+ SETCOLOR (MT_COLOR_STATUS);
+ BKGDSET (MT_COLOR_STATUS);
+- mutt_paddstr (COLS, buffer);
++ mutt_paddstr (COLS-SidebarWidth, buffer);
+ SETCOLOR (MT_COLOR_NORMAL);
+ BKGDSET (MT_COLOR_NORMAL);
+ }
+
++ /* if we're not using the index, update every time */
++ if ( index == 0 )
++ draw_sidebar(MENU_PAGER);
++
+ redraw = 0;
+
+ if (option(OPTBRAILLEFRIENDLY)) {
+@@ -2852,6 +2861,13 @@
+ mutt_what_key ();
+ break;
+
++ case OP_SIDEBAR_SCROLL_UP:
++ case OP_SIDEBAR_SCROLL_DOWN:
++ case OP_SIDEBAR_NEXT:
++ case OP_SIDEBAR_PREV:
++ scroll_sidebar(ch, MENU_PAGER);
++ break;
++
+ default:
+ ch = -1;
+ break;
+*** mutt-1.5.20-orig/PATCHES 2008-11-11 13:55:46.000000000 -0600
+--- mutt-1.5.20-patched/PATCHES 2009-06-19 22:20:31.000000000 -0500
+***************
+*** 0 ****
+--- 1 ----
++ patch-1.5.20.sidebar.20090619.txt
+*** mutt-1.5.20-orig/sidebar.c 1969-12-31 18:00:00.000000000 -0600
+--- mutt-1.5.20-patched/sidebar.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 0 ****
+--- 1,333 ----
++ /*
++ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu>
++ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
++ */
++
++
++ #if HAVE_CONFIG_H
++ # include "config.h"
++ #endif
++
++ #include "mutt.h"
++ #include "mutt_menu.h"
++ #include "mutt_curses.h"
++ #include "sidebar.h"
++ #include "buffy.h"
++ #include <libgen.h>
++ #include "keymap.h"
++ #include <stdbool.h>
++
++ /*BUFFY *CurBuffy = 0;*/
++ static BUFFY *TopBuffy = 0;
++ static BUFFY *BottomBuffy = 0;
++ static int known_lines = 0;
++
++ static int quick_log10(int n)
++ {
++ char string[32];
++ sprintf(string, "%d", n);
++ return strlen(string);
++ }
++
++ void calc_boundaries (int menu)
++ {
++ BUFFY *tmp = Incoming;
++
++ if ( known_lines != LINES ) {
++ TopBuffy = BottomBuffy = 0;
++ known_lines = LINES;
++ }
++ for ( ; tmp->next != 0; tmp = tmp->next )
++ tmp->next->prev = tmp;
++
++ if ( TopBuffy == 0 && BottomBuffy == 0 )
++ TopBuffy = Incoming;
++ if ( BottomBuffy == 0 ) {
++ int count = LINES - 2 - (menu != MENU_PAGER || option(OPTSTATUSONTOP));
++ BottomBuffy = TopBuffy;
++ while ( --count && BottomBuffy->next )
++ BottomBuffy = BottomBuffy->next;
++ }
++ else if ( TopBuffy == CurBuffy->next ) {
++ int count = LINES - 2 - (menu != MENU_PAGER);
++ BottomBuffy = CurBuffy;
++ tmp = BottomBuffy;
++ while ( --count && tmp->prev)
++ tmp = tmp->prev;
++ TopBuffy = tmp;
++ }
++ else if ( BottomBuffy == CurBuffy->prev ) {
++ int count = LINES - 2 - (menu != MENU_PAGER);
++ TopBuffy = CurBuffy;
++ tmp = TopBuffy;
++ while ( --count && tmp->next )
++ tmp = tmp->next;
++ BottomBuffy = tmp;
++ }
++ }
++
++ char *make_sidebar_entry(char *box, int size, int new, int flagged)
++ {
++ static char *entry = 0;
++ char *c;
++ int i = 0;
++ int delim_len = strlen(SidebarDelim);
++
++ c = realloc(entry, SidebarWidth - delim_len + 2);
++ if ( c ) entry = c;
++ entry[SidebarWidth - delim_len + 1] = 0;
++ for (; i < SidebarWidth - delim_len + 1; entry[i++] = ' ' );
++ i = strlen(box);
++ strncpy( entry, box, i < (SidebarWidth - delim_len + 1) ? i : (SidebarWidth - delim_len + 1) );
++
++ if (size == -1)
++ sprintf(entry + SidebarWidth - delim_len - 3, "?");
++ else if ( new ) {
++ if (flagged > 0) {
++ sprintf(
++ entry + SidebarWidth - delim_len - 5 - quick_log10(size) - quick_log10(new) - quick_log10(flagged),
++ "% d(%d)[%d]", size, new, flagged);
++ } else {
++ sprintf(
++ entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(new),
++ "% d(%d)", size, new);
++ }
++ } else if (flagged > 0) {
++ sprintf( entry + SidebarWidth - delim_len - 3 - quick_log10(size) - quick_log10(flagged), "% d[%d]", size, flagged);
++ } else {
++ sprintf( entry + SidebarWidth - delim_len - 1 - quick_log10(size), "% d", size);
++ }
++ return entry;
++ }
++
++ void set_curbuffy(char buf[LONG_STRING])
++ {
++ BUFFY* tmp = CurBuffy = Incoming;
++
++ if (!Incoming)
++ return;
++
++ while(1) {
++ if(!strcmp(tmp->path, buf)) {
++ CurBuffy = tmp;
++ break;
++ }
++
++ if(tmp->next)
++ tmp = tmp->next;
++ else
++ break;
++ }
++ }
++
++ int draw_sidebar(int menu) {
++
++ int lines = option(OPTHELP) ? 1 : 0;
++ BUFFY *tmp;
++ #ifndef USE_SLANG_CURSES
++ attr_t attrs;
++ #endif
++ short delim_len = strlen(SidebarDelim);
++ short color_pair;
++
++ static bool initialized = false;
++ static int prev_show_value;
++ static short saveSidebarWidth;
++
++ /* initialize first time */
++ if(!initialized) {
++ prev_show_value = option(OPTSIDEBAR);
++ saveSidebarWidth = SidebarWidth;
++ if(!option(OPTSIDEBAR)) SidebarWidth = 0;
++ initialized = true;
++ }
++
++ /* save or restore the value SidebarWidth */
++ if(prev_show_value != option(OPTSIDEBAR)) {
++ if(prev_show_value && !option(OPTSIDEBAR)) {
++ saveSidebarWidth = SidebarWidth;
++ SidebarWidth = 0;
++ } else if(!prev_show_value && option(OPTSIDEBAR)) {
++ SidebarWidth = saveSidebarWidth;
++ }
++ prev_show_value = option(OPTSIDEBAR);
++ }
++
++
++ // if ( SidebarWidth == 0 ) return 0;
++ if (SidebarWidth > 0 && option (OPTSIDEBAR)
++ && delim_len >= SidebarWidth) {
++ unset_option (OPTSIDEBAR);
++ /* saveSidebarWidth = SidebarWidth; */
++ if (saveSidebarWidth > delim_len) {
++ SidebarWidth = saveSidebarWidth;
++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar."));
++ sleep (2);
++ } else {
++ SidebarWidth = 0;
++ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value."));
++ sleep (4); /* the advise to set a sane value should be seen long enough */
++ }
++ saveSidebarWidth = 0;
++ return (0);
++ }
++
++ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) {
++ if (SidebarWidth > 0) {
++ saveSidebarWidth = SidebarWidth;
++ SidebarWidth = 0;
++ }
++ unset_option(OPTSIDEBAR);
++ return 0;
++ }
++
++ /* get attributes for divider */
++ SETCOLOR(MT_COLOR_STATUS);
++ #ifndef USE_SLANG_CURSES
++ attr_get(&attrs, &color_pair, 0);
++ #else
++ color_pair = attr_get();
++ #endif
++ SETCOLOR(MT_COLOR_NORMAL);
++
++ /* draw the divider */
++
++ for ( ; lines < LINES-1-(menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) {
++ move(lines, SidebarWidth - delim_len);
++ addstr(NONULL(SidebarDelim));
++ #ifndef USE_SLANG_CURSES
++ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL);
++ #endif
++ }
++
++ if ( Incoming == 0 ) return 0;
++ lines = option(OPTHELP) ? 1 : 0; /* go back to the top */
++
++ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 )
++ calc_boundaries(menu);
++ if ( CurBuffy == 0 ) CurBuffy = Incoming;
++
++ tmp = TopBuffy;
++
++ SETCOLOR(MT_COLOR_NORMAL);
++
++ for ( ; tmp && lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); tmp = tmp->next ) {
++ if ( tmp == CurBuffy )
++ SETCOLOR(MT_COLOR_INDICATOR);
++ else if ( tmp->msg_unread > 0 )
++ SETCOLOR(MT_COLOR_NEW);
++ else if ( tmp->msg_flagged > 0 )
++ SETCOLOR(MT_COLOR_FLAGGED);
++ else
++ SETCOLOR(MT_COLOR_NORMAL);
++
++ move( lines, 0 );
++ if ( Context && !strcmp( tmp->path, Context->path ) ) {
++ tmp->msg_unread = Context->unread;
++ tmp->msgcount = Context->msgcount;
++ tmp->msg_flagged = Context->flagged;
++ }
++ // check whether Maildir is a prefix of the current folder's path
++ short maildir_is_prefix = 0;
++ if ( (strlen(tmp->path) > strlen(Maildir)) &&
++ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) )
++ maildir_is_prefix = 1;
++ // calculate depth of current folder and generate its display name with indented spaces
++ int sidebar_folder_depth = 0;
++ char *sidebar_folder_name;
++ sidebar_folder_name = basename(tmp->path);
++ if ( maildir_is_prefix ) {
++ char *tmp_folder_name;
++ int i;
++ tmp_folder_name = tmp->path + strlen(Maildir);
++ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) {
++ if (tmp_folder_name[i] == '/') sidebar_folder_depth++;
++ }
++ if (sidebar_folder_depth > 0) {
++ sidebar_folder_name = malloc(strlen(basename(tmp->path)) + sidebar_folder_depth + 1);
++ for (i=0; i < sidebar_folder_depth; i++)
++ sidebar_folder_name[i]=' ';
++ sidebar_folder_name[i]=0;
++ strncat(sidebar_folder_name, basename(tmp->path), strlen(basename(tmp->path)) + sidebar_folder_depth);
++ }
++ }
++ printw( "%.*s", SidebarWidth - delim_len + 1,
++ make_sidebar_entry(sidebar_folder_name, tmp->msgcount,
++ tmp->msg_unread, tmp->msg_flagged));
++ if (sidebar_folder_depth > 0)
++ free(sidebar_folder_name);
++ lines++;
++ }
++ SETCOLOR(MT_COLOR_NORMAL);
++ for ( ; lines < LINES-1 - (menu != MENU_PAGER || option(OPTSTATUSONTOP)); lines++ ) {
++ int i = 0;
++ move( lines, 0 );
++ for ( ; i < SidebarWidth - delim_len; i++ )
++ addch(' ');
++ }
++ return 0;
++ }
++
++
++ void set_buffystats(CONTEXT* Context)
++ {
++ BUFFY *tmp = Incoming;
++ while(tmp) {
++ if(Context && !strcmp(tmp->path, Context->path)) {
++ tmp->msg_unread = Context->unread;
++ tmp->msgcount = Context->msgcount;
++ break;
++ }
++ tmp = tmp->next;
++ }
++ }
++
++ void scroll_sidebar(int op, int menu)
++ {
++ if(!SidebarWidth) return;
++ if(!CurBuffy) return;
++
++ switch (op) {
++ case OP_SIDEBAR_NEXT:
++ if ( CurBuffy->next == NULL ) return;
++ CurBuffy = CurBuffy->next;
++ break;
++ case OP_SIDEBAR_PREV:
++ if ( CurBuffy->prev == NULL ) return;
++ CurBuffy = CurBuffy->prev;
++ break;
++ case OP_SIDEBAR_SCROLL_UP:
++ CurBuffy = TopBuffy;
++ if ( CurBuffy != Incoming ) {
++ calc_boundaries(menu);
++ CurBuffy = CurBuffy->prev;
++ }
++ break;
++ case OP_SIDEBAR_SCROLL_DOWN:
++ CurBuffy = BottomBuffy;
++ if ( CurBuffy->next ) {
++ calc_boundaries(menu);
++ CurBuffy = CurBuffy->next;
++ }
++ break;
++ default:
++ return;
++ }
++ calc_boundaries(menu);
++ draw_sidebar(menu);
++ }
++
+*** mutt-1.5.20-orig/sidebar.h 1969-12-31 18:00:00.000000000 -0600
+--- mutt-1.5.20-patched/sidebar.h 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 0 ****
+--- 1,36 ----
++ /*
++ * Copyright (C) ????-2004 Justin Hibbits <jrh29@po.cwru.edu>
++ * Copyright (C) 2004 Thomer M. Gil <mutt@thomer.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
++ */
++
++ #ifndef SIDEBAR_H
++ #define SIDEBAR_H
++
++ struct MBOX_LIST {
++ char *path;
++ int msgcount;
++ int new;
++ } MBLIST;
++
++ /* parameter is whether or not to go to the status line */
++ /* used for omitting the last | that covers up the status bar in the index */
++ int draw_sidebar(int);
++ void scroll_sidebar(int, int);
++ void set_curbuffy(char*);
++ void set_buffystats(CONTEXT*);
++
++ #endif /* SIDEBAR_H */
+*** mutt-1.5.20-orig/doc/Muttrc 2009-06-14 13:53:24.000000000 -0500
+--- mutt-1.5.20-patched/doc/Muttrc 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 657,662 ****
+--- 657,682 ----
+ # $crypt_autosign, $crypt_replysign and $smime_is_default.
+ #
+ #
++ # set sidebar_visible=no
++ #
++ # Name: sidebar_visible
++ # Type: boolean
++ # Default: no
++ #
++ #
++ # This specifies whether or not to show sidebar (left-side list of folders).
++ #
++ #
++ # set sidebar_width=0
++ #
++ # Name: sidebar_width
++ # Type: number
++ # Default: 0
++ #
++ #
++ # The width of the sidebar.
++ #
++ #
+ # set crypt_autosign=no
+ #
+ # Name: crypt_autosign
+*** mutt-1.5.20-orig/imap/imap.c 2009-06-14 12:19:16.000000000 -0500
+--- mutt-1.5.20-patched/imap/imap.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 1521,1527 ****
+
+ imap_munge_mbox_name (munged, sizeof (munged), name);
+ snprintf (command, sizeof (command),
+! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged);
+
+ if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0)
+ {
+--- 1521,1527 ----
+
+ imap_munge_mbox_name (munged, sizeof (munged), name);
+ snprintf (command, sizeof (command),
+! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged);
+
+ if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0)
+ {
+*** mutt-1.5.20-orig/imap/command.c 2009-01-05 20:58:31.000000000 -0600
+--- mutt-1.5.20-patched/imap/command.c 2009-06-19 22:07:04.000000000 -0500
+***************
+*** 1009,1014 ****
+--- 1009,1021 ----
+ opened */
+ status->uidnext = oldun;
+
++ /* Added to make the sidebar show the correct numbers */
++ if (status->messages)
++ {
++ inc->msgcount = status->messages;
++ inc->msg_unread = status->unseen;
++ }
++
+ FREE (&value);
+ return;
+ }
+--- orig/compose.c.orig 2010-09-18 13:23:18.000000000 +0200
++++ new/compose.c 2010-09-18 14:01:09.000000000 +0200
+@@ -80,7 +80,7 @@
+
+ #define HDR_XOFFSET 14
+ #define TITLE_FMT "%14s" /* Used for Prompts, which are ASCII */
+-#define W (COLS - HDR_XOFFSET)
++#define W (COLS - HDR_XOFFSET - SidebarWidth)
+
+ static char *Prompts[] =
+ {
+@@ -143,7 +143,7 @@
+ {
+ int off = 0;
+
+- mvprintw (HDR_CRYPT, 0, TITLE_FMT, "Security: ");
++ mvprintw (HDR_CRYPT, SidebarWidth, TITLE_FMT, "Security: ");
+
+ if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0)
+ {
+@@ -175,7 +175,7 @@
+ }
+
+ clrtoeol ();
+- move (HDR_CRYPTINFO, 0);
++ move (HDR_CRYPTINFO, SidebarWidth);
+ clrtoeol ();
+
+ if ((WithCrypto & APPLICATION_PGP)
+@@ -195,7 +195,7 @@
+ && (msg->security & ENCRYPT)
+ && SmimeCryptAlg
+ && *SmimeCryptAlg) {
+- mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "),
++ mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "),
+ NONULL(SmimeCryptAlg));
+ off = 20;
+ }
+@@ -224,7 +224,7 @@
+ if (t && t[0] == '0' && t[1] == '\0')
+ t = "<random>";
+
+- if (c + mutt_strlen (t) + 2 >= COLS)
++ if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth)
+ break;
+
+ addstr (NONULL(t));
+@@ -276,7 +276,7 @@
+
+ buf[0] = 0;
+ rfc822_write_address (buf, sizeof (buf), addr, 1);
+- mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]);
++ mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]);
+ mutt_paddstr (W, buf);
+ }
+
+@@ -294,21 +294,21 @@
+ }
+ else
+ {
+- mvprintw (HDR_TO, 0, TITLE_FMT , Prompts[HDR_NEWSGROUPS - 1]);
++ mvprintw (HDR_TO, SidebarWidth, TITLE_FMT , Prompts[HDR_NEWSGROUPS - 1]);
+ mutt_paddstr (W, NONULL (msg->env->newsgroups));
+- mvprintw (HDR_CC, 0, TITLE_FMT , Prompts[HDR_FOLLOWUPTO - 1]);
++ mvprintw (HDR_CC, SidebarWidth, TITLE_FMT , Prompts[HDR_FOLLOWUPTO - 1]);
+ mutt_paddstr (W, NONULL (msg->env->followup_to));
+ if (option (OPTXCOMMENTTO))
+ {
+- mvprintw (HDR_BCC, 0, TITLE_FMT , Prompts[HDR_XCOMMENTTO - 1]);
++ mvprintw (HDR_BCC, SidebarWidth, TITLE_FMT , Prompts[HDR_XCOMMENTTO - 1]);
+ mutt_paddstr (W, NONULL (msg->env->x_comment_to));
+ }
+ }
+ #endif
+- mvprintw (HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]);
++ mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]);
+ mutt_paddstr (W, NONULL (msg->env->subject));
+ draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to);
+- mvprintw (HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]);
++ mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]);
+ mutt_paddstr (W, fcc);
+
+ if (WithCrypto)
+@@ -319,7 +319,7 @@
+ #endif
+
+ SETCOLOR (MT_COLOR_STATUS);
+- mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments"));
++ mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments"));
+ BKGDSET (MT_COLOR_STATUS);
+ clrtoeol ();
+
+@@ -357,7 +357,7 @@
+ /* redraw the expanded list so the user can see the result */
+ buf[0] = 0;
+ rfc822_write_address (buf, sizeof (buf), *addr, 1);
+- move (line, HDR_XOFFSET);
++ move (line, HDR_XOFFSET+SidebarWidth);
+ mutt_paddstr (W, buf);
+
+ return 0;
+@@ -686,7 +686,7 @@
+ if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0)
+ {
+ mutt_str_replace (&msg->env->subject, buf);
+- move (HDR_SUBJECT, HDR_XOFFSET);
++ move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth);
+ clrtoeol ();
+ if (msg->env->subject)
+ mutt_paddstr (W, msg->env->subject);
+@@ -703,7 +703,7 @@
+ {
+ strfcpy (fcc, buf, fcclen);
+ mutt_pretty_mailbox (fcc, fcclen);
+- move (HDR_FCC, HDR_XOFFSET);
++ move (HDR_FCC, HDR_XOFFSET + SidebarWidth);
+ mutt_paddstr (W, fcc);
+ fccSet = 1;
diff --git a/mail/mutt/files/extra-patch-signature-menu b/mail/mutt/files/extra-patch-signature-menu
new file mode 100644
index 000000000000..029dd4ac215d
--- /dev/null
+++ b/mail/mutt/files/extra-patch-signature-menu
@@ -0,0 +1,729 @@
+--- mutt-1.5.11/PATCHES Dec 2002 17:44:54 -0000 3.6
++++ mutt-1.5.11/PATCHES Feb 2004 13:19:42 -0000
+@@ -0,0 +1 @@
++patch-1.5.11.cd.signatures_menu.2.1
+--- mutt-1.5.11/Makefile.am.orig Thu Aug 11 23:27:28 2005
++++ mutt-1.5.11/Makefile.am Sat Mar 11 21:47:55 2006
+@@ -25,7 +25,7 @@
+ main.c mbox.c menu.c mh.c mx.c pager.c parse.c pattern.c \
+ postpone.c query.c recvattach.c recvcmd.c \
+ rfc822.c rfc1524.c rfc2047.c rfc2231.c \
+- score.c send.c sendlib.c signal.c sort.c \
++ score.c send.c sendlib.c signal.c signature.c sort.c \
+ status.c system.c thread.c charset.c history.c lib.c \
+ muttlib.c editmsg.c utf8.c mbyte.c wcwidth.c \
+ url.c ascii.c mutt_idna.c crypt-mod.c crypt-mod.h
+--- mutt-1.5.12/Makefile.in.orig Mon Jul 17 16:29:15 2006
++++ mutt-1.5.12/Makefile.in Mon Jul 17 16:30:26 2006
+@@ -90,7 +90,7 @@
+ query.$(OBJEXT) recvattach.$(OBJEXT) recvcmd.$(OBJEXT) \
+ rfc822.$(OBJEXT) rfc1524.$(OBJEXT) rfc2047.$(OBJEXT) \
+ rfc2231.$(OBJEXT) score.$(OBJEXT) send.$(OBJEXT) \
+- sendlib.$(OBJEXT) signal.$(OBJEXT) sort.$(OBJEXT) \
++ sendlib.$(OBJEXT) signal.$(OBJEXT) signature.$(OBJEXT) sort.$(OBJEXT) \
+ status.$(OBJEXT) system.$(OBJEXT) thread.$(OBJEXT) \
+ charset.$(OBJEXT) history.$(OBJEXT) lib.$(OBJEXT) \
+ muttlib.$(OBJEXT) editmsg.$(OBJEXT) utf8.$(OBJEXT) \
+@@ -309,7 +309,7 @@
+ main.c mbox.c menu.c mh.c mx.c pager.c parse.c pattern.c \
+ postpone.c query.c recvattach.c recvcmd.c \
+ rfc822.c rfc1524.c rfc2047.c rfc2231.c \
+- score.c send.c sendlib.c signal.c sort.c \
++ score.c send.c sendlib.c signal.c signature.c sort.c \
+ status.c system.c thread.c charset.c history.c lib.c \
+ muttlib.c editmsg.c utf8.c mbyte.c wcwidth.c \
+ url.c ascii.c mutt_idna.c crypt-mod.c crypt-mod.h
+--- mutt-1.5.11/OPS.orig Sun Jul 24 18:56:42 2005
++++ mutt-1.5.11/OPS Sat Mar 11 21:47:55 2006
+@@ -38,6 +38,7 @@
+ OP_COMPOSE_POSTPONE_MESSAGE "save this message to send later"
+ OP_COMPOSE_RENAME_FILE "rename/move an attached file"
+ OP_COMPOSE_SEND_MESSAGE "send the message"
++OP_COMPOSE_SIG "choose a signature"
+ OP_COMPOSE_TOGGLE_DISPOSITION "toggle disposition between inline/attachment"
+ OP_COMPOSE_TOGGLE_UNLINK "toggle whether to delete file after sending it"
+ OP_COMPOSE_UPDATE_ENCODING "update an attachment's encoding info"
+@@ -131,6 +132,7 @@
+ OP_NEXT_ENTRY "move to the next entry"
+ OP_NEXT_LINE "scroll down one line"
+ OP_NEXT_PAGE "move to the next page"
++OP_NEXT_SIG "move to the next signature"
+ OP_PAGER_BOTTOM "jump to the bottom of the message"
+ OP_PAGER_HIDE_QUOTED "toggle display of quoted text"
+ OP_PAGER_SKIP_QUOTED "skip beyond quoted text"
+@@ -139,10 +141,12 @@
+ OP_PREV_ENTRY "move to the previous entry"
+ OP_PREV_LINE "scroll up one line"
+ OP_PREV_PAGE "move to the previous page"
++OP_PREV_SIG "move to the previous signature"
+ OP_PRINT "print the current entry"
+ OP_QUERY "query external program for addresses"
+ OP_QUERY_APPEND "append new query results to current results"
+ OP_QUIT "save changes to mailbox and quit"
++OP_RANDOM_SIG "pick a signature at random"
+ OP_RECALL_MESSAGE "recall a postponed message"
+ OP_REDRAW "clear and redraw the screen"
+ OP_REFORMAT_WINCH "{internal}"
+@@ -156,6 +160,7 @@
+ OP_SEARCH_OPPOSITE "search for next match in opposite direction"
+ OP_SEARCH_TOGGLE "toggle search pattern coloring"
+ OP_SHELL_ESCAPE "invoke a command in a subshell"
++OP_SIG_SEARCH "search signatures matching a pattern"
+ OP_SORT "sort messages"
+ OP_SORT_REVERSE "sort messages in reverse order"
+ OP_TAG "tag the current entry"
+--- mutt-1.5.11/compose.c.orig Thu Aug 11 21:37:23 2005
++++ mutt-1.5.11/compose.c Sat Mar 11 21:47:55 2006
+@@ -1128,6 +1128,12 @@
+ /* no send2hook, since this doesn't modify the message */
+ break;
+
++ case OP_COMPOSE_SIG:
++ mutt_signature(msg->content->filename);
++ MAYBE_REDRAW (menu->redraw);
++ mutt_update_encoding (msg->content);
++ break;
++
+ case OP_PIPE:
+ case OP_FILTER:
+ CHECK_COUNT;
+--- mutt-1.5.12/doc/manual.xml.head.orig Mon Jul 17 16:21:01 2006
++++ mutt-1.5.12/doc/manual.xml.head Mon Jul 17 16:24:46 2006
+@@ -999,6 +999,7 @@
+ <row><entry>c</entry><entry>edit-cc</entry><entry>edit the Cc field</entry></row>
+ <row><entry>b</entry><entry>edit-bcc</entry><entry>edit the Bcc field</entry></row>
+ <row><entry>y</entry><entry>send-message</entry><entry>send the message</entry></row>
++<row><entry>ESC s</entry><entry>signature-menu</entry><entry>select a signature and append it to your mail</entry></row>
+ <row><entry>s</entry><entry>edit-subject</entry><entry>edit the Subject</entry></row>
+ <row><entry>S</entry><entry>smime-menu</entry><entry>select S/MIME options</entry></row>
+ <row><entry>f</entry><entry>edit-fcc</entry><entry>specify an ``Fcc'' mailbox</entry></row>
+--- mutt-1.5.11/functions.h.orig Sun Jul 24 18:56:42 2005
++++ mutt-1.5.11/functions.h Sat Mar 11 21:48:05 2006
+@@ -311,6 +311,7 @@
+ { "view-attach", OP_VIEW_ATTACH, M_ENTER_S },
+ { "send-message", OP_COMPOSE_SEND_MESSAGE, "y" },
+ { "pipe-entry", OP_PIPE, "|" },
++ { "signature-menu", OP_COMPOSE_SIG, "\033s" },
+
+ { "attach-key", OP_COMPOSE_ATTACH_KEY, "\033k" },
+ { "pgp-menu", OP_COMPOSE_PGP_MENU, "p" },
+@@ -368,6 +369,19 @@
+ { "mail", OP_MAIL, "m" },
+ { "query", OP_QUERY, "Q" },
+ { "query-append", OP_QUERY_APPEND, "A" },
++ { NULL, 0, NULL }
++};
++
++/* Signature Menu */
++struct binding_t OpSig[] = {
++ { "next-sig", OP_NEXT_SIG, "j" },
++ { "previous-sig", OP_PREV_SIG, "k" },
++ { "random-sig", OP_RANDOM_SIG, "r" },
++ { NULL, 0, NULL }
++};
++
++struct binding_t OpSigDir[] = {
++ { "search-sig", OP_SIG_SEARCH, "/" },
+ { NULL, 0, NULL }
+ };
+
+--- mutt-1.5.11/globals.h.orig Thu Sep 15 16:19:54 2005
++++ mutt-1.5.11/globals.h Sat Mar 11 21:48:05 2006
+@@ -109,6 +109,7 @@
+ WHERE char *Sendmail;
+ WHERE char *Shell;
+ WHERE char *Signature;
++WHERE char *SigDirectory;
+ WHERE char *SimpleSearch;
+ WHERE char *Spoolfile;
+ WHERE char *SpamSep;
+--- mutt-1.5.11/init.h.orig Thu Sep 15 16:19:54 2005
++++ mutt-1.5.11/init.h Sat Mar 11 21:48:05 2006
+@@ -2457,6 +2457,14 @@
+ ** assumed that filename is a shell command and input should be read from
+ ** its stdout.
+ */
++ { "signatures_directory", DT_PATH, R_NONE, UL &SigDirectory, UL "" },
++ /*
++ ** .pp
++ ** Specifies the path where your signatures are located. In the files of
++ ** this directory, the signatures are separated by blank lines and/or
++ ** sig_dashes (``-- '').
++ ** You can choose between these signatures from the compose menu.
++ */
+ { "simple_search", DT_STR, R_NONE, UL &SimpleSearch, UL "~f %s | ~s %s" },
+ /*
+ ** .pp
+--- mutt-1.5.11/keymap.c.orig Wed Sep 7 10:19:43 2005
++++ mutt-1.5.11/keymap.c Sat Mar 11 21:48:05 2006
+@@ -55,6 +55,8 @@
+
+
+ { "query", MENU_QUERY },
++ { "signature", MENU_SIG },
++ { "sig_directory", MENU_SIG_DIR },
+ { "generic", MENU_GENERIC },
+ { NULL, 0 }
+ };
+@@ -560,6 +562,8 @@
+ create_bindings (OpPost, MENU_POST);
+ create_bindings (OpQuery, MENU_QUERY);
+ create_bindings (OpAlias, MENU_ALIAS);
++ create_bindings (OpSig, MENU_SIG);
++ create_bindings (OpSigDir, MENU_SIG_DIR);
+
+
+ if ((WithCrypto & APPLICATION_PGP))
+@@ -658,6 +662,9 @@
+ km_bindkey ("<enter>", MENU_ATTACH, OP_VIEW_ATTACH);
+ km_bindkey ("<enter>", MENU_COMPOSE, OP_VIEW_ATTACH);
+
++ km_bindkey ("<up>", MENU_SIG, OP_PREV_SIG);
++ km_bindkey ("<down>", MENU_SIG, OP_NEXT_SIG);
++
+ /* edit-to (default "t") hides generic tag-entry in Compose menu
+ This will bind tag-entry to "T" in the Compose menu */
+ km_bindkey ("T", MENU_COMPOSE, OP_TAG);
+@@ -793,6 +800,10 @@
+ return OpEditor;
+ case MENU_QUERY:
+ return OpQuery;
++ case MENU_SIG:
++ return OpSig;
++ case MENU_SIG_DIR:
++ return OpSigDir;
+
+ case MENU_PGP:
+ return (WithCrypto & APPLICATION_PGP)? OpPgp:NULL;
+--- mutt-1.5.11/keymap.h.orig Thu Jun 17 22:33:04 2004
++++ mutt-1.5.11/keymap.h Sat Mar 11 21:48:05 2006
+@@ -62,6 +62,8 @@
+ MENU_PAGER,
+ MENU_POST,
+ MENU_QUERY,
++ MENU_SIG,
++ MENU_SIG_DIR,
+
+
+ MENU_PGP,
+@@ -108,6 +110,8 @@
+ extern struct binding_t OpEditor[];
+ extern struct binding_t OpQuery[];
+ extern struct binding_t OpAlias[];
++extern struct binding_t OpSig[];
++extern struct binding_t OpSigDir[];
+
+ extern struct binding_t OpPgp[];
+
+--- mutt-1.5.11/protos.h.orig Wed Sep 7 10:19:43 2005
++++ mutt-1.5.11/protos.h Sat Mar 11 21:48:05 2006
+@@ -242,6 +242,7 @@
+ void mutt_shell_escape (void);
+ void mutt_show_error (void);
+ void mutt_signal_init (void);
++void mutt_signature (char *);
+ void mutt_stamp_attachment (BODY *a);
+ void mutt_tabs_to_spaces (char *);
+ void mutt_tag_set_flag (int, int);
+--- mutt-1.5.11/signature.c.orig Sat Mar 11 21:58:38 2006
++++ mutt-1.5.11/signature.c Sat Mar 11 22:07:31 2006
+@@ -0,0 +1,499 @@
++/*
++ * Copyright (C) 2001 Cedric Duval <cedricduval@free.fr>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
++ */
++
++#if HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include "mutt.h"
++#include "mutt_menu.h"
++#include "mapping.h"
++#include "mutt_curses.h"
++
++#include <stdio.h>
++#include <string.h>
++#include <stdlib.h>
++#include <dirent.h>
++#include <sys/stat.h>
++
++#define SIG_DISPLAY_LINES 4
++#define SEPARATOR(x) ((*x == '\n') || (mutt_strcmp (x, "-- \n") == 0))
++#define SIG_ADD_LINE(x,y) mutt_add_list (x, strtok (y, "\n"))
++
++typedef struct sig_list
++{
++ struct sig_list *next;
++ LIST *sig;
++} SIG_LIST;
++
++typedef struct sig_dir
++{
++ struct sig_dir *next;
++ char *name;
++} SIG_DIR;
++
++typedef LIST * ENTRY;
++
++typedef struct entry_dir
++{
++ int tagged;
++ SIG_DIR *data;
++} ENTRY_DIR;
++
++static struct mapping_t SigHelp[] = {
++ { N_("Exit"), OP_EXIT },
++ { N_("Search"), OP_SEARCH },
++ { N_("Random"), OP_RANDOM_SIG },
++ { N_("Help"), OP_HELP },
++ { NULL }
++};
++
++static struct mapping_t SigDirHelp[] = {
++ { N_("Exit"), OP_EXIT },
++ { N_("Search signature"), OP_SIG_SEARCH },
++ { N_("Help"), OP_HELP },
++ { NULL }
++};
++
++void menu_next_entry (MUTTMENU *menu);
++void menu_prev_entry (MUTTMENU *menu);
++
++
++static int sig_match (LIST *s, regex_t *re)
++{
++ while (s)
++ {
++ if (regexec (re, s->data, (size_t)0, NULL, (int)0) == 0)
++ return 1;
++ s = s->next;
++ }
++ return 0;
++}
++
++static void read_sig_file (char *name, SIG_LIST **begin, regex_t *re)
++{
++ FILE *fp;
++ char buf[STRING];
++ LIST *sig = NULL;
++ SIG_LIST *first, *cur;
++ int append = 0;
++
++ if (!(fp = safe_fopen (name, "r")))
++ {
++ mutt_error (_("Can't open signature file %s"), name);
++ return;
++ }
++
++ for (first = *begin; first && first->next; first = first->next, append++)
++ ; /* append results to an existing list */
++ cur = first;
++
++ while (fgets (buf, sizeof (buf), fp))
++ {
++ if (buf[0] && !SEPARATOR (buf))
++ {
++ sig = SIG_ADD_LINE (NULL, buf);
++
++ while (fgets (buf, sizeof (buf), fp) && buf[0] && !SEPARATOR (buf))
++ SIG_ADD_LINE (sig, buf);
++
++ if (re && !sig_match (sig, re))
++ mutt_free_list (&sig); /* previous sig didn't match the regexp */
++ else
++ {
++ /* add signature */
++ if (first == NULL)
++ first = cur = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST));
++ else
++ {
++ cur->next = (SIG_LIST *) safe_calloc (1, sizeof (SIG_LIST));
++ cur = cur->next;
++ }
++
++ cur->sig = sig;
++ cur->next = NULL;
++ }
++ }
++ }
++
++ if (!append)
++ *begin = first;
++
++ safe_fclose (&fp);
++}
++
++static void sig_make_entry (char *s, size_t slen, MUTTMENU *menu, int num)
++{
++ ENTRY *table = (ENTRY *) menu->data;
++
++ snprintf (s, slen, "%3d %s",
++ num + 1,
++ table[num]->data);
++}
++
++static int sig_menu_search (MUTTMENU *menu, regex_t *re, int num)
++{
++ return (sig_match (((ENTRY *)menu->data)[num], re) ? 0 : REG_NOMATCH);
++}
++
++static void draw_sig_frame (LIST *s)
++{
++ int i;
++
++ for (i = 1; i <= SIG_DISPLAY_LINES; i++)
++ {
++ if (s)
++ {
++ mvaddstr (i, 0, s->data);
++ s = s->next;
++ }
++ else
++ move (i, 0);
++
++ clrtoeol ();
++ }
++
++ SETCOLOR (MT_COLOR_STATUS);
++ mvaddstr (SIG_DISPLAY_LINES + 1, 0, _("-- Signature"));
++ BKGDSET (MT_COLOR_STATUS);
++ clrtoeol ();
++
++ BKGDSET (MT_COLOR_NORMAL);
++ SETCOLOR (MT_COLOR_NORMAL);
++}
++
++static void free_sig_list (SIG_LIST **sigs)
++{
++ SIG_LIST *cur;
++
++ while (*sigs)
++ {
++ cur = *sigs;
++ *sigs = (*sigs)->next;
++ mutt_free_list (&cur->sig);
++ safe_free ((void **)&cur);
++ }
++}
++
++static void append_signature (char *msg_file, LIST *s)
++{
++ FILE *fp;
++
++ if ((fp = safe_fopen (msg_file, "a")) == 0)
++ mutt_perror (msg_file);
++ else
++ {
++ if (option (OPTSIGDASHES))
++ fputs ("\n-- \n", fp);
++
++ for (; s; s = s->next)
++ fprintf (fp, "%s\n", s->data);
++
++ mutt_message (_("Signature appended to your mail"));
++ safe_fclose (&fp);
++ }
++}
++
++static LIST *sig_list_menu (char *file, SIG_LIST *list)
++{
++ LIST *result = NULL;
++ SIG_LIST *sigl;
++ MUTTMENU *menu;
++ ENTRY *SigTable;
++ char helpstr[SHORT_STRING], title[SHORT_STRING];
++ int i, done = 0;
++
++ snprintf (title, sizeof (title), _("Signature : %s"), file);
++
++ menu = mutt_new_menu ();
++ menu->make_entry = sig_make_entry;
++ menu->tag = NULL;
++ menu->search = sig_menu_search;
++ menu->menu = MENU_SIG;
++ menu->title = title;
++ menu->help = mutt_compile_help (helpstr, sizeof (helpstr),
++ MENU_SIG, SigHelp);
++ menu->offset = SIG_DISPLAY_LINES + 2;
++ menu->pagelen = LINES - SIG_DISPLAY_LINES - 4;
++
++ for (sigl = list; sigl; sigl = sigl->next)
++ menu->max++;
++
++ menu->data = SigTable = (ENTRY *) safe_calloc (menu->max, sizeof (ENTRY));
++
++ for (i = 0, sigl = list; sigl; i++, sigl = sigl->next)
++ SigTable[i] = sigl->sig;
++
++ while (!done)
++ {
++ switch (mutt_menuLoop (menu))
++ {
++ case OP_GENERIC_SELECT_ENTRY:
++ result = SigTable[menu->current];
++ done = 1;
++ break;
++
++ case OP_PREV_SIG:
++ menu_prev_entry (menu);
++ draw_sig_frame (SigTable[menu->current]);
++ break;
++
++ case OP_NEXT_SIG:
++ menu_next_entry (menu);
++ draw_sig_frame (SigTable[menu->current]);
++ break;
++
++ case OP_REDRAW:
++ menu->offset = SIG_DISPLAY_LINES + 2;
++ menu->pagelen = LINES - SIG_DISPLAY_LINES - 4;
++ draw_sig_frame (SigTable[menu->current]);
++ break;
++
++ case OP_RANDOM_SIG:
++ menu->current = LRAND () % menu->max;
++ draw_sig_frame (SigTable[menu->current]);
++ menu->redraw |= REDRAW_MOTION;
++ break;
++
++ case OP_EXIT:
++ set_option (OPTNEEDREDRAW);
++ done = 1;
++ break;
++ }
++ }
++
++ mutt_menuDestroy (&menu);
++ safe_free ((void **)&SigTable);
++ return result;
++}
++
++static SIG_LIST *sig_search_filter (MUTTMENU *menu, char *path)
++{
++ regex_t re;
++ char buf[STRING];
++ SIG_LIST *result = NULL;
++ int i;
++
++ snprintf (buf, sizeof(buf), menu->searchBuf ? menu->searchBuf : "");
++ if (mutt_get_field (_("Search for: "), buf,
++ sizeof (buf), M_CLEAR) != 0 || !buf[0])
++ return (NULL);
++ mutt_str_replace (&menu->searchBuf, buf);
++
++ if ((i = regcomp (&re, menu->searchBuf, REG_NOSUB | REG_EXTENDED | REG_WORDS
++ | mutt_which_case (menu->searchBuf))) != 0)
++ {
++ regerror (i, &re, buf, sizeof (buf));
++ regfree (&re);
++ mutt_error ("%s", buf);
++ return (NULL);
++ }
++
++ /* building list of sigs matching the regexp */
++ for (i = 0; i < menu->max; i++)
++ {
++ /* search in every file if none is tagged */
++ if (((ENTRY_DIR *) menu->data)[i].tagged || (menu->tagged == 0))
++ {
++ snprintf (buf, sizeof (buf), "%s/%s", path,
++ ((ENTRY_DIR *) menu->data)[i].data->name);
++ read_sig_file (buf, &result, &re);
++ }
++ }
++
++ regfree (&re);
++ if (!result)
++ mutt_error (_("Not found."));
++
++ return (result);
++}
++
++/* returns the list of files in this directory */
++static SIG_DIR *sig_directory (char *path)
++{
++ DIR *dp;
++ struct dirent *de;
++ struct stat s;
++ SIG_DIR *first = NULL, *cur = NULL;
++ char file[_POSIX_PATH_MAX + SHORT_STRING];
++
++ if ((dp = opendir (path)) == NULL)
++ {
++ mutt_perror (path);
++ return (NULL);
++ }
++
++ while ((de = readdir (dp)))
++ {
++ if ((de->d_name)[0] == '.') /* no hidden files */
++ continue;
++
++ snprintf (file, sizeof (file), "%s/%s", path, de->d_name);
++ if (lstat (file, &s) == -1)
++ continue;
++
++ if ((!S_ISREG (s.st_mode)) && (!S_ISLNK (s.st_mode)))
++ continue;
++
++ if (first == NULL)
++ cur = first = safe_calloc (1, sizeof (SIG_DIR));
++ else
++ {
++ cur->next = safe_calloc (1, sizeof (SIG_DIR));
++ cur = cur->next;
++ }
++ cur->name = safe_strdup (de->d_name);
++ cur->next = NULL;
++ }
++ closedir (dp);
++ return first;
++}
++
++static void sig_dir_make_entry (char *s, size_t slen, MUTTMENU *menu, int num)
++{
++ ENTRY_DIR *table = (ENTRY_DIR *) menu->data;
++
++ snprintf (s, slen, "%c %3d - %s",
++ table[num].tagged ? '*' : ' ',
++ num + 1,
++ table[num].data->name);
++}
++
++static int sig_dir_tag (MUTTMENU *menu, int n, int m)
++{
++ ENTRY_DIR *cur = &((ENTRY_DIR *) menu->data)[n];
++ int ot = cur->tagged;
++
++ cur->tagged = m >= 0 ? m : !cur->tagged;
++ return cur->tagged - ot;
++
++}
++
++static int sig_dir_sort (const void *a, const void *b)
++{
++ ENTRY_DIR *pa = (ENTRY_DIR *) a;
++ ENTRY_DIR *pb = (ENTRY_DIR *) b;
++
++ return (mutt_strcmp (pa->data->name, pb->data->name));
++}
++
++static int sig_dir_menu (char *path, char *msg_file)
++{
++ MUTTMENU *menu;
++ SIG_LIST *sigl;
++ LIST *result = NULL;
++ ENTRY_DIR *FileTable;
++ SIG_DIR *list, *files;
++ char buf[STRING], helpstr[SHORT_STRING], title[SHORT_STRING];
++ int i, done = 0;
++
++ if ((list = sig_directory (path)) == NULL)
++ return -1;
++
++ snprintf (title, sizeof (title), "Signature directory : %s", path);
++
++ menu = mutt_new_menu ();
++ menu->make_entry = sig_dir_make_entry;
++ menu->search = NULL; /* search within files with sig_search_filter() */
++ menu->tag = sig_dir_tag;
++ menu->menu = MENU_SIG_DIR;
++ menu->title = title;
++ menu->help = mutt_compile_help (helpstr, sizeof (helpstr),
++ MENU_SIG_DIR, SigDirHelp);
++
++ for (files = list; files; files = files->next)
++ menu->max++;
++
++ menu->data = FileTable = (ENTRY_DIR *) safe_calloc (menu->max,
++ sizeof (ENTRY_DIR));
++
++ for (i = 0, files = list; files; i++, files = files->next)
++ FileTable[i].data = files;
++
++ qsort (FileTable, menu->max, sizeof (ENTRY_DIR), sig_dir_sort);
++
++ while (!done)
++ {
++ switch (mutt_menuLoop (menu))
++ {
++ case OP_SIG_SEARCH:
++ sigl = sig_search_filter (menu, path);
++
++ if (sigl)
++ {
++ if ((result = sig_list_menu (_("query results"), sigl)) != NULL)
++ {
++ append_signature (msg_file, result);
++ done = 1;
++ }
++
++ MAYBE_REDRAW (menu->redraw);
++ free_sig_list (&sigl);
++ }
++ break;
++
++ case OP_GENERIC_SELECT_ENTRY:
++ snprintf (buf, sizeof (buf), "%s/%s", path,
++ FileTable[menu->current].data->name);
++ sigl = NULL;
++ read_sig_file (buf, &sigl, NULL);
++
++ if (sigl)
++ {
++ if ((result = sig_list_menu (buf, sigl)) != NULL)
++ {
++ append_signature (msg_file, result);
++ done = 1;
++ }
++
++ MAYBE_REDRAW (menu->redraw);
++ free_sig_list (&sigl);
++ }
++ break;
++
++ case OP_EXIT:
++ done = 1;
++ break;
++ }
++ }
++
++ while (list)
++ {
++ safe_free ((void **)&list->name);
++ files = list;
++ list = list->next;
++ safe_free ((void **)&files);
++ }
++ safe_free ((void **)&FileTable);
++ mutt_menuDestroy (&menu);
++ return 0;
++}
++
++void mutt_signature (char *msg_file)
++{
++ if (!SigDirectory)
++ {
++ mutt_error (_("variable 'signatures_directory' is unset"));
++ return;
++ }
++
++ if (sig_dir_menu (SigDirectory, msg_file) == -1)
++ mutt_error (_("%s: no files in this directory"), SigDirectory);
++ else
++ set_option (OPTNEEDREDRAW);
++}
diff --git a/mail/mutt/files/extra-patch-smime-outlook b/mail/mutt/files/extra-patch-smime-outlook
new file mode 100644
index 000000000000..355811694002
--- /dev/null
+++ b/mail/mutt/files/extra-patch-smime-outlook
@@ -0,0 +1,11 @@
+--- crypt.c.orig Fri Mar 7 09:23:44 2003
++++ crypt.c Fri Mar 21 00:06:48 2003
+@@ -440,7 +440,7 @@
+ {
+ len++;
+ if (!ascii_strcasecmp ((t+len), "p7m"))
+-#if 0
++#if 1
+ return SMIMEENCRYPT;
+ #else
+ /* Not sure if this is the correct thing to do, but
diff --git a/mail/mutt/files/extra-patch-trash-purge b/mail/mutt/files/extra-patch-trash-purge
new file mode 100644
index 000000000000..d609d184d907
--- /dev/null
+++ b/mail/mutt/files/extra-patch-trash-purge
@@ -0,0 +1,403 @@
+diff -pruN -x'*.orig' mutt-1.5.20/OPS mutt-1.5.20-trash/OPS
+--- mutt-1.5.20/OPS 2009-05-13 01:01:13.000000000 -0400
++++ mutt-1.5.20-trash/OPS 2009-07-23 09:44:40.000000000 -0400
+@@ -141,6 +141,7 @@ OP_PREV_ENTRY "move to the previous entr
+ OP_PREV_LINE "scroll up one line"
+ OP_PREV_PAGE "move to the previous page"
+ OP_PRINT "print the current entry"
++OP_PURGE_MESSAGE "really delete the current entry, bypassing the trash folder"
+ OP_QUERY "query external program for addresses"
+ OP_QUERY_APPEND "append new query results to current results"
+ OP_QUIT "save changes to mailbox and quit"
+diff -pruN -x'*.orig' mutt-1.5.20/PATCHES mutt-1.5.20-trash/PATCHES
+--- mutt-1.5.20/PATCHES 2008-11-11 14:55:46.000000000 -0500
++++ mutt-1.5.20-trash/PATCHES 2009-07-23 09:53:20.000000000 -0400
+@@ -0,0 +1 @@
++patch-1.5.20.bk.trash_folder-purge_message.1
+diff -pruN -x'*.orig' mutt-1.5.20/commands.c mutt-1.5.20-trash/commands.c
+--- mutt-1.5.20/commands.c 2009-06-12 19:38:52.000000000 -0400
++++ mutt-1.5.20-trash/commands.c 2009-07-23 09:44:40.000000000 -0400
+@@ -716,6 +716,7 @@ int _mutt_save_message (HEADER *h, CONTE
+ if (option (OPTDELETEUNTAG))
+ mutt_set_flag (Context, h, M_TAG, 0);
+ }
++ mutt_set_flag (Context, h, M_APPENDED, 1);
+
+ return 0;
+ }
+diff -pruN -x'*.orig' mutt-1.5.20/curs_main.c mutt-1.5.20-trash/curs_main.c
+--- mutt-1.5.20/curs_main.c 2009-06-13 22:48:36.000000000 -0400
++++ mutt-1.5.20-trash/curs_main.c 2009-07-23 09:44:40.000000000 -0400
+@@ -1803,6 +1803,7 @@ int mutt_index_menu (void)
+ MAYBE_REDRAW (menu->redraw);
+ break;
+
++ case OP_PURGE_MESSAGE:
+ case OP_DELETE:
+
+ CHECK_MSGCOUNT;
+@@ -1813,6 +1814,7 @@ int mutt_index_menu (void)
+ if (tag)
+ {
+ mutt_tag_set_flag (M_DELETE, 1);
++ mutt_tag_set_flag (M_PURGED, (op != OP_PURGE_MESSAGE) ? 0 : 1);
+ if (option (OPTDELETEUNTAG))
+ mutt_tag_set_flag (M_TAG, 0);
+ menu->redraw = REDRAW_INDEX;
+@@ -1820,6 +1822,8 @@ int mutt_index_menu (void)
+ else
+ {
+ mutt_set_flag (Context, CURHDR, M_DELETE, 1);
++ mutt_set_flag (Context, CURHDR, M_PURGED,
++ (op != OP_PURGE_MESSAGE) ? 0 : 1);
+ if (option (OPTDELETEUNTAG))
+ mutt_set_flag (Context, CURHDR, M_TAG, 0);
+ if (option (OPTRESOLVE))
+@@ -2116,11 +2120,13 @@ int mutt_index_menu (void)
+ if (tag)
+ {
+ mutt_tag_set_flag (M_DELETE, 0);
++ mutt_tag_set_flag (M_PURGED, 0);
+ menu->redraw = REDRAW_INDEX;
+ }
+ else
+ {
+ mutt_set_flag (Context, CURHDR, M_DELETE, 0);
++ mutt_set_flag (Context, CURHDR, M_PURGED, 0);
+ if (option (OPTRESOLVE) && menu->current < Context->vcount - 1)
+ {
+ menu->current++;
+@@ -2141,9 +2147,11 @@ int mutt_index_menu (void)
+ CHECK_ACL(M_ACL_DELETE, _("undelete message(s)"));
+
+ rc = mutt_thread_set_flag (CURHDR, M_DELETE, 0,
+- op == OP_UNDELETE_THREAD ? 0 : 1);
++ op == OP_UNDELETE_THREAD ? 0 : 1)
++ + mutt_thread_set_flag (CURHDR, M_PURGED, 0,
++ op == OP_UNDELETE_THREAD ? 0 : 1);
+
+- if (rc != -1)
++ if (rc > -1)
+ {
+ if (option (OPTRESOLVE))
+ {
+diff -pruN -x'*.orig' mutt-1.5.20/flags.c mutt-1.5.20-trash/flags.c
+--- mutt-1.5.20/flags.c 2008-12-16 22:50:09.000000000 -0500
++++ mutt-1.5.20-trash/flags.c 2009-07-23 09:44:40.000000000 -0400
+@@ -65,7 +65,13 @@ void _mutt_set_flag (CONTEXT *ctx, HEADE
+ {
+ h->deleted = 0;
+ update = 1;
+- if (upd_ctx) ctx->deleted--;
++ if (upd_ctx)
++ {
++ ctx->deleted--;
++ if (h->appended)
++ ctx->appended--;
++ }
++ h->appended = 0; /* when undeleting, also reset the appended flag */
+ #ifdef USE_IMAP
+ /* see my comment above */
+ if (ctx->magic == M_IMAP)
+@@ -87,6 +93,27 @@ void _mutt_set_flag (CONTEXT *ctx, HEADE
+ }
+ break;
+
++ case M_APPENDED:
++ if (bf)
++ {
++ if (!h->appended)
++ {
++ h->appended = 1;
++ if (upd_ctx) ctx->appended++;
++ }
++ }
++ break;
++
++ case M_PURGED:
++ if (bf)
++ {
++ if (!h->purged)
++ h->purged = 1;
++ }
++ else if (h->purged)
++ h->purged = 0;
++ break;
++
+ case M_NEW:
+
+ if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN))
+diff -pruN -x'*.orig' mutt-1.5.20/functions.h mutt-1.5.20-trash/functions.h
+--- mutt-1.5.20/functions.h 2009-04-30 01:36:17.000000000 -0400
++++ mutt-1.5.20-trash/functions.h 2009-07-23 09:44:40.000000000 -0400
+@@ -120,6 +120,7 @@ struct binding_t OpMain[] = { /* map: in
+ { "toggle-write", OP_TOGGLE_WRITE, "%" },
+ { "next-thread", OP_MAIN_NEXT_THREAD, "\016" },
+ { "next-subthread", OP_MAIN_NEXT_SUBTHREAD, "\033n" },
++ { "purge-message", OP_PURGE_MESSAGE, NULL },
+ { "query", OP_QUERY, "Q" },
+ { "quit", OP_QUIT, "q" },
+ { "reply", OP_REPLY, "r" },
+@@ -209,6 +210,7 @@ struct binding_t OpPager[] = { /* map: p
+ { "print-message", OP_PRINT, "p" },
+ { "previous-thread", OP_MAIN_PREV_THREAD, "\020" },
+ { "previous-subthread",OP_MAIN_PREV_SUBTHREAD, "\033p" },
++ { "purge-message", OP_PURGE_MESSAGE, NULL },
+ { "quit", OP_QUIT, "Q" },
+ { "exit", OP_EXIT, "q" },
+ { "reply", OP_REPLY, "r" },
+diff -pruN -x'*.orig' mutt-1.5.20/globals.h mutt-1.5.20-trash/globals.h
+--- mutt-1.5.20/globals.h 2009-06-03 16:48:31.000000000 -0400
++++ mutt-1.5.20-trash/globals.h 2009-07-23 09:44:40.000000000 -0400
+@@ -139,6 +139,7 @@ WHERE char *StChars;
+ WHERE char *Status;
+ WHERE char *Tempdir;
+ WHERE char *Tochars;
++WHERE char *TrashPath;
+ WHERE char *Username;
+ WHERE char *Visual;
+
+diff -pruN -x'*.orig' mutt-1.5.20/imap/message.c mutt-1.5.20-trash/imap/message.c
+--- mutt-1.5.20/imap/message.c 2009-06-07 13:52:57.000000000 -0400
++++ mutt-1.5.20-trash/imap/message.c 2009-07-23 09:44:40.000000000 -0400
+@@ -867,6 +867,7 @@ int imap_copy_messages (CONTEXT* ctx, HE
+ if (ctx->hdrs[n]->tagged)
+ {
+ mutt_set_flag (ctx, ctx->hdrs[n], M_DELETE, 1);
++ mutt_set_flag (ctx, ctx->hdrs[n], M_APPENDED, 1);
+ if (option (OPTDELETEUNTAG))
+ mutt_set_flag (ctx, ctx->hdrs[n], M_TAG, 0);
+ }
+@@ -874,6 +875,7 @@ int imap_copy_messages (CONTEXT* ctx, HE
+ else
+ {
+ mutt_set_flag (ctx, h, M_DELETE, 1);
++ mutt_set_flag (ctx, h, M_APPENDED, 1);
+ if (option (OPTDELETEUNTAG))
+ mutt_set_flag (ctx, h, M_TAG, 0);
+ }
+diff -pruN -x'*.orig' mutt-1.5.20/init.h mutt-1.5.20-trash/init.h
+--- mutt-1.5.20/init.h 2009-06-13 17:35:21.000000000 -0400
++++ mutt-1.5.20-trash/init.h 2009-07-23 09:44:40.000000000 -0400
+@@ -3180,6 +3180,16 @@ struct option_t MuttVars[] = {
+ ** by \fIyou\fP. The sixth character is used to indicate when a mail
+ ** was sent to a mailing-list you subscribe to.
+ */
++ { "trash", DT_PATH, R_NONE, UL &TrashPath, 0 },
++ /*
++ ** .pp
++ ** If set, this variable specifies the path of the trash folder where the
++ ** mails marked for deletion will be moved, instead of being irremediably
++ ** purged.
++ ** .pp
++ ** NOTE: When you delete a message in the trash folder, it is really
++ ** deleted, so that you have a way to clean the trash.
++ */
+ #ifdef USE_SOCKET
+ { "tunnel", DT_STR, R_NONE, UL &Tunnel, UL 0 },
+ /*
+diff -pruN -x'*.orig' mutt-1.5.20/mutt.h mutt-1.5.20-trash/mutt.h
+--- mutt-1.5.20/mutt.h 2009-06-12 18:15:42.000000000 -0400
++++ mutt-1.5.20-trash/mutt.h 2009-07-23 09:44:40.000000000 -0400
+@@ -187,6 +187,8 @@ enum
+ M_DELETE,
+ M_UNDELETE,
+ M_DELETED,
++ M_APPENDED,
++ M_PURGED,
+ M_FLAG,
+ M_TAG,
+ M_UNTAG,
+@@ -701,6 +703,8 @@ typedef struct header
+ unsigned int mime : 1; /* has a MIME-Version header? */
+ unsigned int flagged : 1; /* marked important? */
+ unsigned int tagged : 1;
++ unsigned int appended : 1; /* has been saved */
++ unsigned int purged : 1; /* bypassing the trash folder */
+ unsigned int deleted : 1;
+ unsigned int changed : 1;
+ unsigned int attach_del : 1; /* has an attachment marked for deletion */
+@@ -873,6 +877,7 @@ typedef struct _context
+ int new; /* how many new messages? */
+ int unread; /* how many unread messages? */
+ int deleted; /* how many deleted messages */
++ int appended; /* how many saved messages? */
+ int flagged; /* how many flagged messages */
+ int msgnotreadyet; /* which msg "new" in pager, -1 if none */
+
+diff -pruN -x'*.orig' mutt-1.5.20/muttlib.c mutt-1.5.20-trash/muttlib.c
+--- mutt-1.5.20/muttlib.c 2009-05-18 20:11:35.000000000 -0400
++++ mutt-1.5.20-trash/muttlib.c 2009-07-23 09:44:40.000000000 -0400
+@@ -1460,7 +1460,9 @@ int mutt_save_confirm (const char *s, st
+
+ if (magic > 0 && !mx_access (s, W_OK))
+ {
+- if (option (OPTCONFIRMAPPEND))
++ if (option (OPTCONFIRMAPPEND) &&
++ (!TrashPath || (mutt_strcmp (s, TrashPath) != 0)))
++ /* if we're appending to the trash, there's no point in asking */
+ {
+ snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s);
+ if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO)
+diff -pruN -x'*.orig' mutt-1.5.20/mx.c mutt-1.5.20-trash/mx.c
+--- mutt-1.5.20/mx.c 2009-06-11 00:29:41.000000000 -0400
++++ mutt-1.5.20-trash/mx.c 2009-07-23 09:44:40.000000000 -0400
+@@ -773,6 +773,54 @@ static int sync_mailbox (CONTEXT *ctx, i
+ return rc;
+ }
+
++/* move deleted mails to the trash folder */
++static int trash_append (CONTEXT *ctx)
++{
++ CONTEXT *ctx_trash;
++ int i = 0;
++ struct stat st, stc;
++
++ if (!TrashPath || !ctx->deleted ||
++ (ctx->magic == M_MAILDIR && option (OPTMAILDIRTRASH)))
++ return 0;
++
++ for (;i < ctx->msgcount && (!ctx->hdrs[i]->deleted ||
++ ctx->hdrs[i]->appended); i++);
++ if (i == ctx->msgcount)
++ return 0; /* nothing to be done */
++
++ if (mutt_save_confirm (TrashPath, &st) != 0)
++ {
++ mutt_error _("message(s) not deleted");
++ return -1;
++ }
++
++ if (lstat (ctx->path, &stc) == 0 && stc.st_ino == st.st_ino
++ && stc.st_dev == st.st_dev && stc.st_rdev == st.st_rdev)
++ return 0; /* we are in the trash folder: simple sync */
++
++ if ((ctx_trash = mx_open_mailbox (TrashPath, M_APPEND, NULL)) != NULL)
++ {
++ for (i = 0 ; i < ctx->msgcount ; i++)
++ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->appended
++ && !ctx->hdrs[i]->purged
++ && mutt_append_message (ctx_trash, ctx, ctx->hdrs[i], 0, 0) == -1)
++ {
++ mx_close_mailbox (ctx_trash, NULL);
++ return -1;
++ }
++
++ mx_close_mailbox (ctx_trash, NULL);
++ }
++ else
++ {
++ mutt_error _("Can't open trash folder");
++ return -1;
++ }
++
++ return 0;
++}
++
+ /* save changes and close mailbox */
+ int mx_close_mailbox (CONTEXT *ctx, int *index_hint)
+ {
+@@ -909,6 +957,7 @@ int mx_close_mailbox (CONTEXT *ctx, int
+ if (mutt_append_message (&f, ctx, ctx->hdrs[i], 0, CH_UPDATE_LEN) == 0)
+ {
+ mutt_set_flag (ctx, ctx->hdrs[i], M_DELETE, 1);
++ mutt_set_flag (ctx, ctx->hdrs[i], M_APPENDED, 1);
+ }
+ else
+ {
+@@ -931,6 +980,14 @@ int mx_close_mailbox (CONTEXT *ctx, int
+ return 0;
+ }
+
++ /* copy mails to the trash before expunging */
++ if (purge && ctx->deleted)
++ if (trash_append (ctx) != 0)
++ {
++ ctx->closing = 0;
++ return -1;
++ }
++
+ #ifdef USE_IMAP
+ /* allow IMAP to preserve the deleted flag across sessions */
+ if (ctx->magic == M_IMAP)
+@@ -1130,6 +1187,12 @@ int mx_sync_mailbox (CONTEXT *ctx, int *
+ msgcount = ctx->msgcount;
+ deleted = ctx->deleted;
+
++ if (purge && ctx->deleted)
++ {
++ if (trash_append (ctx) == -1)
++ return -1;
++ }
++
+ #ifdef USE_IMAP
+ if (ctx->magic == M_IMAP)
+ rc = imap_sync_mailbox (ctx, purge, index_hint);
+diff -pruN -x'*.orig' mutt-1.5.20/pager.c mutt-1.5.20-trash/pager.c
+--- mutt-1.5.20/pager.c 2009-06-03 16:48:31.000000000 -0400
++++ mutt-1.5.20-trash/pager.c 2009-07-23 09:44:40.000000000 -0400
+@@ -2309,12 +2309,15 @@ search_next:
+ MAYBE_REDRAW (redraw);
+ break;
+
++ case OP_PURGE_MESSAGE:
+ case OP_DELETE:
+ CHECK_MODE(IsHeader (extra));
+ CHECK_READONLY;
+ CHECK_ACL(M_ACL_DELETE, _("delete message"));
+
+ mutt_set_flag (Context, extra->hdr, M_DELETE, 1);
++ mutt_set_flag (Context, extra->hdr, M_PURGED,
++ ch != OP_PURGE_MESSAGE ? 0 : 1);
+ if (option (OPTDELETEUNTAG))
+ mutt_set_flag (Context, extra->hdr, M_TAG, 0);
+ redraw = REDRAW_STATUS | REDRAW_INDEX;
+@@ -2641,6 +2644,7 @@ search_next:
+ CHECK_ACL(M_ACL_DELETE, _("undelete message"));
+
+ mutt_set_flag (Context, extra->hdr, M_DELETE, 0);
++ mutt_set_flag (Context, extra->hdr, M_PURGED, 0);
+ redraw = REDRAW_STATUS | REDRAW_INDEX;
+ if (option (OPTRESOLVE))
+ {
+@@ -2656,9 +2660,11 @@ search_next:
+ CHECK_ACL(M_ACL_DELETE, _("undelete message(s)"));
+
+ r = mutt_thread_set_flag (extra->hdr, M_DELETE, 0,
++ ch == OP_UNDELETE_THREAD ? 0 : 1)
++ + mutt_thread_set_flag (extra->hdr, M_PURGED, 0,
+ ch == OP_UNDELETE_THREAD ? 0 : 1);
+
+- if (r != -1)
++ if (r > -1)
+ {
+ if (option (OPTRESOLVE))
+ {
+diff -pruN -x'*.orig' mutt-1.5.20/pattern.c mutt-1.5.20-trash/pattern.c
+--- mutt-1.5.20/pattern.c 2009-06-03 16:48:31.000000000 -0400
++++ mutt-1.5.20-trash/pattern.c 2009-07-23 09:44:40.000000000 -0400
+@@ -1347,8 +1347,10 @@ int mutt_pattern_func (int op, char *pro
+ {
+ switch (op)
+ {
+- case M_DELETE:
+ case M_UNDELETE:
++ mutt_set_flag (Context, Context->hdrs[Context->v2r[i]], M_PURGED,
++ 0);
++ case M_DELETE:
+ mutt_set_flag (Context, Context->hdrs[Context->v2r[i]], M_DELETE,
+ (op == M_DELETE));
+ break;
+diff -pruN -x'*.orig' mutt-1.5.20/postpone.c mutt-1.5.20-trash/postpone.c
+--- mutt-1.5.20/postpone.c 2009-06-13 17:28:37.000000000 -0400
++++ mutt-1.5.20-trash/postpone.c 2009-07-23 09:44:40.000000000 -0400
+@@ -276,6 +276,9 @@ int mutt_get_postponed (CONTEXT *ctx, HE
+ /* finished with this message, so delete it. */
+ mutt_set_flag (PostContext, h, M_DELETE, 1);
+
++ /* and consider it saved, so that it won't be moved to the trash folder */
++ mutt_set_flag (PostContext, h, M_APPENDED, 1);
++
+ /* update the count for the status display */
+ PostCount = PostContext->msgcount - PostContext->deleted;
+
diff --git a/mail/mutt/files/patch-02 b/mail/mutt/files/patch-02
index 3717189e334f..91fa4a18c641 100644
--- a/mail/mutt/files/patch-02
+++ b/mail/mutt/files/patch-02
@@ -1,63 +1,32 @@
---- doc/Makefile.in.orig Tue Nov 6 11:12:31 2001
-+++ doc/Makefile.in Fri Jun 21 12:00:28 2002
-@@ -60,13 +60,19 @@
- topsrcdir_DOCFILES = COPYRIGHT GPL INSTALL ChangeLog \
- README NEWS TODO README.SECURITY README.SSL
+--- doc/Makefile.am.orig 2010-09-17 16:04:58.000000000 +0200
++++ doc/Makefile.am 2010-09-17 16:09:09.000000000 +0200
+@@ -47,7 +47,7 @@
--all: muttrc.man try-html try-txt
-+all: muttrc.man try-html try-txt try-latin1
+ all: makedoc-all
- try-html: ../makedoc
-- test -f manual.html || $(MAKE) manual.html || cp $(srcdir)/manual*.html ./
-+ rm -f *.html && $(MAKE) manual.html || cp $(srcdir)/manual*.html ./
-+ touch $@
+-makedoc-all: mutt.1 smime_keys.1 muttrc.man manual.html stamp-doc-rc stamp-doc-chunked manual.txt
++makedoc-all: mutt.1 smime_keys.1 muttrc.man
- try-txt: ../makedoc
-- test -f manual.txt || $(MAKE) manual.txt || cp $(srcdir)/manual.txt ./
-+ $(MAKE) manual.txt || cp $(srcdir)/manual.txt ./
-+ touch $@
-+
-+try-latin1:
-+ $(MAKE) manual.latin1 || cp $(srcdir)/manual.latin1 ./
-+ touch $@
-
- install: all instdoc
+ install-data-local: makedoc-all instdoc
$(top_srcdir)/mkinstalldirs $(DESTDIR)$(mandir)/man1
-@@ -86,10 +92,10 @@
- $(INSTALL) -m 644 $(top_srcdir)/$$f $(DESTDIR)$(docdir) ; \
+@@ -70,9 +70,6 @@
+ $(INSTALL) -m 644 $(srcdir)/$$f $(DESTDIR)$(docdir) ; \
done
- $(INSTALL) -m 644 manual.txt $(DESTDIR)$(docdir) || true
-- $(top_srcdir)/mkinstalldirs $(DESTDIR)$(docdir)/html
-- for file in manual*.html ; do \
-- $(INSTALL) -m 644 $$file $(DESTDIR)$(docdir)/html/ || true ;\
+ -$(INSTALL) -m 644 manual.txt $(DESTDIR)$(docdir)
+- -for f in $(HTML_DOCFILES) ; do \
+- $(INSTALL) -m 644 $$f $(DESTDIR)$(docdir) ; \
- done
-+ # $(top_srcdir)/mkinstalldirs $(DESTDIR)$(docdir)/html
-+ # for file in manual*.html ; do \
-+ # $(INSTALL) -m 644 $$file $(DESTDIR)$(docdir)/html/ || true ;\
-+ # done
-
- uninstall:
- -rm -f $(DESTDIR)$(mandir)/man1/mutt.1
-@@ -99,14 +105,18 @@
+ $(INSTALL) -m 644 Muttrc $(DESTDIR)$(sysconfdir)/Muttrc.dist
+ -if [ -f $(DESTDIR)$(pkgdatadir)/Muttrc ] ; then \
+ mv $(DESTDIR)$(pkgdatadir)/Muttrc* $(DESTDIR)$(sysconfdir) ; \
+@@ -103,9 +100,7 @@
check:
- manual.txt: manual.sgml
-- if sgml2txt -c latin manual ; then \
-- uniq < manual.txt | expand > _manual.txt ; \
-- rm manual.txt ; \
-+ if sgmlfmt -f ascii manual; then \
-+ uniq < manual.ascii | expand > _manual.txt ; \
-+ rm -f manual.txt manual.ascii; \
- mv _manual.txt manual.txt ;\
- fi
+ manual.txt: manual.html
+- -LC_ALL=C lynx -dump -nolist -with_backspaces -display_charset=us-ascii manual.html > $@ || \
+- LC_ALL=C w3m -dump manual.html > $@ || \
+- LC_ALL=C elinks -dump -no-numbering -no-references manual.html | sed -e 's,\\001, ,g' > $@
++ -LC_ALL=C lynx -dump -nolist -with_backspaces -display_charset=us-ascii manual.html > $@
- manual.html: manual.sgml
-- sgml2html manual || true
-+ @# sgml2html manual || true
-+ sgmlfmt -f html manual || true
-+
-+manual.latin1: manual.sgml
-+ sgmlfmt -f latin1 manual || true
+ Muttrc: stamp-doc-rc
- manual.ps: manual.sgml
- sgml2latex --output=ps manual || true
diff --git a/mail/mutt/files/patch-03 b/mail/mutt/files/patch-03
deleted file mode 100644
index b870f7f7aaec..000000000000
--- a/mail/mutt/files/patch-03
+++ /dev/null
@@ -1,13 +0,0 @@
---- doc/manual.sgml.orig Tue May 9 17:15:26 2000
-+++ doc/manual.sgml Fri May 12 11:05:40 2000
-@@ -1,5 +1,8 @@
--<!doctype linuxdoc system>
--
-+<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [
-+<!ENTITY dquot "&#34;">
-+]>
-+<linuxdoc>
-+
- <article>
-
- <title>The Mutt E-Mail Client
diff --git a/mail/mutt/files/patch-05 b/mail/mutt/files/patch-05
index 13a52d9daa40..bfbb5aa3ab9b 100644
--- a/mail/mutt/files/patch-05
+++ b/mail/mutt/files/patch-05
@@ -41,47 +41,3 @@
p = strchr (letters, ch.ch);
if (p)
{
---- browser.c.orig Fri Sep 24 01:08:08 1999
-+++ browser.c Sun Sep 26 23:46:25 1999
-@@ -750,7 +750,7 @@
- switch (mutt_multi_choice ((reverse) ?
- _("Reverse sort by (d)ate, (a)lpha, si(z)e or do(n)'t sort? ") :
- _("Sort by (d)ate, (a)lpha, si(z)e or do(n)'t sort? "),
-- _("dazn")))
-+ N_("dazn")))
- {
- case -1: /* abort */
- resort = 0;
---- commands.c.orig Wed Jul 7 02:56:24 1999
-+++ commands.c Sun Sep 26 23:46:25 1999
-@@ -337,7 +337,7 @@
- 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")))
-+ N_("dfrsotuzc")))
- {
- case -1: /* abort - don't resort */
- return -1;
---- compose.c.orig Mon Feb 12 18:02:38 2001
-+++ compose.c Fri Mar 30 17:04:09 2001
-@@ -130,7 +130,7 @@
- char input_signas[SHORT_STRING];
-
- switch (mutt_multi_choice (_("(e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "),
-- _("esabf")))
-+ N_("esabf")))
- {
- case 1: /* (e)ncrypt */
- bits |= PGPENCRYPT;
---- muttlib.c.orig Sun Apr 9 14:39:02 2000
-+++ muttlib.c Fri May 12 11:26:58 2000
-@@ -671,7 +671,7 @@
- if (*append == 0 && access (fname, F_OK) == 0)
- {
- switch (mutt_multi_choice
-- (_("File exists, (o)verwrite, (a)ppend, or (c)ancel?"), _("oac")))
-+ (_("File exists, (o)verwrite, (a)ppend, or (c)ancel?"), N_("oac")))
- {
- case -1: /* abort */
- case 3: /* cancel */
diff --git a/mail/mutt/files/patch-08 b/mail/mutt/files/patch-08
index 3e50cbd13779..69d353f64b40 100644
--- a/mail/mutt/files/patch-08
+++ b/mail/mutt/files/patch-08
@@ -1,5 +1,5 @@
---- Muttrc.orig Sat May 13 08:30:44 2000
-+++ Muttrc Sat May 13 08:32:05 2000
+--- doc/Muttrc.orig Sat May 13 08:30:44 2000
++++ doc/Muttrc Sat May 13 08:32:05 2000
@@ -629,6 +629,7 @@
# Type: boolean
# Default: yes
diff --git a/mail/mutt/files/patch-Makefile.am b/mail/mutt/files/patch-Makefile.am
new file mode 100644
index 000000000000..ac0403811365
--- /dev/null
+++ b/mail/mutt/files/patch-Makefile.am
@@ -0,0 +1,13 @@
+--- Makefile.am.orig 2008-05-19 19:00:44.000000000 +0200
++++ Makefile.am 2008-05-19 19:03:20.000000000 +0200
+@@ -136,10 +136,6 @@
+
+ install-data-local:
+ $(srcdir)/mkinstalldirs $(DESTDIR)$(sysconfdir)
+- $(INSTALL) -m 644 $(srcdir)/mime.types $(DESTDIR)$(sysconfdir)/mime.types.dist
+- -if [ ! -f $(DESTDIR)$(sysconfdir)/mime.types ]; then \
+- $(INSTALL) -m 644 $(srcdir)/mime.types $(DESTDIR)$(sysconfdir); \
+- fi
+
+ uninstall-local:
+ for i in mime.types ; do \
diff --git a/mail/mutt/files/patch-Makefile.am.doc b/mail/mutt/files/patch-Makefile.am.doc
new file mode 100644
index 000000000000..5c5854250df1
--- /dev/null
+++ b/mail/mutt/files/patch-Makefile.am.doc
@@ -0,0 +1,11 @@
+--- Makefile.am.orig2 Mon Feb 7 10:20:52 2005
++++ Makefile.am Mon Feb 7 10:29:41 2005
+@@ -10,7 +10,7 @@
+ IMAP_INCLUDES = -I$(top_srcdir)/imap
+ endif
+
+-SUBDIRS = m4 po intl doc contrib $(IMAP_SUBDIR)
++SUBDIRS = m4 po intl contrib $(IMAP_SUBDIR) . doc
+
+ bin_SCRIPTS = muttbug flea @SMIMEAUX_TARGET@
+
diff --git a/mail/mutt/files/patch-aclocal.m4 b/mail/mutt/files/patch-aclocal.m4
deleted file mode 100644
index 6635a1a90fa6..000000000000
--- a/mail/mutt/files/patch-aclocal.m4
+++ /dev/null
@@ -1,11 +0,0 @@
---- aclocal.m4.orig Fri Jul 28 11:50:25 2000
-+++ aclocal.m4 Wed Dec 5 12:10:16 2001
-@@ -62,4 +62,4 @@
--AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
--AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
--AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
--AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
-+AM_MISSING_PROG(ACLOCAL, aclocal14, $missing_dir)
-+AM_MISSING_PROG(AUTOCONF, autoconf213, $missing_dir)
-+AM_MISSING_PROG(AUTOMAKE, automake14, $missing_dir)
-+AM_MISSING_PROG(AUTOHEADER, autoheader213, $missing_dir)
diff --git a/mail/mutt/files/patch-bdb b/mail/mutt/files/patch-bdb
new file mode 100644
index 000000000000..f4a7d1d7ae62
--- /dev/null
+++ b/mail/mutt/files/patch-bdb
@@ -0,0 +1,11 @@
+--- configure.ac.orig 2009-06-09 08:50:33.000000000 +0200
++++ configure.ac 2010-01-27 18:15:31.000000000 +0100
+@@ -976,7 +976,7 @@
+ bdbpfx="$bdbpfx $d/$v"
+ done
+ done
+- BDB_VERSIONS="db-4 db4 db-4.6 db4.6 db46 db-4.5 db4.5 db45 db-4.4 db4.4 db44 db-4.3 db4.3 db43 db-4.2 db4.2 db42 db-4.1 db4.1 db41 db ''"
++ BDB_VERSIONS="db-4 db4 db-5 db5 db-5.2 db5.2 db52 db-5.1 db5.1 db51 db-5.0 db5.0 db50 db-4.8 db4.8 db48 db-4.7 db4.7 db47 db-4.6 db4.6 db46 db-4.5 db4.5 db45 db-4.4 db4.4 db44 db-4.3 db4.3 db43 db-4.2 db4.2 db42 db-4.1 db4.1 db41 db ''"
+ AC_MSG_CHECKING([for BerkeleyDB > 4.0])
+ for d in $bdbpfx; do
+ BDB_INCLUDE_DIR=""
diff --git a/mail/mutt/files/patch-color-eol b/mail/mutt/files/patch-color-eol
new file mode 100644
index 000000000000..686be16b3bcb
--- /dev/null
+++ b/mail/mutt/files/patch-color-eol
@@ -0,0 +1,62 @@
+--- mutt.h.orig Fri Jun 4 13:35:59 2004
++++ mutt.h Fri Jun 4 13:49:26 2004
+@@ -350,6 +350,7 @@
+ OPTBEEPNEW,
+ OPTBOUNCEDELIVERED,
+ OPTCHECKNEW,
++ OPTCOLORAFTEREOL,
+ OPTCOLLAPSEUNREAD,
+ OPTCONFIRMAPPEND,
+ OPTCONFIRMCREATE,
+--- init.h.orig Fri Jun 4 13:35:56 2004
++++ init.h Fri Jun 4 13:45:43 2004
+@@ -315,6 +315,12 @@
+ ** \fIcheck_new\fP is \fIunset\fP, no check for new mail is performed
+ ** while the mailbox is open.
+ */
++ { "color_after_eol", DT_BOOL, R_NONE, OPTCOLORAFTEREOL, 1 },
++ /*
++ ** .pp
++ ** When \fIset\fP, Mutt will color a line after the last character extending
++ ** to the end of the window.
++ */
+ { "collapse_unread", DT_BOOL, R_NONE, OPTCOLLAPSEUNREAD, 1 },
+ /*
+ ** .pp
+--- pager.c.orig Sat Jun 5 09:13:33 2004
++++ pager.c Sat Jun 5 09:12:31 2004
+@@ -1392,7 +1392,7 @@
+ * ncurses does an implicit clrtoeol() when you do addch('\n') so we have
+ * to make sure to reset the color *after* that
+ */
+- if (flags & M_SHOWCOLOR)
++ if (option (OPTCOLORAFTEREOL) && (flags & M_SHOWCOLOR))
+ {
+ m = ((*lineInfo)[n].continuation) ? ((*lineInfo)[n].syntax)[0].first : n;
+ if ((*lineInfo)[m].type == MT_COLOR_HEADER)
+@@ -1406,6 +1406,16 @@
+ #endif
+ }
+
++ /*
++ * reset the color back to normal. This *must* come before the
++ * addch('\n') for the color not to be filled to the right margin.
++ */
++ if (!option (OPTCOLORAFTEREOL) && (flags & M_SHOWCOLOR))
++ {
++ SETCOLOR(MT_COLOR_NORMAL);
++ BKGDSET(MT_COLOR_NORMAL);
++ }
++
+ /* ncurses always wraps lines when you get to the right side of the
+ * screen, but S-Lang seems to only wrap if the next character is *not*
+ * a newline (grr!).
+@@ -1420,7 +1430,7 @@
+ * addch('\n'), otherwise the color for this line will not be
+ * filled to the right margin.
+ */
+- if (flags & M_SHOWCOLOR)
++ if (option (OPTCOLORAFTEREOL) && (flags & M_SHOWCOLOR))
+ {
+ SETCOLOR(MT_COLOR_NORMAL);
+ BKGDSET(MT_COLOR_NORMAL);
diff --git a/mail/mutt/files/patch-configure.ac b/mail/mutt/files/patch-configure.ac
new file mode 100644
index 000000000000..993e53daf38d
--- /dev/null
+++ b/mail/mutt/files/patch-configure.ac
@@ -0,0 +1,9 @@
+--- configure.ac.orig 2010-08-24 09:34:21.000000000 -0700
++++ configure.ac 2012-05-03 18:14:34.000000000 -0700
+@@ -29,6 +29,2 @@
+ AC_ISC_POSIX
+-AM_C_PROTOTYPES
+-if test "x$U" != "x"; then
+- AC_MSG_ERROR(Compiler not ANSI compliant)
+-fi
+ AC_PROG_CPP
diff --git a/mail/mutt/files/patch-configure.in b/mail/mutt/files/patch-configure.in
deleted file mode 100644
index e255741da094..000000000000
--- a/mail/mutt/files/patch-configure.in
+++ /dev/null
@@ -1,14 +0,0 @@
---- configure.in.orig 2007-05-26 17:58:12.000000000 -0700
-+++ configure.in 2012-05-03 18:04:49.000000000 -0700
-@@ -31,6 +31,2 @@
- AC_ISC_POSIX
--AM_C_PROTOTYPES
--if test "x$U" != "x"; then
-- AC_MSG_ERROR(Compiler not ANSI compliant)
--fi
- AC_PROG_CPP
-@@ -629,3 +625,3 @@
- if test x$GCC = xyes -a $mutt_cv_warnings = yes; then
-- CFLAGS="-Wall -pedantic $CFLAGS"
-+ CFLAGS="-Wall $CFLAGS"
- fi
diff --git a/mail/mutt/files/patch-contrib-Makefile.am b/mail/mutt/files/patch-contrib-Makefile.am
new file mode 100644
index 000000000000..2328b65e1b37
--- /dev/null
+++ b/mail/mutt/files/patch-contrib-Makefile.am
@@ -0,0 +1,11 @@
+--- contrib/Makefile.am.orig Tue Jul 18 20:04:14 2006
++++ contrib/Makefile.am Wed Aug 30 16:15:04 2006
+@@ -2,7 +2,7 @@
+
+ subdir = contrib
+
+-SAMPLES = Mush.rc Pine.rc gpg.rc pgp2.rc pgp5.rc pgp6.rc Tin.rc \
++SAMPLES = Mush.rc Pine.rc gpg.rc pgp2.rc pgp6.rc Tin.rc \
+ sample.muttrc sample.mailcap sample.muttrc-tlr \
+ colors.default colors.linux smime.rc \
+ ca-bundle.crt smime_keys_test.pl
diff --git a/mail/mutt/files/patch-contrib-Makefile.in b/mail/mutt/files/patch-contrib-Makefile.in
deleted file mode 100644
index 71e216bd607c..000000000000
--- a/mail/mutt/files/patch-contrib-Makefile.in
+++ /dev/null
@@ -1,11 +0,0 @@
---- contrib/Makefile.in.orig Mon Jun 4 19:14:31 2001
-+++ contrib/Makefile.in Mon Mar 21 08:12:59 2005
-@@ -20,7 +20,7 @@
-
- subdir = contrib
-
--SAMPLES = Mush.rc Pine.rc gpg.rc pgp2.rc pgp5.rc pgp6.rc Tin.rc \
-+SAMPLES = Mush.rc Pine.rc gpg.rc pgp2.rc pgp6.rc Tin.rc \
- sample.muttrc sample.mailcap sample.muttrc-tlr
-
- DISTFILES = Makefile.in language.txt language50.txt \
diff --git a/mail/mutt/files/patch-crypt-gpgme.c b/mail/mutt/files/patch-crypt-gpgme.c
new file mode 100644
index 000000000000..2fb9536f3cd6
--- /dev/null
+++ b/mail/mutt/files/patch-crypt-gpgme.c
@@ -0,0 +1,10 @@
+--- ./crypt-gpgme.c.orig 2009-07-01 21:28:51.000000000 -0400
++++ ./crypt-gpgme.c 2009-07-01 21:31:52.000000000 -0400
+@@ -342,6 +342,7 @@
+ gpgme_error_t err;
+ gpgme_ctx_t ctx;
+
++ gpgme_check_version (NULL);
+ if (!GpgmeLocaleSet)
+ {
+ gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL));
diff --git a/mail/mutt/files/patch-date-conditional b/mail/mutt/files/patch-date-conditional
new file mode 100644
index 000000000000..7912815f0bce
--- /dev/null
+++ b/mail/mutt/files/patch-date-conditional
@@ -0,0 +1,147 @@
+--- PATCHES~ never
++++ PATCHES Thu Jun 13 16:25:05 CDT 2002
+@@ -0,0 +1 @@
++dgc.deepif.1
+diff -Pur mutt-1.5.1-base/muttlib.c mutt-1.5.1/muttlib.c
+--- muttlib.c Tue Mar 26 16:47:06 2002
++++ muttlib.c Thu Jun 13 15:28:20 2002
+@@ -978,6 +978,12 @@
+ count = 0;
+ while (count < sizeof (ifstring) && *src && *src != '?' && *src != '&')
+ {
++ if (*src == '\\')
++ {
++ src++;
++ if (!*src)
++ break;
++ }
+ *cp++ = *src++;
+ count++;
+ }
+@@ -990,7 +996,13 @@
+ count = 0;
+ while (count < sizeof (elsestring) && *src && *src != '?')
+ {
+- *cp++ = *src++;
++ if (*src == '\\')
++ {
++ src++;
++ if (!*src)
++ break;
++ }
++ *cp++ = *src++;
+ count++;
+ }
+ *cp = 0;
+Index: PATCHES
+===================================================================
+--- PATCHES (revision 22)
++++ PATCHES (revision 22)
+@@ -0,0 +1 @@
++patch-1.5.0.ats.date_conditional.1
+Index: muttlib.c
+===================================================================
+--- muttlib.c (revision 22)
++++ muttlib.c (revision 22)
+@@ -944,7 +944,16 @@
+ if (*src == '?')
+ {
+ flags |= M_FORMAT_OPTIONAL;
+- src++;
++ ch = *(++src); /* save the character to switch on */
++ cp = prefix;
++ ++src;
++ count = 0;
++ while (count < sizeof (prefix) && *src != '?')
++ {
++ *cp++ = *src++;
++ count++;
++ }
++ *cp = 0;
+ }
+ else
+ {
+@@ -960,12 +969,12 @@
+ count++;
+ }
+ *cp = 0;
+- }
+
+- if (!*src)
+- break; /* bad format */
++ if (!*src)
++ break; /* bad format */
+
+- ch = *src++; /* save the character to switch on */
++ ch = *src++; /* save the character to switch on */
++ }
+
+ if (flags & M_FORMAT_OPTIONAL)
+ {
+--- hdrline.c.orig Tue Jun 29 15:01:28 2004
++++ hdrline.c Tue Jun 29 15:02:59 2004
+@@ -316,6 +316,64 @@
+ const char *cp;
+ struct tm *tm;
+ time_t T;
++ int i = 0, invert = 0;
++
++ if (optional && (op == '[' || op == '(')) {
++ char *is;
++ int d;
++ T = time(NULL);
++ tm = localtime(&T);
++ d = (T + tm->tm_gmtoff) % 86400;
++ T -= (op == '(') ? hdr->received : hdr->date_sent;
++
++ is = (char *)prefix;
++ if( *is == '>' ) {
++ invert = 1;
++ ++is;
++ }
++
++ while( *is && *is != '?' ) {
++ int t = strtol (is, &is, 10);
++ switch (*(is++)) {
++ case '?':
++ break;
++ case 'y':
++ t *= 365 * 24 * 60 * 60;
++ break;
++ case 'M':
++ t *= 30 * 24 * 60 * 60;
++ break;
++ case 'w':
++ t *= 7 * 24 * 60 * 60;
++ break;
++ case 'd':
++ t *= 24 * 60 * 60;
++ break;
++ case 't':
++ if (t > 1) {
++ t = (t-1) * 24 * 60 * 60;
++ } else {
++ t = 0;
++ }
++ t += d;
++ break;
++ case 'h':
++ t *= 60 * 60;
++ break;
++ case 'm':
++ t *= 60;
++ break;
++ }
++ i += t;
++ }
++
++ if (i < 0)
++ i *= -1;
++
++ if( (T > i || T < -1*i) ^ invert )
++ optional = 0;
++ break;
++ }
+
+ p = dest;
+
diff --git a/mail/mutt/files/patch-doc-manual.xml.head b/mail/mutt/files/patch-doc-manual.xml.head
new file mode 100644
index 000000000000..82ab62c1cbe8
--- /dev/null
+++ b/mail/mutt/files/patch-doc-manual.xml.head
@@ -0,0 +1,10 @@
+--- doc/manual.xml.head.orig 2009-06-22 08:35:06.000000000 +0200
++++ doc/manual.xml.head 2009-06-22 08:37:31.000000000 +0200
+@@ -1,6 +1,6 @@
+ <?xml version="1.0" standalone="no"?>
+ <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+- "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
++ "/usr/local/share/xml/docbook/4.2/docbookx.dtd">
+ <book>
+
+ <bookinfo>
diff --git a/mail/mutt/files/patch-doc-mutt.man b/mail/mutt/files/patch-doc-mutt.man
deleted file mode 100644
index 46e086721a76..000000000000
--- a/mail/mutt/files/patch-doc-mutt.man
+++ /dev/null
@@ -1,34 +0,0 @@
---- doc/mutt.man.orig Wed Jul 24 10:41:31 2002
-+++ doc/mutt.man Sun Oct 26 11:06:36 2003
-@@ -136,9 +136,9 @@
- User's personal mapping between MIME types and file extensions.
- .IP "/etc/mime.types"
- System mapping between MIME types and file extensions.
--.IP "/usr/local/bin/mutt_dotlock"
-+.IP "${PREFIX}/bin/mutt_dotlock"
- The privileged dotlocking program.
--.IP "/usr/local/doc/mutt/manual.txt"
-+.IP "${DOCSDIR}/manual.txt"
- The Mutt manual.
- .SH BUGS
- .PP
---- doc/muttrc.man Sun Oct 26 11:09:09 2003
-+++ doc/muttrc.man Sun Oct 26 11:08:48 2003
-@@ -990,7 +972,7 @@
- .B dotlock_program
- .nf
- Type: path
--Default: \(lq/usr/local/bin/mutt_dotlock\(rq
-+Default: \(lq${PREFIX}/bin/mutt_dotlock\(rq
- .fi
- .IP
- Contains the path of the mutt_dotlock (8) binary to be used by
-@@ -3970,7 +3952,7 @@
- instead of a raw socket. You may be able to use this to set up
- preauthenticated connections to your IMAP/POP3 server. Example:
- .IP
--tunnel=\(rqssh -q mailhost.net /usr/local/libexec/imapd\(rq
-+tunnel=\(rqssh -q mailhost.net ${PREFIX}/libexec/imapd\(rq
- .IP
- NOTE: For this example to work you must be able to log in to the remote
- machine without having to enter a password.
diff --git a/mail/mutt/files/patch-examples b/mail/mutt/files/patch-examples
index 2d24771033f7..a2c8815720db 100644
--- a/mail/mutt/files/patch-examples
+++ b/mail/mutt/files/patch-examples
@@ -1,50 +1,109 @@
---- contrib/Makefile.in.orig Mon Jun 4 19:14:31 2001
-+++ contrib/Makefile.in Wed Mar 26 11:45:15 2003
-@@ -12,6 +12,7 @@
- mandir = @mandir@
- srcdir = @srcdir@
- docdir = @docdir@
+--- contrib/Makefile.am.orig Tue Jul 18 20:04:14 2006
++++ contrib/Makefile.am Wed Aug 30 16:05:33 2006
+@@ -1,6 +1,7 @@
+ # $Id: Makefile.am,v 3.1 2006/07/18 18:04:14 brendan Exp $
+
+ subdir = contrib
+samplesdir = @samplesdir@
- top_srcdir = @top_srcdir@
- top_builddir = ..
- INSTALL = @INSTALL@
-@@ -37,12 +38,12 @@
- check:
- install:
+ SAMPLES = Mush.rc Pine.rc gpg.rc pgp2.rc pgp5.rc pgp6.rc Tin.rc \
+ sample.muttrc sample.mailcap sample.muttrc-tlr \
+@@ -14,12 +15,12 @@
+ iconv/make.sh
+
+ install-data-local:
- $(top_srcdir)/mkinstalldirs $(DESTDIR)$(docdir)/samples $(DESTDIR)$(docdir)/samples/iconv
+ $(top_srcdir)/mkinstalldirs $(DESTDIR)$(samplesdir) $(DESTDIR)$(samplesdir)/iconv
for f in $(SAMPLES) ; do \
- $(INSTALL) -m 644 $(srcdir)/$$f $(DESTDIR)$(docdir)/samples ; \
-+ $(INSTALL) -m 644 $(srcdir)/$$f $(DESTDIR)$(samplesdir); \
++ $(INSTALL) -m 644 $(srcdir)/$$f $(DESTDIR)$(samplesdir) ; \
done
for f in $(srcdir)/iconv/*.rc ; do \
- $(INSTALL) -m 644 $$f $(DESTDIR)$(docdir)/samples/iconv ; \
-+ $(INSTALL) -m 644 $$f $(DESTDIR)$(samplesdir)/iconv ; \
++ $(INSTALL) -m 644 $$f $(DESTDIR)$(samplesdir)/iconv ; \
done
- # Nothing needs to be done - uninstall in doc removes samples as well.
---- init.h.orig Wed Mar 26 11:50:36 2003
-+++ init.h Wed Mar 26 12:54:37 2003
-@@ -1347,8 +1347,8 @@
+ uninstall-local:
+--- init.h.orig 2009-02-06 13:27:52.000000000 +0100
++++ init.h 2009-02-06 13:34:09.000000000 +0100
+@@ -1808,9 +1808,8 @@
** .pp
** For examples on how to configure these formats for the various versions
- ** of PGP which are floating around, see the pgp*.rc and gpg.rc files in
-- ** the samples/ subdirectory which has been installed on your system
+ ** of PGP which are floating around, see the pgp and gpg sample configuration files in
+- ** the \fCsamples/\fP subdirectory which has been installed on your system
- ** alongside the documentation.
-+ ** the share/examples/mutt subdirectory which has been installed on your
-+ ** system.
+- ** (PGP only)
++ ** the \fCshare/examples/mutt/\fP subdirectory which has been installed on
++ ** your system. (PGP only)
*/
{ "pgp_getkeys_command", DT_STR, R_NONE, UL &PgpGetkeysCommand, 0},
/*
---- Makefile.am.orig Wed Mar 26 13:13:10 2003
-+++ Makefile.am Wed Mar 26 13:25:40 2003
-@@ -13,7 +13,7 @@
+@@ -2017,9 +2016,8 @@
+ ** .de
+ ** .pp
+ ** For examples on how to configure these formats, see the \fCsmime.rc\fP in
+- ** the \fCsamples/\fP subdirectory which has been installed on your system
+- ** alongside the documentation.
+- ** (S/MIME only)
++ ** the \fCshare/examples/mutt/\fP subdirectory which has been installed on
++ ** your system. (S/MIME only)
+ */
+ { "smime_verify_command", DT_STR, R_NONE, UL &SmimeVerifyCommand, 0},
+ /*
+--- INSTALL.orig Mon Nov 25 15:16:46 2002
++++ INSTALL Wed Mar 26 15:59:57 2003
+@@ -225,13 +225,13 @@
+ need to tell mutt about implementation-defined names for some
+ character sets. Sample configuration files for various systems can
+ be found in the directory contrib/iconv/ in this source
+-distribution, and will be installed in the samples/iconv directory
++distribution, and will be installed in the share/examples/mutt/iconv directory
+ as part of mutt's documentation.
+
+ In order to use these sample configuration files, just put a line
+ like
+
+- source /usr/local/doc/mutt/samples/iconv/iconv.osf1-4.0d.rc
++ source /usr/local/share/examples/mutt/iconv/iconv.osf1-4.0d.rc
+
+ into your system's global Muttrc, which normally resides in /etc or
+ /usr/local/etc.
+--- doc/manual.txt.orig 2009-06-14 20:54:56.000000000 +0200
++++ doc/manual.txt 2009-06-22 15:11:26.000000000 +0200
+@@ -3225,9 +3225,9 @@
+ shows that arguments can be quoted: the script will receive the expanded string
+ between the single quotes as the only argument.
+
+-A practical example is the mutt_xtitle script installed in the samples
+-subdirectory of the Mutt documentation: it can be used as filter for
+-$status_format to set the current terminal's title, if supported.
++A practical example is the mutt_xtitle script installed in the
++share/examples/mutt/ subdirectory of the Mutt documentation: it can be used as
++filter for $status_format to set the current terminal's title, if supported.
+
+ 29.4. Padding
+
+@@ -7740,8 +7740,8 @@
+
+ For examples on how to configure these formats for the various versions of PGP
+ which are floating around, see the pgp and gpg sample configuration files in
+-the samples/ subdirectory which has been installed on your system alongside the
+-documentation. (PGP only)
++the share/examples/mutt/ subdirectory which has been installed on your system.
++(PGP only)
+
+ 3.158. pgp_decrypt_command
+
+@@ -8751,9 +8751,9 @@
+ | |$smime_ca_location?. |
+ +-----------------------------------------------------------------------------+
- bin_SCRIPTS = muttbug flea
+-For examples on how to configure these formats, see the smime.rc in the samples
+-/ subdirectory which has been installed on your system alongside the
+-documentation. (S/MIME only)
++For examples on how to configure these formats, see the smime.rc in the
++share/examples/mutt/ subdirectory which has been installed on your system.
++(S/MIME only)
--BUILT_SOURCES = keymap_defs.h patchlist.c
-+BUILT_SOURCES = keymap_defs.h patchlist.c Muttrc
+ 3.244. smime_decrypt_use_default_key
- bin_PROGRAMS = mutt @DOTLOCK_TARGET@ @PGPAUX_TARGET@
- mutt_SOURCES = $(BUILT_SOURCES) \
diff --git a/mail/mutt/files/patch-gnutls-CN-validation b/mail/mutt/files/patch-gnutls-CN-validation
new file mode 100644
index 000000000000..e19608b86571
--- /dev/null
+++ b/mail/mutt/files/patch-gnutls-CN-validation
@@ -0,0 +1,29 @@
+--- mutt_ssl_gnutls.c.orig
++++ mutt_ssl_gnutls.c
+@@ -999,6 +999,7 @@
+ unsigned int cert_list_size = 0;
+ gnutls_certificate_status certstat;
+ int certerr, i, preauthrc, savedcert, rc = 0;
++ int rcpeer;
+
+ if (gnutls_auth_get_type (state) != GNUTLS_CRD_CERTIFICATE)
+ {
+@@ -1024,6 +1025,9 @@
+ for (i = 0; i < cert_list_size; i++) {
+ rc = tls_check_preauth(&cert_list[i], certstat, conn->account.host, i,
+ &certerr, &savedcert);
++ if (i == 0)
++ rcpeer = rc;
++
+ preauthrc += rc;
+
+ if (savedcert)
+@@ -1049,7 +1053,7 @@
+ dprint (1, (debugfile, "error trusting certificate %d: %d\n", i, rc));
+
+ certstat = tls_verify_peers (state);
+- if (!certstat)
++ if (!certstat && !rcpeer)
+ return 1;
+ }
+ }
diff --git a/mail/mutt/files/patch-imap-message.c b/mail/mutt/files/patch-imap-message.c
new file mode 100644
index 000000000000..7db99b5da207
--- /dev/null
+++ b/mail/mutt/files/patch-imap-message.c
@@ -0,0 +1,15 @@
+This patch fixes a segfault that happens when the IMAP server sends some
+additional flags for the same message ID, see upstream bug
+http://bugs.mutt.org/3288
+
+--- imap/message.c
++++ imap/message.c
+@@ -288,7 +288,7 @@
+ continue;
+ }
+ /* May receive FLAGS updates in a separate untagged response (#2935) */
+- if (idx < ctx->msgcount)
++ if (ctx->hdrs[idx] != NULL)
+ {
+ dprint (2, (debugfile, "imap_read_headers: message %d is not new\n",
+ h.sid));
diff --git a/mail/mutt/files/patch-m4-gssapi.m4 b/mail/mutt/files/patch-m4-gssapi.m4
deleted file mode 100644
index 2425cde4f2b8..000000000000
--- a/mail/mutt/files/patch-m4-gssapi.m4
+++ /dev/null
@@ -1,33 +0,0 @@
---- m4/gssapi.m4.orig Wed Apr 17 19:05:04 2002
-+++ m4/gssapi.m4 Mon Oct 16 10:59:34 2006
-@@ -6,10 +6,13 @@
- dnl if it is set and not "yes".
- dnl Defines GSSAPI_CFLAGS and GSSAPI_LIBS if found.
- dnl Defines GSSAPI_IMPL to "Heimdal", "MIT", or "OldMIT", or "none" if not found
--AC_DEFUN(MUTT_AM_PATH_GSSAPI,
-+AC_DEFUN([MUTT_AM_PATH_GSSAPI],
- [
- GSSAPI_PREFIX=[$]$1
- GSSAPI_IMPL="none"
-+ saved_CPPFLAGS="$CPPFLAGS"
-+ saved_LDFLAGS="$LDFLAGS"
-+ saved_LIBS="$LIBS"
- dnl First try krb5-config
- if test "$GSSAPI_PREFIX" != "yes"
- then
-@@ -24,14 +27,11 @@
- GSSAPI_LIBS="$MUTTLIBS `$KRB5CFGPATH --libs gssapi`"
- case "`$KRB5CFGPATH --version`" in
- "Kerberos 5 "*) GSSAPI_IMPL="MIT";;
-- [hH]eimdal*) GSSAPI_IMPL="Heimdal";;
-+ ?eimdal*) GSSAPI_IMPL="Heimdal";;
- *) GSSAPI_IMPL="Unknown";;
- esac
- else
- dnl No krb5-config, run the old code
-- saved_CPPFLAGS="$CPPFLAGS"
-- saved_LDFLAGS="$LDFLAGS"
-- saved_LIBS="$LIBS"
- if test "$GSSAPI_PREFIX" != "yes"
- then
- GSSAPI_CFLAGS="-I$GSSAPI_PREFIX/include"
diff --git a/mail/mutt/files/patch-mktemp b/mail/mutt/files/patch-mktemp
index 8fc82de528d7..16521f758607 100644
--- a/mail/mutt/files/patch-mktemp
+++ b/mail/mutt/files/patch-mktemp
@@ -1,15 +1,23 @@
---- muttlib.c.orig Fri May 7 17:30:35 2004
-+++ muttlib.c Fri May 7 17:32:13 2004
-@@ -656,7 +656,11 @@
+--- muttlib.c.orig 2010-09-19 09:58:24.000000000 +0200
++++ muttlib.c 2010-09-19 10:36:26.000000000 +0200
+@@ -788,14 +788,15 @@
- void mutt_mktemp (char *s)
+ void _mutt_mktemp (char *s, size_t slen, const char *src, int line)
{
-- snprintf (s, _POSIX_PATH_MAX, "%s/mutt-%s-%d-%d", NONULL (Tempdir), NONULL(Hostname), (int) getpid (), Counter++);
-+ char t[7];
-+ snprintf (t, 7, "-%05d", Counter++);
-+ snprintf (s, _POSIX_PATH_MAX-6, "%s/mutt-%s-XXXXXXXX", NONULL(Tempdir), NONULL(Hostname));
-+ mktemp (s);
-+ strncat(s, t, 6);
- unlink (s);
+- size_t n = snprintf (s, slen, "%s/mutt-%s-%d-%d-%ld%ld", NONULL (Tempdir), NONULL (Hostname),
+- (int) getuid (), (int) getpid (), random (), random ());
++ size_t n = snprintf (s, slen, "%s/mutt-%s-XXXXXXXX", NONULL (Tempdir), NONULL (Hostname));
+ if (n >= slen)
+ dprint (1, (debugfile, "%s:%d: ERROR: insufficient buffer space to hold temporary filename! slen=%zu but need %zu\n",
+ src, line, slen, n));
+- dprint (3, (debugfile, "%s:%d: mutt_mktemp returns \"%s\".\n", src, line, s));
+- if (unlink (s) && errno != ENOENT)
+- dprint (1, (debugfile, "%s:%d: ERROR: unlink(\"%s\"): %s (errno %d)\n", src, line, s, strerror (errno), errno));
++ if (mktemp (s)) {
++ dprint (3, (debugfile, "%s:%d: mutt_mktemp returns \"%s\".\n", src, line, s));
++ } else {
++ dprint (1, (debugfile, "%s:%d: ERROR: mktemp(\"%s\"): %s (errno %d)\n", src, line, s, strerror (errno), errno));
++ }
}
+ void mutt_free_alias (ALIAS **p)
diff --git a/mail/mutt/files/patch-nbsp b/mail/mutt/files/patch-nbsp
new file mode 100644
index 000000000000..e996a05d1ea0
--- /dev/null
+++ b/mail/mutt/files/patch-nbsp
@@ -0,0 +1,22 @@
+diff --git a/pager.c b/pager.c
+--- pager.c
++++ pager.c
+@@ -1187,10 +1187,17 @@
+ last_special = special;
+ }
+
+- if (IsWPrint (wc))
++ if (IsWPrint (wc) || (Charset_is_utf8 && wc == 0x00A0))
+ {
+ if (wc == ' ')
+ space = ch;
++ else if (Charset_is_utf8 && wc == 0x00A0)
++ {
++ /* Convert non-breaking space to normal space. The local variable
++ * `space' is not set here so that the caller of this function won't
++ * attempt to wrap at this character. */
++ wc = ' ';
++ }
+ t = wcwidth (wc);
+ if (col + t > wrap_cols)
+ break;
diff --git a/mail/mutt/files/patch-pgp b/mail/mutt/files/patch-pgp
new file mode 100644
index 000000000000..b7d0f36bf499
--- /dev/null
+++ b/mail/mutt/files/patch-pgp
@@ -0,0 +1,134 @@
+--- crypt-gpgme.c~ 2010-09-10 07:41:33.584316201 +1000
++++ crypt-gpgme.c 2010-09-10 08:22:32.948976728 +1000
+@@ -2003,12 +2003,14 @@
+ {
+ if (!mutt_strncmp ("-----BEGIN PGP ", buf, 15))
+ {
+- if (!mutt_strcmp ("MESSAGE-----\n", buf + 15))
++ if (!mutt_strcmp ("MESSAGE-----\n", buf + 15) ||
++ !mutt_strcmp ("MESSAGE-----\r\n", buf + 15))
+ {
+ enc = 1;
+ break;
+ }
+- else if (!mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15))
++ else if (!mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) ||
++ !mutt_strcmp ("SIGNED MESSAGE-----\r\n", buf + 15))
+ {
+ sgn = 1;
+ break;
+@@ -2128,7 +2130,8 @@
+ continue;
+ }
+
+- if (!mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n"))
++ if (!mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") ||
++ !mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\r\n"))
+ break;
+
+ if (armor_header)
+@@ -2196,14 +2199,17 @@
+ clearsign = 0;
+ start_pos = last_pos;
+
+- if (!mutt_strcmp ("MESSAGE-----\n", buf + 15))
++ if (!mutt_strcmp ("MESSAGE-----\n", buf + 15) ||
++ !mutt_strcmp ("MESSAGE-----\r\n", buf + 15))
+ needpass = 1;
+- else if (!mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15))
++ else if (!mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) ||
++ !mutt_strcmp ("SIGNED MESSAGE-----\r\n", buf + 15))
+ {
+ clearsign = 1;
+ needpass = 0;
+ }
+- else if (!mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15))
++ else if (!mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) ||
++ !mutt_strcmp ("PUBLIC KEY BLOCK-----\r\n", buf + 15))
+ {
+ needpass = 0;
+ pgp_keyblock = 1;
+--- pgp.c~ 2009-05-31 03:20:08.000000000 +1000
++++ pgp.c 2010-09-10 08:27:40.317064142 +1000
+@@ -219,7 +219,8 @@
+ continue;
+ }
+
+- if (mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") == 0)
++ if (mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\n") == 0 ||
++ mutt_strcmp (buf, "-----BEGIN PGP SIGNATURE-----\r\n") == 0)
+ break;
+
+ if (armor_header)
+@@ -287,14 +288,17 @@
+ clearsign = 0;
+ start_pos = last_pos;
+
+- if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0)
++ if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0 ||
++ mutt_strcmp ("MESSAGE-----\r\n", buf + 15) == 0)
+ needpass = 1;
+- else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0)
++ else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0 ||
++ mutt_strcmp ("SIGNED MESSAGE-----\r\n", buf + 15) == 0)
+ {
+ clearsign = 1;
+ needpass = 0;
+ }
+- else if (!mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15))
++ else if (!mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) ||
++ !mutt_strcmp ("PUBLIC KEY BLOCK-----\r\n", buf + 15))
+ {
+ needpass = 0;
+ pgp_keyblock = 1;
+@@ -327,10 +331,14 @@
+
+ fputs (buf, tmpfp);
+
+- if ((needpass && mutt_strcmp ("-----END PGP MESSAGE-----\n", buf) == 0) ||
+- (!needpass
+- && (mutt_strcmp ("-----END PGP SIGNATURE-----\n", buf) == 0
+- || mutt_strcmp ("-----END PGP PUBLIC KEY BLOCK-----\n",buf) == 0)))
++ if ((needpass &&
++ (mutt_strcmp ("-----END PGP MESSAGE-----\n", buf) == 0 ||
++ mutt_strcmp ("-----END PGP MESSAGE-----\r\n", buf) == 0)) ||
++ (!needpass &&
++ (mutt_strcmp ("-----END PGP SIGNATURE-----\n", buf) == 0 ||
++ mutt_strcmp ("-----END PGP SIGNATURE-----\r\n", buf) == 0 ||
++ mutt_strcmp ("-----END PGP PUBLIC KEY BLOCK-----\n",buf) == 0 ||
++ mutt_strcmp ("-----END PGP PUBLIC KEY BLOCK-----\r\n",buf) == 0)))
+ break;
+ /* remember optional Charset: armor header as defined by RfC4880 */
+ if (mutt_strncmp ("Charset: ", buf, 9) == 0)
+@@ -554,11 +562,14 @@
+ {
+ if (mutt_strncmp ("-----BEGIN PGP ", buf, 15) == 0)
+ {
+- if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0)
++ if (mutt_strcmp ("MESSAGE-----\n", buf + 15) == 0 ||
++ mutt_strcmp ("MESSAGE-----\r\n", buf + 15) == 0)
+ enc = 1;
+- else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0)
++ else if (mutt_strcmp ("SIGNED MESSAGE-----\n", buf + 15) == 0 ||
++ mutt_strcmp ("SIGNED MESSAGE-----\r\n", buf + 15) == 0)
+ sgn = 1;
+- else if (mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0)
++ else if (mutt_strcmp ("PUBLIC KEY BLOCK-----\n", buf + 15) == 0 ||
++ mutt_strcmp ("PUBLIC KEY BLOCK-----\r\n", buf + 15) == 0)
+ key = 1;
+ }
+ }
+@@ -1067,9 +1078,11 @@
+ */
+ while (fgets (buffer, sizeof (buffer) - 1, pgpout) != NULL)
+ {
+- if (mutt_strcmp ("-----BEGIN PGP MESSAGE-----\n", buffer) == 0)
++ if (mutt_strcmp ("-----BEGIN PGP MESSAGE-----\n", buffer) == 0 ||
++ mutt_strcmp ("-----BEGIN PGP MESSAGE-----\r\n", buffer) == 0)
+ fputs ("-----BEGIN PGP SIGNATURE-----\n", fp);
+- else if (mutt_strcmp("-----END PGP MESSAGE-----\n", buffer) == 0)
++ else if (mutt_strcmp("-----END PGP MESSAGE-----\n", buffer) == 0 ||
++ mutt_strcmp("-----END PGP MESSAGE-----\r\n", buffer) == 0)
+ fputs ("-----END PGP SIGNATURE-----\n", fp);
+ else
+ fputs (buffer, fp);
diff --git a/mail/mutt/files/patch-smime-self b/mail/mutt/files/patch-smime-self
new file mode 100644
index 000000000000..d8b0e7b8d336
--- /dev/null
+++ b/mail/mutt/files/patch-smime-self
@@ -0,0 +1,66 @@
+Base: http://descolada.dartmouth.edu/mutt/patch-1.5.4+-ow.smime-encrypt-self.2
+--- crypt.c 7 Mar 2003 08:23:27 -0000 3.17
++++ crypt.c 7 May 2003 14:57:00 -0000
+@@ -246,8 +246,18 @@
+ if ((WithCrypto & APPLICATION_SMIME)
+ && (msg->security & APPLICATION_SMIME))
+ {
+- if (!(tmp_pbody = crypt_smime_build_smime_entity (tmp_smime_pbody,
+- keylist)))
++ char *new_keylist = keylist;
++
++ if (SmimeDefaultKey && query_quadoption(OPT_SMIMEENCRYPTSELF, _("Encrypt message to S/MIME Default Key also?")) == M_YES)
++ {
++ int size = mutt_strlen(keylist) + mutt_strlen (SmimeDefaultKey) + 2; /* +1 for NULL, +1 for \n */
++ new_keylist = safe_malloc(size);
++ snprintf(new_keylist, size, "%s%s\n", keylist, SmimeDefaultKey);
++ }
++
++ tmp_pbody = crypt_smime_build_smime_entity (tmp_smime_pbody, new_keylist);
++ safe_free((void **)&new_keylist);
++ if (!tmp_pbody)
+ {
+ /* signed ? free it! */
+ return (-1);
+--- init.h.orig 2009-02-06 13:43:14.000000000 +0100
++++ init.h 2009-02-06 13:46:53.000000000 +0100
+@@ -1957,6 +1957,11 @@
+ ** not used.
+ ** (S/MIME only)
+ */
++ { "smime_encrypt_self", DT_QUAD, R_NONE, OPT_SMIMEENCRYPTSELF, 1 },
++ /*
++ ** .pp
++ ** Encrypt the message to smime_default_key too.
++ */
+ { "smime_encrypt_with", DT_STR, R_NONE, UL &SmimeCryptAlg, 0 },
+ /*
+ ** .pp
+diff -u -d -b -B -r3.18 mutt.h
+--- mutt.h.orig Thu Nov 6 08:15:51 2003
++++ mutt.h Thu Nov 6 08:16:43 2003
+@@ -275,6 +275,7 @@
+ OPT_DELETE,
+ OPT_FORWEDIT,
+ OPT_INCLUDE,
++ OPT_SMIMEENCRYPTSELF,
+ OPT_MFUPTO,
+ OPT_MIMEFWD,
+ OPT_MIMEFWDREST,
+--- contrib/smime.rc.orig Sat Mar 2 13:11:35 2002
++++ contrib/smime.rc Sat Oct 25 17:56:28 2003
+@@ -23,9 +23,12 @@
+
+ # The (default) keyfile for signing/decrypting. Uncomment the following
+ # line and replace the keyid with your own.
+-set smime_default_key="12345678.0"
++# set smime_default_key="12345678.0"
++# Uncomment the following line in addition to the one above, if you want that
++# all encrypted messages are also encrypted with your default key.
++# set smime_encrypt_self = yes
+
+-# Uncommen to make mutt ask what key to use when trying to decrypt a message.
++# Uncomment to make mutt ask what key to use when trying to decrypt a message.
+ # It will use the default key above (if that was set) else.
+ # unset smime_decrypt_use_default_key
+
diff --git a/mail/mutt/files/patch-smime-sender b/mail/mutt/files/patch-smime-sender
new file mode 100644
index 000000000000..a8a9cacf5559
--- /dev/null
+++ b/mail/mutt/files/patch-smime-sender
@@ -0,0 +1,54 @@
+--- commands.c.orig Thu Mar 20 20:37:21 2003
++++ commands.c Thu Mar 20 20:40:29 2003
+@@ -178,7 +178,7 @@
+ {
+ if (cur->security & GOODSIGN)
+ {
+- if (!crypt_smime_verify_sender(cur))
++ if (option(OPTSMIMENOSENDER) || !crypt_smime_verify_sender(cur))
+ mutt_message ( _("S/MIME signature successfully verified."));
+ else
+ mutt_error ( _("S/MIME certificate owner does not match sender."));
+--- init.h.orig2 Fri May 31 10:14:05 2002
++++ init.h Fri May 31 10:54:55 2002
+@@ -1435,6 +1435,15 @@
+ ** This flag controls wether you want to be asked to enter a label for a certificate
+ ** about to be added to the database or not. It is set by default.
+ */
++ { "smime_dont_check_sender", DT_BOOL, R_NONE, OPTSMIMENOSENDER, 0 },
++ /*
++ ** .pp
++ ** This flag controls wether you want the skip the check for the sender's
++ ** email address against the email address stored in the certificate.
++ ** This can be useful if most of your email senders use SMIMEv3 which no
++ ** longer needs email-addresses as part of the certificates.
++ ** It is not set by default.
++ */
+ { "smime_decrypt_use_default_key", DT_BOOL, R_NONE, OPTSDEFAULTDECRYPTKEY, 1 },
+ /*
+ ** .pp
+--- mutt.h.orig2 Fri May 31 10:14:06 2002
++++ mutt.h Fri May 31 10:24:03 2002
+@@ -453,6 +453,7 @@
+ #ifdef HAVE_SMIME
+ OPTSMIMEISDEFAULT,
+ OPTASKCERTLABEL,
++ OPTSMIMENOSENDER,
+ OPTSDEFAULTDECRYPTKEY,
+ #endif
+ #ifdef HAVE_PGP
+--- contrib/smime.rc.orig Sat Oct 25 17:57:35 2003
++++ contrib/smime.rc Sat Oct 25 17:57:35 2003
+@@ -6,8 +6,11 @@
+ # will be the default method unless the following option is set
+ set smime_is_default
+
+-# Uncoment this if you don't want to set labels for certificates you add.
++# Uncomment this if you don't want to set labels for certificates you add.
+ # unset smime_ask_cert_label
++
++# Uncomment this if you don't want to check for sender's email address
++# set smime_dont_check_sender = yes
+
+ # Passphrase expiration
+ set smime_timeout=300
diff --git a/mail/mutt/files/patch-threadcomplete b/mail/mutt/files/patch-threadcomplete
index e4f56f261382..d151009ec1d7 100644
--- a/mail/mutt/files/patch-threadcomplete
+++ b/mail/mutt/files/patch-threadcomplete
@@ -1,18 +1,6 @@
-written by Nicolas Rachinsky <nr@rachinsky.de>
-http://www.rachinsky.de
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published
-by the Free Software Foundation; version 2 of the License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
---- mutt-1.3.28.ori/mutt.h Thu Mar 14 19:22:25 2002
-+++ mutt.h Fri Mar 15 00:22:41 2002
-@@ -198,6 +198,7 @@
+--- mutt.h.orig2 Mon Sep 6 09:24:17 2004
++++ mutt.h Mon Sep 6 09:27:04 2004
+@@ -212,6 +212,7 @@
M_LIMIT,
M_EXPIRED,
M_SUPERSEDED,
@@ -20,9 +8,9 @@ General Public License for more details.
/* actions for mutt_pattern_comp/mutt_pattern_exec */
M_AND,
---- mutt-1.3.28.ori/pattern.c Thu Mar 14 19:22:26 2002
-+++ pattern.c Fri Mar 15 00:23:52 2002
-@@ -50,6 +50,7 @@
+--- pattern.c.orig2 Sun Sep 18 15:17:46 2005
++++ pattern.c Sun Sep 18 15:19:48 2005
+@@ -54,6 +54,7 @@
}
Flags[] =
{
@@ -30,44 +18,20 @@ General Public License for more details.
{ 'A', M_ALL, 0, NULL },
{ 'b', M_BODY, M_FULL_MSG, eat_regexp },
{ 'B', M_WHOLE_MSG, M_FULL_MSG, eat_regexp },
-@@ -957,6 +958,27 @@
- return alladdr;
- }
-
-+static int match_threadcomplete(int flag,THREAD *t,int left,int up,int right,int down)
-+{
-+ int a=0;
-+ HEADER *h=NULL;
-+
-+ if(! t)return 0;
-+ h=t->message;
-+ if(! flag && h && h->tagged)return 1;
-+ if(flag && h && ! h->tagged) return 1;
-+
-+ if(up)a=match_threadcomplete(flag,t->parent,1,1,1,0);
-+ if(a)return a;
-+ if(right && t->parent)a=match_threadcomplete(flag,t->next,0,0,1,1);
-+ if(a)return a;
-+ if(left && t->parent)a=match_threadcomplete(flag,t->prev,1,0,0,1);
-+ if(a)return a;
-+ if(down)a=match_threadcomplete(flag,t->child,1,0,1,1);
-+ if(a)return a;
-+ return 0;
-+}
-+
- /* flags
- M_MATCH_FULL_ADDRESS match both personal and machine address */
- int
-@@ -1053,6 +1075,8 @@
- return (pat->not ^ (h->env->x_label && regexec (pat->rx, h->env->x_label, 0, NULL, 0) == 0));
- case M_DUPLICATED:
- return (pat->not ^ (h->thread && h->thread->duplicate_thread));
+@@ -1139,6 +1140,16 @@
+ 2, h->env->to, h->env->cc));
+ case M_LIST: /* known list, subscribed or not */
+ return (pat->not ^ mutt_is_list_cc (pat->alladdr, h->env->to, h->env->cc));
+ case M_THREADCOMPLETE:
-+ return ((h->thread && match_threadcomplete(pat->not,h->thread,1,1,1,1)));
- }
- mutt_error (_("error: unknown op %d (report this error)."), pat->op);
- return (-1);
---- PATCHES~ Tue Nov 6 19:59:33 2001
-+++ PATCHES Tue Nov 6 19:59:42 2001
-@@ -1,0 +1 @@
-+1.3.28.nr.threadcomplete
++ { static pattern_t tmp;
++ static short pattern_set = 0;
++ if(! pattern_set) {
++ memset (&tmp, 0, sizeof (tmp));
++ tmp.op = M_TAG;
++ pattern_set = 1;
++ }
++ return (pat->not ^ (h->env && match_threadcomplete(&tmp, flags, ctx, h->thread, 1, 1, 1, 1)));
++ }
+ case M_SUBSCRIBED_LIST:
+ return (pat->not ^ mutt_is_list_recipient (pat->alladdr, h->env->to, h->env->cc));
+ case M_PERSONAL_RECIP:
diff --git a/mail/mutt/files/patch-z b/mail/mutt/files/patch-z
deleted file mode 100644
index 08a7dfbebe7b..000000000000
--- a/mail/mutt/files/patch-z
+++ /dev/null
@@ -1,22 +0,0 @@
---- Makefile.am.orig2 Thu Jan 6 15:45:58 2005
-+++ Makefile.am Thu Jan 6 15:47:48 2005
-@@ -11,7 +11,7 @@
-
- SUBDIRS = m4 po intl doc contrib $(IMAP_SUBDIR)
-
--bin_SCRIPTS = muttbug flea
-+bin_SCRIPTS =
-
- BUILT_SOURCES = keymap_defs.h patchlist.c Muttrc
-
---- doc/Makefile.in.orig2 Thu Jan 6 15:45:57 2005
-+++ doc/Makefile.in Thu Jan 6 15:53:52 2005
-@@ -78,8 +78,6 @@
- $(top_srcdir)/mkinstalldirs $(DESTDIR)$(mandir)/man1
- $(top_srcdir)/mkinstalldirs $(DESTDIR)$(mandir)/man5
- ./instdoc $(srcdir)/mutt.man $(DESTDIR)$(mandir)/man1/mutt.1
-- ./instdoc $(srcdir)/muttbug.man $(DESTDIR)$(mandir)/man1/flea.1
-- echo ".so $(mandir)/man1/flea.1" > $(DESTDIR)$(mandir)/man1/muttbug.1
- ./instdoc $(srcdir)/dotlock.man \
- $(DESTDIR)$(mandir)/man1/mutt_dotlock.1
- ./instdoc muttrc.man $(DESTDIR)$(mandir)/man5/muttrc.5