Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Dec 2003 17:51:44 +0100 (CET)
From:      Udo Schweigert <udo.schweigert@siemens.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   ports/60403: maintainer-update of mail/mutt-devel
Message-ID:  <200312191651.hBJGpijI094685@alaska.cert.siemens.de>
Resent-Message-ID: <200312191700.hBJH0b3q014143@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         60403
>Category:       ports
>Synopsis:       maintainer-update of mail/mutt-devel
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Fri Dec 19 09:00:36 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     Udo Schweigert
>Release:        FreeBSD 4.9-STABLE i386
>Organization:
>Environment:
>Description:

Maintainer-update of mail/mutt-devel:

	- Fix the pgp-patch (as pointed out by it's author)

	- Fix the nntp-patch (also pointed out by the author)

	- Add the new WITH_MUTT_IMAP_HEADER_CACHE knob to enable the IMAP 
	  header cache functionality.

	- Bump PORTREVISION.

Committer: cvs add files/extra-patch-imap-header-cache

>How-To-Repeat:
>Fix:

diff -ru  /usr/ports/mail/mutt-devel/Makefile ./Makefile
--- /usr/ports/mail/mutt-devel/Makefile	Thu Nov  6 21:10:56 2003
+++ ./Makefile	Fri Dec 19 17:21:29 2003
@@ -41,6 +41,9 @@
 #  WITH_MUTT_QUOTE_PATCH
 #  This is a default knob and can be disabled by WITHOUT_MUTT_QUOTE_PATCH
 #
+# If you want to have the IMAP header cache define:
+#  WITH_MUTT_IMAP_HEADER_CACHE
+#
 # If you want to make SMIME outlook compatible define:
 #  WITH_MUTT_SMIME_OUTLOOK_COMPAT
 #  This is a default knob and can be disabled by
@@ -72,6 +75,7 @@
 
 PORTNAME=	mutt-devel
 PORTVERSION=	1.5.5.1
+PORTREVISION=	1
 CATEGORIES+=	mail ipv6
 .if defined(WITH_MUTT_NNTP)
 CATEGORIES+=	news
@@ -86,7 +90,7 @@
 		http://www2.mutt.org.ua/download/mutt-${VVV_PATCH_VERSION}/:vvv \
 		ftp://ftp.mutt.org.ua/pub/mutt/mutt-${VVV_PATCH_VERSION}/:vvv \
 		ftp://ftp2.mutt.org.ua/pub/mutt/mutt-${VVV_PATCH_VERSION}/:vvv \
-		http://cedricduval.free.fr/download/mutt/:cd \
+		http://cedricduval.free.fr/mutt/patches/download/:cd \
 		http://home.woolridge.ca/mutt/patches/:dw
 
 MAINTAINER?=	udo.schweigert@siemens.com
@@ -117,8 +121,8 @@
 
 .include <bsd.port.pre.mk>
 
-CD_PATCH_VERSION=	1.5.4
-DW_PATCH_VERSION=	1.5.x
+CD_IFDEF_PATCH_VERSION=	1.5.4
+DW_PATCH_VERSION=	1.5.5
 DW_MBOX_PATCH_VERSION=	1.5.4
 .if !defined(VVV_PATCH_VERSION)
 VVV_PATCH_VERSION=	${PORTVERSION}
@@ -126,11 +130,14 @@
 .if !defined(CD_PATCH_VERSION)
 CD_PATCH_VERSION=	${PORTVERSION}
 .endif
+.if !defined(CD_IFDEF_PATCH_VERSION)
+CD_IFDEF_PATCH_VERSION=	${CD_PATCH_VERSION}
+.endif
 .if !defined(DW_PATCH_VERSION)
 DW_PATCH_VERSION=	${PORTVERSION}
 .endif
 .if !defined(DW_MBOX_PATCH_VERSION)
-DW_MBOX_PATCH_VERSION=	${PORTVERSION}
+DW_MBOX_PATCH_VERSION=	${DW_PATCH_VERSION}
 .endif
 
 # XXX
@@ -187,6 +194,10 @@
 pre-configure::
 	@${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-smime-outlook
 .endif
+.if defined(WITH_MUTT_IMAP_HEADER_CACHE)
+pre-configure::
+	@${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-imap-header-cache
+.endif
 
 .if ! defined(WITHOUT_MUTT_PGP_PATCH)
 SGML_NEEDED=	yes
@@ -215,6 +226,7 @@
 .endif
 .if defined(WITH_MUTT_NNTP)
 PATCHFILES+=	patch-${VVV_PATCH_VERSION}.vvv.nntp.gz:vvv
+PATCHFILES+=	patch-${VVV_PATCH_VERSION}.vvv.compose.gz:vvv
 CONFIGURE_ARGS+=	--enable-nntp
 SGML_NEEDED=	yes
 .endif
@@ -233,7 +245,7 @@
 SGML_NEEDED=	yes
 .endif
 .if defined(WITH_MUTT_IFDEF_PATCH)
-PATCHFILES+=	patch-${CD_PATCH_VERSION}.cd.ifdef.1:cd
+PATCHFILES+=	patch-${CD_IFDEF_PATCH_VERSION}.cd.ifdef.1:cd
 SGML_NEEDED=	yes
 .endif
 .if defined(WITH_MUTT_MBOX_HOOK_PATCH)
@@ -262,6 +274,9 @@
 .if ! defined(WITHOUT_MUTT_QUOTE_PATCH)
 SCRIPTS_ENV+=	MUTT_QUOTE_PATCH="yes"
 .endif
+.if defined(WITH_MUTT_IMAP_HEADER_CACHE)
+SCRIPTS_ENV+=	MUTT_IMAP_HEADER_CACHE="yes"
+.endif
 .if defined(WITH_MUTT_EDIT_THREADS)
 SCRIPTS_ENV+=	MUTT_EDIT_THREADS="yes"
 .endif
@@ -336,6 +351,14 @@
 	@${ECHO} "This may work for a color terminal only when defining" >> ${PKGMESSAGE}
 	@${ECHO} "COLORTERM=yes and COLORFGBG=color,color in your" >> ${PKGMESSAGE}
 	@${ECHO} "environment." >> ${PKGMESSAGE}
+	@${ECHO} "====================================================" >> ${PKGMESSAGE}
+.endif
+.if defined(WITH_MUTT_IMAP_HEADER_CACHE)
+	@${ECHO} "====================================================" >> ${PKGMESSAGE}
+	@${ECHO} "You have installed ${PORTNAME} with the IMAP header cache enabled." >> ${PKGMESSAGE}
+	@${ECHO} "Please be aware that this - at the moment - could result in" >> ${PKGMESSAGE}
+	@${ECHO} "incorrect display of message flags if there is another client" >> ${PKGMESSAGE}
+	@${ECHO} "simultaneously using the same mailbox." >> ${PKGMESSAGE}
 	@${ECHO} "====================================================" >> ${PKGMESSAGE}
 .endif
 .if !defined(BATCH)
diff -ru  /usr/ports/mail/mutt-devel/distinfo ./distinfo
--- /usr/ports/mail/mutt-devel/distinfo	Thu Nov  6 21:10:56 2003
+++ ./distinfo	Fri Dec 19 17:21:29 2003
@@ -1,9 +1,10 @@
 MD5 (mutt/mutt-1.5.5.1i.tar.gz) = 9729ee2a2024b57e2a903ec7753970a5
 MD5 (mutt/patch-1.5.5.1.rr.compressed.gz) = 12bf7e03af3a0d7529dfbdec5dd0f63a
 MD5 (mutt/patch-1.5.5.1.vvv.nntp.gz) = a655b6b5ceb582640172d5476093705d
+MD5 (mutt/patch-1.5.5.1.vvv.compose.gz) = 69e946fe70735d37b9f8e6f6ef6376d1
 MD5 (mutt/patch-1.5.5.1.vvv.initials.gz) = 5abdf15c3f76b5c24f29767e65e0fc32
 MD5 (mutt/patch-1.5.5.1.vvv.quote.gz) = abb2ba5829110cba4be323d6b6f303dc
-MD5 (mutt/patch-1.5.4.cd.edit_threads.9.5) = f8d7fe6ea1a6a1b92c942f4446918433
-MD5 (mutt/patch-1.5.4.cd.signatures_menu.2.1) = 5b2298335071c46ee1f3ed8c689066b1
+MD5 (mutt/patch-1.5.5.1.cd.edit_threads.9.5) = a8a3a973d8693f8af526cecf7edbd71f
+MD5 (mutt/patch-1.5.5.1.cd.signatures_menu.2.1) = 22caeffb4a612f5fa6e1f585b40c51a6
 MD5 (mutt/patch-1.5.4.cd.ifdef.1) = a545036cdb55519154d0b35465f52daa
 MD5 (mutt/p0-patch-1.5.4.dw.mbox-hook.1) = 326f415380cc377c99d2232f16267ffe
diff -ru  /usr/ports/mail/mutt-devel/files/extra-patch-imap-header-cache ./files/extra-patch-imap-header-cache
--- /usr/ports/mail/mutt-devel/files/extra-patch-imap-header-cache	Thu Jan  1 01:00:00 1970
+++ ./files/extra-patch-imap-header-cache	Tue Dec  2 11:48:19 2003
@@ -0,0 +1,873 @@
+diff -ru old/globals.h work/mutt-1.5.5.1/globals.h
+--- old/globals.h	Wed Nov  5 10:41:31 2003
++++ globals.h	Fri Nov 28 18:30:37 2003
+@@ -57,6 +57,7 @@
+ WHERE char *ImapHomeNamespace INITVAL (NULL);
+ WHERE char *ImapPass INITVAL (NULL);
+ WHERE char *ImapUser INITVAL (NULL);
++WHERE char *ImapHeadercache INITVAL (NULL);
+ #endif
+ WHERE char *Inbox;
+ WHERE char *Ispell;
+diff -ru old/imap/Makefile.am work/mutt-1.5.5.1/imap/Makefile.am
+--- old/imap/Makefile.am	Thu Jan 24 14:35:57 2002
++++ imap/Makefile.am	Fri Nov 28 18:30:37 2003
+@@ -22,4 +22,5 @@
+ noinst_HEADERS = auth.h imap_private.h message.h
+ 
+ libimap_a_SOURCES = auth.c auth_login.c browse.c command.c imap.c imap.h \
+-	message.c utf7.c util.c $(AUTHENTICATORS) $(GSSSOURCES)
++	imap_headercache.c imap_headercache.h message.c utf7.c util.c \
++	$(AUTHENTICATORS) $(GSSSOURCES)
+diff -ru old/imap/imap.c work/mutt-1.5.5.1/imap/imap.c
+--- old/imap/imap.c	Wed Nov  5 10:41:36 2003
++++ imap/imap.c	Fri Nov 28 18:30:37 2003
+@@ -29,6 +29,7 @@
+ #include "browser.h"
+ #include "message.h"
+ #include "imap_private.h"
++#include "imap_headercache.h"
+ #ifdef USE_SSL
+ # include "mutt_ssl.h"
+ #endif
+@@ -546,6 +547,13 @@
+ 
+   /* Clean up path and replace the one in the ctx */
+   imap_fix_path (idata, mx.mbox, buf, sizeof (buf));
++
++  if (idata->hcache)
++  {
++    imap_headercache_close(idata->hcache);
++    idata->hcache = NULL;
++  }
++
+   FREE(&(idata->mailbox));
+   idata->mailbox = safe_strdup (buf);
+   imap_qualify_path (buf, sizeof (buf), &mx, idata->mailbox);
+@@ -556,6 +564,7 @@
+   idata->ctx = ctx;
+ 
+   /* clear mailbox status */
++  idata->uidvalidity = 0;
+   idata->status = 0;
+   memset (idata->rights, 0, (RIGHTSMAX+7)/8);
+   idata->newMailCount = 0;
+@@ -601,6 +610,15 @@
+       if ((pc = imap_get_flags (&(idata->flags), pc)) == NULL)
+ 	goto fail;
+     }
++    /* save UIDVALIDITY for the header cache */
++    else if (ascii_strncasecmp("OK [UIDVALIDITY", pc, 14) == 0)
++    {
++      dprint(2, (debugfile, "Getting mailbox UIDVALIDITY\n"));
++      pc += 3;
++      pc = imap_next_word(pc);
++
++      sscanf(pc, "%u", &(idata->uidvalidity));
++    }
+     else
+     {
+       pc = imap_next_word (pc);
+@@ -684,6 +702,9 @@
+   ctx->hdrs = safe_calloc (count, sizeof (HEADER *));
+   ctx->v2r = safe_calloc (count, sizeof (int));
+   ctx->msgcount = 0;
++
++  idata->hcache = imap_headercache_open(idata);
++
+   if (count && (imap_read_headers (idata, 0, count-1) < 0))
+   {
+     mutt_error _("Error opening mailbox");
+@@ -693,6 +714,7 @@
+ 
+   dprint (2, (debugfile, "imap_open_mailbox: msgcount is %d\n", ctx->msgcount));
+   FREE (&mx.mbox);
++
+   return 0;
+ 
+  fail:
+@@ -914,6 +936,7 @@
+   int n;
+   int err_continue = M_NO;	/* continue on error? */
+   int rc;
++  IMAP_HEADER h;
+ 
+   idata = (IMAP_DATA*) ctx->data;
+ 
+@@ -953,8 +976,20 @@
+       /* mark these messages as unchanged so second pass ignores them. Done
+        * here so BOGUS UW-IMAP 4.7 SILENT FLAGS updates are ignored. */
+       for (n = 0; n < ctx->msgcount; n++)
+-	if (ctx->hdrs[n]->deleted && ctx->hdrs[n]->changed)
+-	  ctx->hdrs[n]->active = 0;
++      {
++	if (ctx->hdrs[n]->deleted)
++        {
++          if (idata->hcache)
++          {
++            h.data = HEADER_DATA(ctx->hdrs[n]);
++            imap_headercache_delete(idata->hcache, &h);
++          }
++
++          if (ctx->hdrs[n]->changed)
++            ctx->hdrs[n]->active = 0;
++        }
++      }
++
+       if (imap_exec (idata, cmd.data, 0) != 0)
+       {
+ 	mutt_error (_("Expunge failed"));
+@@ -972,6 +1007,23 @@
+     {
+       ctx->hdrs[n]->changed = 0;
+ 
++      if (idata->hcache)
++      {
++        h.data = HEADER_DATA(ctx->hdrs[n]);
++
++        h.read     = ctx->hdrs[n]->read;
++        h.old      = ctx->hdrs[n]->old;
++        h.deleted  = ctx->hdrs[n]->deleted;
++        h.flagged  = ctx->hdrs[n]->flagged;
++        h.replied  = ctx->hdrs[n]->replied;
++        h.changed  = ctx->hdrs[n]->changed;
++        h.sid      = ctx->hdrs[n]->index + 1;
++        h.received = ctx->hdrs[n]->received;
++        h.content_length = ctx->hdrs[n]->content->length;
++        
++        imap_headercache_update(idata->hcache, &h);
++      }
++
+       mutt_message (_("Saving message status flags... [%d/%d]"), n+1,
+         ctx->msgcount);
+ 
+@@ -1099,6 +1151,11 @@
+ 
+     idata->reopen &= IMAP_REOPEN_ALLOW;
+     idata->state = IMAP_AUTHENTICATED;
++    if (idata->hcache)
++    {
++      imap_headercache_close(idata->hcache);
++      idata->hcache = NULL;
++    }
+     FREE (&(idata->mailbox));
+     mutt_free_list (&idata->flags);
+     idata->ctx = NULL;
+diff -ru old/imap/imap_private.h work/mutt-1.5.5.1/imap/imap_private.h
+--- old/imap/imap_private.h	Wed Nov  5 10:41:36 2003
++++ imap/imap_private.h	Fri Nov 28 18:30:37 2003
+@@ -21,6 +21,7 @@
+ #define _IMAP_PRIVATE_H 1
+ 
+ #include "imap.h"
++#include "imap_headercache.h"
+ #include "mutt_socket.h"
+ 
+ /* -- symbols -- */
+@@ -148,7 +149,7 @@
+   int state;
+ } IMAP_COMMAND;
+ 
+-typedef struct
++typedef struct IMAP_DATA
+ {
+   /* This data is specific to a CONNECTION to an IMAP server */
+   CONNECTION *conn;
+@@ -175,6 +176,7 @@
+   char *mailbox;
+   unsigned short check_status;
+   unsigned char reopen;
++  unsigned int uidvalidity;
+   unsigned char rights[(RIGHTSMAX + 7)/8];
+   unsigned int newMailCount;
+   IMAP_CACHE cache[IMAP_CACHE_LEN];
+@@ -182,6 +184,7 @@
+   
+   /* all folder flags - system flags AND keywords */
+   LIST *flags;
++  IMAP_HEADERCACHE *hcache;
+ } IMAP_DATA;
+ /* I wish that were called IMAP_CONTEXT :( */
+ 
+diff -ru old/imap/message.c work/mutt-1.5.5.1/imap/message.c
+--- old/imap/message.c	Wed Nov  5 10:41:36 2003
++++ imap/message.c	Fri Nov 28 18:30:38 2003
+@@ -25,6 +25,7 @@
+ #include "mutt.h"
+ #include "mutt_curses.h"
+ #include "imap_private.h"
++#include "imap_headercache.h"
+ #include "message.h"
+ #include "mx.h"
+ 
+@@ -54,9 +55,14 @@
+   int msgno;
+   IMAP_HEADER h;
+   int rc, mfhrc, oldmsgcount;
++  IMAP_HEADERCACHE *hc = NULL;
++  int msgbegin_hc;
+   int fetchlast = 0;
++
+   const char *want_headers = "DATE FROM SUBJECT TO CC MESSAGE-ID REFERENCES CONTENT-TYPE IN-REPLY-TO REPLY-TO LINES X-LABEL";
+ 
++  msgno = msgbegin;
++
+   ctx = idata->ctx;
+ 
+   if (mutt_bit_isset (idata->capabilities,IMAP4REV1))
+@@ -87,36 +93,150 @@
+   }
+   unlink (tempfile);
+ 
++  oldmsgcount = ctx->msgcount;
++
++  msgbegin_hc = msgbegin;
++
++  hc = idata->hcache;
++
++restart:
+   /* make sure context has room to hold the mailbox */
+   while ((msgend) >= idata->ctx->hdrmax)
+     mx_alloc_memory (idata->ctx);
+ 
+-  oldmsgcount = ctx->msgcount;
+   idata->reopen &= ~IMAP_NEWMAIL_PENDING;
+   idata->newMailCount = 0;
+ 
++  if (hc)
++  {
++    snprintf(buf, sizeof(buf), "FETCH %d:%d (UID)", msgbegin_hc + 1, 
++             msgend + 1);
++    imap_cmd_start(idata, buf);
++
++    for (msgno = msgbegin_hc; msgno <= msgend; msgno++)
++    {
++      if (ReadInc && (!msgno || ((msgno+1) % ReadInc == 0)))
++        mutt_message (_("Fetching message UIDs... [%d/%d]"), msgno + 1,
++                      msgend + 1);
++
++      /* XXX */
++      ctx->hdrs[msgno] = NULL;
++
++      /* XXX leaking h.data on successful exit */
++      memset (&h, 0, sizeof (h));
++      h.data = safe_calloc (1, sizeof (IMAP_HEADER_DATA));
++
++      do
++      {
++        FILE *cache_fp;
++
++        mfhrc = 0;
++
++        rc = imap_cmd_step (idata);
++        if (rc != IMAP_CMD_CONTINUE)
++          break;
++
++        if ((mfhrc = msg_fetch_header (idata->ctx, &h, idata->cmd.buf, NULL)) == -1)
++          continue;
++        else if (mfhrc < 0)
++          break;
++
++        cache_fp = imap_headercache_find(hc, &h);
++        if (cache_fp)
++        {
++          /* update context with message header */
++          ctx->hdrs[msgno] = mutt_new_header ();
++
++          ctx->hdrs[msgno]->index = h.sid - 1;
++
++          /* messages which have not been expunged are ACTIVE (borrowed from mh 
++           * folders) */
++          ctx->hdrs[msgno]->active = 1;
++          ctx->hdrs[msgno]->read = h.read;
++          ctx->hdrs[msgno]->old = h.old;
++          ctx->hdrs[msgno]->deleted = h.deleted;
++          ctx->hdrs[msgno]->flagged = h.flagged;
++          ctx->hdrs[msgno]->replied = h.replied;
++          ctx->hdrs[msgno]->changed = h.changed;
++          ctx->hdrs[msgno]->received = h.received;
++          ctx->hdrs[msgno]->data = (void *) (h.data);
++
++          /* NOTE: if Date: header is missing, mutt_read_rfc822_header depends
++           *   on h.received being set */
++          ctx->hdrs[msgno]->env = mutt_read_rfc822_header (cache_fp, ctx->hdrs[msgno],
++            0, 0);
++          /* content built as a side-effect of mutt_read_rfc822_header */
++          ctx->hdrs[msgno]->content->length = h.content_length;
++
++          imap_headercache_done(hc, cache_fp);
++        }
++      }
++      while (mfhrc == -1);
++
++      /* in case we get new mail while fetching the headers */
++      if (idata->reopen & IMAP_NEWMAIL_PENDING)
++      {
++        msgbegin_hc = msgno + 1;
++        msgend = idata->newMailCount - 1;
++        goto restart;
++      }
++      /* XXX freshen... etc */
++    }
++  }
++
++  /* Remember where we left if we get new mail while fetching actual headers */
++  msgbegin_hc = msgno;
++
++  /* Now, either one of the following is true:
++   * 1. We don't have a headercache (hc == 0)
++   * 2. All messages found in the cache have ctx->hdrs[msgno] != NULL, and
++   * filled up.
++   */
++
++  /*
++   * Make one request for everything. This makes fetching headers an
++   * order of magnitude faster if you have a large mailbox.
++   *
++   * If we get more messages while doing this, we make another
++   * request for all the new messages.
++   */
++  if (!hc)
++  {
++    snprintf (buf, sizeof (buf),
++      "FETCH %d:%d (UID FLAGS INTERNALDATE RFC822.SIZE %s)", msgbegin + 1,
++      msgend + 1, hdrreq);
++
++    imap_cmd_start (idata, buf);
++  }
++
+   for (msgno = msgbegin; msgno <= msgend ; msgno++)
+   {
+     if (ReadInc && (!msgno || ((msgno+1) % ReadInc == 0)))
+       mutt_message (_("Fetching message headers... [%d/%d]"), msgno + 1,
+         msgend + 1);
+ 
+-    if (msgno + 1 > fetchlast)
++    /* If the message is in the cache, skip it */
++    if (hc)
+     {
+-      /*
+-       * Make one request for everything. This makes fetching headers an
+-       * order of magnitude faster if you have a large mailbox.
+-       *
+-       * If we get more messages while doing this, we make another
+-       * request for all the new messages.
+-       */
+-      snprintf (buf, sizeof (buf),
+-        "FETCH %d:%d (UID FLAGS INTERNALDATE RFC822.SIZE %s)", msgno + 1,
+-        msgend + 1, hdrreq);
+-
+-      imap_cmd_start (idata, buf);
++      if (ctx->hdrs[msgno])
++      {
++        ctx->msgcount++;
++        continue;
++      }
++      else if (msgno >= fetchlast)
++      {
++        /* Find the longest "run" of messages not in the cache and fetch it in
++         * one go
++         */
++        for (fetchlast = msgno + 1; 
++             fetchlast <= msgend && !ctx->hdrs[fetchlast]; fetchlast++);
++
++        snprintf (buf, sizeof (buf),
++          "FETCH %d:%d (UID FLAGS INTERNALDATE RFC822.SIZE %s)", msgno + 1,
++          fetchlast, hdrreq);
+ 
+-      fetchlast = msgend + 1;
++        imap_cmd_start (idata, buf);
++      }
+     }
+ 
+     /* freshen fp, h */
+@@ -130,6 +250,8 @@
+      */
+     do
+     {
++      size_t hdrsz;
++
+       mfhrc = 0;
+ 
+       rc = imap_cmd_step (idata);
+@@ -144,12 +266,16 @@
+       /* make sure we don't get remnants from older larger message headers */
+       fputs ("\n\n", fp);
+ 
++      hdrsz = (size_t)ftell(fp);
++
+       /* update context with message header */
+       ctx->hdrs[msgno] = mutt_new_header ();
+ 
+       ctx->hdrs[msgno]->index = h.sid - 1;
++#if 0
+       if (h.sid != ctx->msgcount + 1)
+ 	dprint (1, (debugfile, "imap_read_headers: msgcount and sequence ID are inconsistent!"));
++#endif
+       /* messages which have not been expunged are ACTIVE (borrowed from mh 
+        * folders) */
+       ctx->hdrs[msgno]->active = 1;
+@@ -163,6 +289,13 @@
+       ctx->hdrs[msgno]->data = (void *) (h.data);
+ 
+       rewind (fp);
++
++      if (hc)
++      {
++        imap_headercache_add(hc, &h, fp, hdrsz);
++        rewind(fp);
++      }
++
+       /* NOTE: if Date: header is missing, mutt_read_rfc822_header depends
+        *   on h.received being set */
+       ctx->hdrs[msgno]->env = mutt_read_rfc822_header (fp, ctx->hdrs[msgno],
+@@ -172,8 +305,7 @@
+ 
+       ctx->msgcount++;
+     }
+-    while ((rc != IMAP_CMD_OK) && ((mfhrc == -1) ||
+-      ((msgno + 1) >= fetchlast)));
++    while (mfhrc == -1);
+ 
+     if ((mfhrc < -1) || ((rc != IMAP_CMD_CONTINUE) && (rc != IMAP_CMD_OK)))
+     {
+@@ -186,11 +318,9 @@
+     /* in case we get new mail while fetching the headers */
+     if (idata->reopen & IMAP_NEWMAIL_PENDING)
+     {
++      msgbegin = msgno + 1;
+       msgend = idata->newMailCount - 1;
+-      while ((msgend) >= ctx->hdrmax)
+-	mx_alloc_memory (ctx);
+-      idata->reopen &= ~IMAP_NEWMAIL_PENDING;
+-      idata->newMailCount = 0;
++      goto restart;
+     }
+   }
+ 
+@@ -735,6 +865,7 @@
+   IMAP_DATA* idata;
+   long bytes;
+   int rc = -1; /* default now is that string isn't FETCH response*/
++  int fetch_rc;
+ 
+   idata = (IMAP_DATA*) ctx->data;
+ 
+@@ -757,9 +888,15 @@
+ 
+   /* FIXME: current implementation - call msg_parse_fetch - if it returns -2,
+    *   read header lines and call it again. Silly. */
+-  if (msg_parse_fetch (h, buf) != -2)
++  fetch_rc = msg_parse_fetch(h, buf);
++  if (fetch_rc == 0)
++    return 0;
++  else if (fetch_rc != -2)
+     return rc;
+-  
++
++  if (!fp)
++    return -2;
++
+   if (imap_get_literal_count (buf, &bytes) < 0)
+     return rc;
+   imap_read_literal (fp, idata, bytes);
+diff -ru old/init.h work/mutt-1.5.5.1/init.h
+--- old/init.h	Wed Nov  5 10:41:32 2003
++++ init.h	Fri Nov 28 18:30:37 2003
+@@ -856,6 +856,11 @@
+   ** .pp
+   ** This variable defaults to your user name on the local machine.
+   */
++  { "imap_headercache", DT_STR, R_NONE, UL &ImapHeadercache, UL 0 },
++  /*
++  ** .pp
++  ** The location of the IMAP headercache directory.
++  */
+ #endif
+   { "implicit_autoview", DT_BOOL,R_NONE, OPTIMPLICITAUTOVIEW, 0},
+   /*
+diff -ruN old/imap/imap_headercache.c work/mutt-1.5.5.1/imap/imap_headercache.c
+--- old/imap/imap_headercache.c	Thu Jan  1 01:00:00 1970
++++ imap/imap_headercache.c	Fri Nov 28 18:30:55 2003
+@@ -0,0 +1,330 @@
++/*
++ * Copyright (C) 2002 Tudor Bosman <tudorb-mutt@dwyn.net>
++ * 
++ *     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.
++ */ 
++
++#include "mutt.h"
++#include "imap.h"
++#include "imap_private.h"
++#include "imap_headercache.h"
++#include "mx.h"
++#include <stdio.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <errno.h>
++#include <unistd.h>
++#include <dirent.h>
++#include <assert.h>
++
++/* Delete all messages from headercache */
++static int imap_headercache_purge(IMAP_HEADERCACHE *hc)
++{
++  int rc = -1;
++  DIR *dir;
++  struct dirent *ent;
++
++  dir = opendir(hc->name);
++  if (!dir)
++  {
++    mutt_error(_("IMAP headercache: can't purge directory %s: %s"), hc->name,
++               strerror(errno));
++    mutt_sleep(2);
++    return -1;
++  }
++
++  while ((ent = readdir(dir)) != NULL)
++  {
++    if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
++      continue;
++
++    sprintf(hc->tmpname, "%s/%s", hc->name, ent->d_name);
++    if (unlink(hc->tmpname) == -1)
++    {
++      mutt_error(_("IMAP headercache: can't unlink file %s: %s"), hc->tmpname,
++                 strerror(errno));
++      mutt_sleep(2);
++      goto bail;
++    }
++  }
++  
++  rc = 0;
++
++bail:
++  closedir(dir);
++
++  return rc;
++}
++
++/* Open headercache */
++IMAP_HEADERCACHE *imap_headercache_open(IMAP_DATA *idata)
++{
++  IMAP_HEADERCACHE *hc;
++  char hcdir[_POSIX_PATH_MAX + 1];
++  FILE *f;
++  size_t len;
++  char *p;
++
++  if (!ImapHeadercache || ImapHeadercache[0] == '\0')
++    return NULL;
++
++  strfcpy(hcdir, ImapHeadercache, _POSIX_PATH_MAX);
++  mutt_expand_path(hcdir, _POSIX_PATH_MAX);
++
++  hc = safe_malloc(sizeof(IMAP_HEADERCACHE));
++
++  len = strlen(hcdir) + strlen(idata->conn->account.host) +
++        strlen(idata->mailbox) + 5;
++
++  hc->name = safe_malloc(len);
++  hc->tmpname = safe_malloc(len + NAME_MAX + 2);
++
++  sprintf(hc->name, "%s/%s", hcdir, idata->conn->account.host);
++  
++  if (mkdir(hcdir, 0777) == -1 && errno != EEXIST)
++  {
++    mutt_error(_("Can't create IMAP headercache root directory %s: %s"), 
++                 hcdir, strerror(errno));
++    mutt_sleep(2);
++    goto bail;
++  }
++
++  if (mkdir(hc->name, 0700) == -1 && errno != EEXIST)
++  {
++    mutt_error(_("Can't create IMAP headercache server directory %s: %s"),
++                 hc->name, strerror(errno));
++    mutt_sleep(2);
++    goto bail;
++  }
++
++  p = idata->mailbox;
++  while ((p = strchr(p, '/')) != NULL)
++  {
++    *p = '\0';
++    sprintf(hc->name, "%s/%s/%s", hcdir, 
++            idata->conn->account.host, idata->mailbox);
++
++    if (mkdir(hc->name, 0700) == -1 && errno != EEXIST)
++    {
++      mutt_error(_("Can't create IMAP headercache mailbox directory %s: %s"),
++                   hc->name, strerror(errno));
++      mutt_sleep(2);
++      goto bail;
++    }
++
++    *p = '/';
++    p++;
++  }
++
++  sprintf(hc->name, "%s/%s/%s", hcdir, 
++          idata->conn->account.host, idata->mailbox);
++
++  if (mkdir(hc->name, 0700) == -1 && errno != EEXIST)
++  {
++    mutt_error(_("Can't create IMAP headercache mailbox directory %s: %s"),
++                 hc->name, strerror(errno));
++    mutt_sleep(2);
++    goto bail;
++  }
++  
++  sprintf(hc->tmpname, "%s/uidvalidity", hc->name);
++  f = fopen(hc->tmpname, "r");
++
++  if (f)
++  {
++    fscanf(f, "%u", &hc->uidvalidity);
++    if (idata->uidvalidity != hc->uidvalidity)
++    {
++      fclose(f);
++      f = NULL;
++    }
++  }
++
++  if (!f)
++  {
++    if (imap_headercache_purge(hc) == -1)
++      goto bail;
++
++    sprintf(hc->tmpname, "%s/uidvalidity", hc->name);
++    f = fopen(hc->tmpname, "w");
++    if (!f)
++    {
++      mutt_error(_("Can't create IMAP headercache uidvalidity file %s: %s"),
++                   hc->tmpname, strerror(errno));
++      mutt_sleep(2);
++      goto bail;
++    }
++
++    hc->uidvalidity = idata->uidvalidity;
++
++    fprintf(f, "%u\n", hc->uidvalidity);
++    fclose(f);
++  }
++
++  return hc;
++
++bail:
++  safe_free((void **)&hc->tmpname);
++  safe_free((void **)&hc->name);
++  safe_free((void **)&hc);
++
++  return NULL;
++}
++
++/* Close headercache */
++void imap_headercache_close(IMAP_HEADERCACHE *hc)
++{
++  safe_free((void **)&hc->tmpname);
++  safe_free((void **)&hc->name);
++  safe_free((void **)&hc);
++}
++
++static void imap_headercache_writehdr(FILE *f, IMAP_HEADER *h)
++{
++  /* Write the stuff in the header.  This must have a fixed length, as it is
++   * overwritten in case of imap_headercache_update
++   */
++  fprintf(f, "%1x %1x %1x %1x %1x %1x %8x %16lx %16lx %8x\n",
++          h->read, h->old, h->deleted, h->flagged, h->replied, h->changed,
++          h->sid, h->received, h->content_length, HEADER_DATA(h)->uid);
++}
++
++/* Add message to headercache */
++int imap_headercache_add(IMAP_HEADERCACHE *hc, IMAP_HEADER *h, FILE *from,
++                         size_t hdrsz)
++{
++  FILE *f;
++#define BUFSIZE 4096
++  char buf[BUFSIZE];
++  size_t sz;
++  int rc = -1;
++
++  sprintf(hc->tmpname, "%s/%u", hc->name, HEADER_DATA(h)->uid);
++
++  f = fopen(hc->tmpname, "w");
++  if (!f)
++  {
++    mutt_error(_("Can't create IMAP headercache message file %s: %s"),
++                 hc->tmpname, strerror(errno));
++    mutt_sleep(2);
++    goto bail;
++  }
++
++  imap_headercache_writehdr(f, h);
++
++  while ((sz = fread(buf, 1, (hdrsz < BUFSIZE ? hdrsz : BUFSIZE), from)) != 0)
++  {
++    hdrsz -= sz;
++    fwrite(buf, 1, sz, f);
++  }
++
++  fclose(f);
++
++  rc = 0;
++
++bail:
++  return rc;
++}
++
++/* Update flags in headercache message */
++int imap_headercache_update(IMAP_HEADERCACHE *hc, IMAP_HEADER *h)
++{
++  FILE *f;
++  int rc = -1;
++
++  sprintf(hc->tmpname, "%s/%u", hc->name, HEADER_DATA(h)->uid);
++
++  f = fopen(hc->tmpname, "r+");
++  if (!f)
++    goto bail;
++
++  imap_headercache_writehdr(f, h);
++
++  fclose(f);
++
++  rc = 0;
++
++bail:
++  return rc;
++}
++
++/* Delete message from headercache */
++int imap_headercache_delete(IMAP_HEADERCACHE *hc, IMAP_HEADER *h)
++{
++  int rc = -1;
++
++  sprintf(hc->tmpname, "%s/%u", hc->name, HEADER_DATA(h)->uid);
++
++  if (unlink(hc->tmpname) == -1)
++  {
++    mutt_error(_("Can't delete IMAP headercache message %s: %s"),
++               hc->tmpname, strerror(errno));
++    mutt_sleep(2);
++    goto bail;
++  }
++
++  rc = 0;
++  
++bail:
++  return rc;
++}
++
++/* Find message in headercache */
++FILE *imap_headercache_find(IMAP_HEADERCACHE *hc, IMAP_HEADER *h)
++{
++  FILE *f = NULL;
++  unsigned int flag_read, flag_old, flag_deleted, flag_flagged, flag_replied;
++  unsigned int flag_changed;
++  unsigned int uid;
++  unsigned long received;
++  unsigned long content_length;
++
++  sprintf(hc->tmpname, "%s/%u", hc->name, HEADER_DATA(h)->uid);
++
++  f = fopen(hc->tmpname, "r");
++  if (!f)
++    goto bail;
++
++  fscanf(f, "%x %x %x %x %x %x %x %lx %lx %x\n",
++         &flag_read, &flag_old, &flag_deleted, &flag_flagged, &flag_replied,
++         &flag_changed, &h->sid, &received, &content_length, &uid);
++
++  if (uid != HEADER_DATA(h)->uid)
++  {
++    fclose(f);
++    f = NULL;
++    goto bail;
++  }
++
++  h->received = received;
++  h->read = flag_read;
++  h->old = flag_old;
++  h->deleted = flag_deleted;
++  h->flagged = flag_flagged;
++  h->replied = flag_replied;
++  h->changed = flag_changed;
++  h->content_length = (long)content_length;
++
++bail:
++  return f;
++}
++
++/* Close file returned by imap_headercache_find */
++void imap_headercache_done(IMAP_HEADERCACHE *hc, FILE *f)
++{
++  fclose(f);
++}
++
+diff -ruN old/imap/imap_headercache.h work/mutt-1.5.5.1/imap/imap_headercache.h
+--- old/imap/imap_headercache.h	Thu Jan  1 01:00:00 1970
++++ imap/imap_headercache.h	Fri Nov 28 18:30:55 2003
+@@ -0,0 +1,47 @@
++/*
++ * Copyright (C) 2002 Tudor Bosman <tudorb-mutt@dwyn.net>
++ * 
++ *     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 _IMAP_HEADERCACHE_H
++#define _IMAP_HEADERCACHE_H
++#include "imap_private.h"
++#include "message.h"
++
++typedef struct IMAP_HEADERCACHE
++{
++  char *name;
++  char *tmpname;
++  unsigned int uidvalidity;
++  int exists;
++} IMAP_HEADERCACHE;
++
++struct IMAP_DATA;
++
++IMAP_HEADERCACHE *imap_headercache_open(struct IMAP_DATA *idata);
++
++void imap_headercache_close(IMAP_HEADERCACHE *hc);
++
++int imap_headercache_add(IMAP_HEADERCACHE *hc, IMAP_HEADER *h, FILE *from,
++                         size_t hdrsz);
++int imap_headercache_update(IMAP_HEADERCACHE *hc, IMAP_HEADER *h);
++int imap_headercache_delete(IMAP_HEADERCACHE *hc, IMAP_HEADER *h);
++
++FILE *imap_headercache_find(IMAP_HEADERCACHE *hc, IMAP_HEADER *h);
++void imap_headercache_done(IMAP_HEADERCACHE *hc, FILE *f);
++
++#endif
++
diff -ru  /usr/ports/mail/mutt-devel/files/extra-patch-pgp-dw ./files/extra-patch-pgp-dw
--- /usr/ports/mail/mutt-devel/files/extra-patch-pgp-dw	Thu Nov  6 21:10:56 2003
+++ ./files/extra-patch-pgp-dw	Fri Dec 19 17:21:29 2003
@@ -1,767 +1,220 @@
 http://www.woolridge.ca/mutt/patches/p0-patch-1.5.x.dw.pgp-menu-traditional.2
---- PATCHES Dec 2002 17:44:54 -0000	3.6
-+++ PATCHES Oct 2003 15:05:24 -0000
-@@ -0,0 +1 @@
-+patch-1.5.x.dw.pgp-menu-traditional.2
---- compose.c.orig	Thu Nov  6 08:28:10 2003
-+++ compose.c	Thu Nov  6 08:32:17 2003
-@@ -131,6 +131,13 @@
-     addstr (_("Sign"));
-   else
-     addstr (_("Clear"));
-+
-+  if ((WithCrypto & APPLICATION_PGP))
-+    if ((msg->security & (ENCRYPT | SIGN)))
-+      if ((msg->security & INLINE))
-+	addstr (_(" (inline)"));
-+      else
-+	addstr (_(" (PGP/MIME)"));
-   clrtoeol ();
- 
-   move (HDR_CRYPTINFO, 0);
-@@ -156,21 +163,25 @@
+--- PATCHES.old	Tue Apr 15 15:18:34 2003
++++ PATCHES	Fri Dec 19 15:00:56 2003
+@@ -0,0 +1,3 @@
++patch-1.5.5.dw.multiple-crypt-hook.2
++patch-1.5.5.dw.crypt-autoselectkey.1
++patch-1.5.5.dw.confirm-crypt-hook.1
+--- doc/manual.sgml.head.old	Wed Nov  5 10:41:34 2003
++++ doc/manual.sgml.head	Fri Dec 19 15:00:56 2003
+@@ -1421,7 +1421,9 @@
+ or because, for some reasons, you need to override the key Mutt would
+ normally use.  The crypt-hook command provides a method by which you can
+ 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.
+ 
+ The meaning of "key id" is to be taken broadly in this context:  You
+ can either put a numerical key ID here, an e-mail address, or even
+--- doc/muttrc.man.head.orig	Fri Dec 19 15:14:55 2003
++++ doc/muttrc.man.head	Fri Dec 19 15:19:05 2003
+@@ -290 +290,4 @@
+-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.
+--- hook.c	Tue Jan 21 13:25:21 2003
++++ hook.c	Fri Dec 19 15:00:56 2003
+@@ -117,7 +117,11 @@
+ 	ptr->rx.not == not &&
+ 	!mutt_strcmp (pattern.data, ptr->rx.pattern))
+     {
++#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
+       {
+ 	/* these hooks allow multiple commands with the same
+ 	 * pattern, so if we've already seen this pattern/command pair, just
+@@ -443,9 +447,25 @@
+   return _mutt_string_hook (chs, M_ICONVHOOK);
+ }
  
- static int pgp_send_menu (HEADER *msg, int *redraw)
+-char *mutt_crypt_hook (ADDRESS *adr)
++LIST *mutt_crypt_hook (ADDRESS *adr)
  {
-+  int use_autoinline = 0;
-   pgp_key_t p;
-   char input_signas[SHORT_STRING];
- 
-   if (!(WithCrypto & APPLICATION_PGP))
-     return msg->security;
- 
--  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;
+-  return _mutt_string_hook (adr->mailbox, M_CRYPTHOOK);
++  HOOK *hook;
++  LIST *key_list = NULL;
 +
-+  switch (mutt_multi_choice (_("PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "),
-+			     _("esabif")))
-   {
-   case 1: /* (e)ncrypt */
--    msg->security |= ENCRYPT;
-+    msg->security ^= ENCRYPT;
-     break;
- 
-   case 2: /* (s)ign */
--    msg->security |= SIGN;
-+    msg->security ^= SIGN;
-     break;
- 
-   case 3: /* sign (a)s */
-@@ -197,18 +208,38 @@
-     break;
- 
-   case 4: /* (b)oth */
--    msg->security = ENCRYPT | SIGN;
-+    if ((msg->security & (ENCRYPT | SIGN)) == (ENCRYPT | SIGN))
-+      msg->security = 0;
-+    else
-+      msg->security |= (ENCRYPT | SIGN);
-+    break;
++  if (!adr && !adr->mailbox)
++    return (NULL);
 +
-+  case 5: /* (i)nline */
-+    if ((msg->security & (ENCRYPT | SIGN)))
-+      msg->security ^= INLINE;
-+    else
-+      msg->security &= ~INLINE;
-     break;
- 
--  case 5: /* (f)orget it */
-+  case 6: /* (f)orget it */
-     msg->security = 0;
-     break;
-   }
- 
--  if (msg->security && msg->security != APPLICATION_PGP)
--    msg->security |= APPLICATION_PGP;
--  else
--    msg->security = 0;
-+  if (msg->security)
++  for (hook = Hooks; hook; hook = hook->next)
 +  {
-+    if (! (msg->security & (ENCRYPT | SIGN)))
-+    {
-+      msg->security = 0;
-+    }
-+    else
-+    {
-+      msg->security |= APPLICATION_PGP;
++    if (!hook->command)
++      continue;
++    if (!(hook->type & M_CRYPTHOOK))
++      continue;
 +
-+      if (use_autoinline && option (OPTPGPAUTOINLINE))
-+	msg->security |= INLINE;
-+    }
++    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);
+ }
  
-   if(*redraw)
-       redraw_crypt_lines (msg);
---- crypt.c Sep 2003 13:03:25 -0000	3.19
-+++ crypt.c Oct 2003 15:05:24 -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 */
-   }
-@@ -391,2 +376,5 @@ int mutt_is_application_pgp (BODY *m)
-   }
-+  if (t)
-+    t |= PGPINLINE;
-+
-   return t;
---- init.h Sep 2003 15:10:09 -0000	3.40
-+++ init.h Oct 2003 15:05:25 -0000
-@@ -1380,2 +1380,44 @@ struct option_t MuttVars[] = {
+ #ifdef USE_SOCKET
+--- init.h	Wed Nov  5 10:41:32 2003
++++ init.h	Fri Dec 19 15:00:46 2003
+@@ -1209,6 +1209,16 @@
+   ** when you are at the end of a message and invoke the \fInext-page\fP
+   ** function.
    */
-+  { "pgp_create_traditional",	DT_SYN, R_NONE, UL "pgp_autoinline", 0 },
-+  { "pgp_autoinline",		DT_BOOL, R_NONE, OPTPGPAUTOINLINE, 0 },
++  
++
++  { "pgp_autoselectkey",	DT_SYN,  R_NONE, UL "crypt_autoselectkey", 0 },
++  { "crypt_autoselectkey",	DT_BOOL, R_NONE, OPTCRYPTAUTOSELECT, 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)
++  ** 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_auto_traditional",	DT_SYN, R_NONE, UL "pgp_replyinline", 0 },
-+  { "pgp_replyinline",		DT_BOOL, R_NONE, OPTPGPREPLYINLINE, 0 },
+   { "pgp_autosign", 	DT_SYN,  R_NONE, UL "crypt_autosign", 0 },
+   { "crypt_autosign",	DT_BOOL, R_NONE, OPTCRYPTAUTOSIGN, 0 },
+   /*
+@@ -1233,6 +1243,15 @@
+   ** then OpenSSL is used instead to create S/MIME messages and
+   ** settings can be overridden by use of the \fIsmime-menu\fP.
+   ** (Crypto only)
++  */
++  { "pgp_confirmhook",		DT_SYN, R_NONE, UL "crypt_confirmhook", 1 },
++  { "crypt_confirmhook",	DT_BOOL, R_NONE, OPTCRYPTCONFIRMHOOK, 1 },
 +  /*
 +  ** .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 },
-@@ -1429,11 +1471,8 @@ struct option_t MuttVars[] = {
++  ** 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_create_traditional", DT_QUAD, R_NONE, OPT_PGPTRADITIONAL, M_NO },
-+  { "pgp_mime_ask", DT_QUAD, R_NONE, OPT_PGPMIMEASK, M_NO },
+   { "pgp_ignore_subkeys", DT_BOOL, R_NONE, OPTPGPIGNORESUB, 1},
    /*
-   ** .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
-@@ -1441,19 +1480,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 Oct 2003 20:34:59 -0000	3.21
-+++ mutt.h Oct 2003 15:05:25 -0000
-@@ -276,2 +276,3 @@ enum
-   OPT_MOVE,
-+  OPT_PGPMIMEASK,     /* ask to revert to PGP/MIME when inline fails */
-   OPT_PGPTRADITIONAL, /* create old-style PGP messages */
-@@ -443,3 +444,2 @@ enum
+--- mutt.h	Wed Nov  5 10:41:32 2003
++++ mutt.h	Fri Dec 19 15:00:46 2003
+@@ -427,6 +427,7 @@
+ 
+   /* PGP options */
+   
++  OPTCRYPTAUTOSELECT,
+   OPTCRYPTAUTOSIGN,
+   OPTCRYPTAUTOENCRYPT,
+   OPTCRYPTAUTOPGP,
+@@ -438,6 +439,7 @@
+   OPTSMIMEISDEFAULT,
+   OPTASKCERTLABEL,
+   OPTSDEFAULTDECRYPTKEY,
++  OPTCRYPTCONFIRMHOOK,
+   OPTPGPIGNORESUB,
+   OPTPGPCHECKEXIT,
    OPTPGPLONGIDS,
--  OPTPGPAUTOTRAD,
- #if 0
-@@ -451,2 +451,4 @@ enum
-   OPTPGPSHOWUNUSABLE,
-+  OPTPGPAUTOINLINE,
-+  OPTPGPREPLYINLINE,
- 
-@@ -632,4 +634,4 @@ typedef struct header
+--- pgp.c	Wed Nov  5 10:41:33 2003
++++ pgp.c	Fri Dec 19 15:00:56 2003
+@@ -1016,6 +1016,8 @@
+   char *keyID, *keylist = NULL, *t;
+   size_t keylist_size = 0;
+   size_t keylist_used = 0;
++  LIST *hook_list = NULL;
++  LIST *hook = NULL;
+   ADDRESS *tmp = NULL, *addr = NULL;
+   ADDRESS **last = &tmp;
+   ADDRESS *p, *q;
+@@ -1055,7 +1057,7 @@
+     {
+       int r;
+       snprintf (buf, sizeof (buf), _("Use keyID = \"%s\" for %s?"), keyID, p->mailbox);
+-      if ((r = mutt_yesorno (buf, M_YES)) == M_YES)
++      if (!option(OPTCRYPTCONFIRMHOOK) || (r = mutt_yesorno (buf, M_YES)) == M_YES)
+       {
+ 	if (is_numerical_keyid (keyID))
+ 	{
+--- pgpkey.c	Wed Nov  5 10:41:33 2003
++++ pgpkey.c	Fri Dec 19 15:00:46 2003
+@@ -435,8 +435,13 @@
+   return rv;
+ }
+ 
++
++#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)
  {
--  unsigned int security : 7;  /* bit 0-4: flags, bit 5,6: application.
--				 see: crypt.h pgplib.h, smime.h */
-+  unsigned int security : 9;  /* bit 0-6: flags, bit 7,8: application.
-+				 see: mutt_crypt.h */
- 
---- mutt_crypt.h Jan 2003 23:54:30 -0000	3.4
-+++ mutt_crypt.h Oct 2003 15:05:25 -0000
-@@ -35,7 +35,9 @@
- #define GOODSIGN   (1 << 2)
--#define BADSIGN    (1 << 3) /* FIXME: value also used below for PGPKEY */
-+#define BADSIGN    (1 << 3)
- #define SIGNOPAQUE (1 << 4)
-+#define KEYBLOCK   (1 << 5) /* KEY too generic? */
-+#define INLINE     (1 << 6)
- 
--#define APPLICATION_PGP    (1 << 5) 
--#define APPLICATION_SMIME  (1 << 6)
-+#define APPLICATION_PGP    (1 << 7) 
-+#define APPLICATION_SMIME  (1 << 8)
- 
-@@ -44,3 +46,4 @@
- #define PGPGOODSIGN (APPLICATION_PGP | GOODSIGN)
--#define PGPKEY      (APPLICATION_PGP | (1 << 3)) 
-+#define PGPKEY      (APPLICATION_PGP | KEYBLOCK) 
-+#define PGPINLINE   (APPLICATION_PGP | INLINE)
- 
-@@ -103,3 +106,3 @@ typedef struct pgp_keyinfo *pgp_key_t;
- 
--int mutt_protect (HEADER *, HEADER *, char *);
-+int mutt_protect (HEADER *, char *);
- 
---- postpone.c Sep 2003 17:22:09 -0000	3.9
-+++ postpone.c Oct 2003 15:05:25 -0000
-@@ -486,2 +486,7 @@ int mutt_parse_crypt_hdr (char *p, int s
+   int keymax;
+   pgp_uid_t **KeyTable;
+@@ -450,6 +455,7 @@
+   pgp_uid_t *a;
+   int (*f) (const void *, const void *);
+ 
++  int keymatch = 0;		/* count matching keys */
+   int unusable = 0;
+ 
+   keymax = 0;
+@@ -479,6 +485,7 @@
+       
+       KeyTable[i++] = a;
+     }
++    keymatch++;
+   }
  
-+      case 'i':
-+      case 'I':
-+	pgp |= INLINE;
-+	break;
-+
-       default:
---- send.c Sep 2003 12:56:49 -0000	3.26
-+++ send.c Oct 2003 15:05:25 -0000
-@@ -1256,3 +1256,10 @@ ci_send_message (int flags,		/* send mod
- 	msg->security |= SIGN;
--    }      
-+      if (WithCrypto & APPLICATION_PGP && (msg->security & (ENCRYPT | SIGN)))
+   if (!i && unusable)
+@@ -487,6 +494,21 @@
+     mutt_sleep (1);
+     return NULL;
+   }
++  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))
 +      {
-+	if (option (OPTPGPAUTOINLINE))
-+	  msg->security |= INLINE;
-+	if (option (OPTPGPREPLYINLINE) && cur && (cur->security & INLINE))
-+	  msg->security |= INLINE;
++	safe_free ((void **) &KeyTable);
++	return (kp);
 +      }
 +    }
++  }
  
-@@ -1494,3 +1501,3 @@ main_loop:
-       if ((crypt_get_keys (msg, &pgpkeylist) == -1) ||
--          mutt_protect (msg, cur, pgpkeylist) == -1)
-+          mutt_protect (msg, pgpkeylist) == -1)
+   switch (PgpSortKeys & SORT_MASK)
+   {
+@@ -597,9 +619,7 @@
+ 	  break;
+ 	}
+       
+-      if (option (OPTPGPCHECKTRUST) &&
+-	  (!pgp_id_is_valid (KeyTable[menu->current])
+-	   || !pgp_id_is_strong (KeyTable[menu->current])))
++      if (!pgp_trusted_id(KeyTable[menu->current]))
        {
-@@ -1574,3 +1581,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 Oct 2003 15:05:25 -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);
---- po/ca.po Apr 2003 11:00:59 -0000	3.10
-+++ po/ca.po Oct 2003 15:05:26 -0000
-@@ -602,10 +602,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)mbds, 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, si(g)na com a, (a)mbds, en (l)nia, o en (c)lar? "
- 
- # ivb (2003/03/26)
--# ivb  (x)ifra, (s)igna, si(g)na com a, (a)mbds, (c)lar
-+# ivb  (x)ifra, (s)igna, si(g)na com a, (a)mbds, en (l)nia, o en (c)lar
- #: compose.c:166
--msgid "esabf"
--msgstr "xsgac"
-+msgid "esabif"
-+msgstr "xsgalc"
- 
---- po/cs.po Mar 2003 22:43:06 -0000	3.8
-+++ po/cs.po Oct 2003 15:05:26 -0000
-@@ -687,4 +687,4 @@ msgstr "Zaifrovat"
- #, fuzzy
--msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
--msgstr "()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 "()ifrovat, (p)odepsat, podepsat (j)ako, (o)boj, p(m), i (n)ic?"
- 
-@@ -692,4 +692,4 @@ msgstr "()ifrovat, (p)odepsat, podepsat
- #: compose.c:166
--msgid "esabf"
--msgstr "pjon"
-+msgid "esabif"
-+msgstr "pjomn"
- 
---- po/da.po Mar 2003 22:43:06 -0000	3.8
-+++ po/da.po Oct 2003 15:05:26 -0000
-@@ -577,8 +577,8 @@ msgstr "Kryptr"
- #, fuzzy
--msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
--msgstr "(k)ryptr, (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)ryptr, (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 Apr 2003 08:31:00 -0000	3.11
-+++ po/de.po Oct 2003 15:05:27 -0000
-@@ -568,8 +568,8 @@ msgstr "Verschlsseln 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 Mar 2003 22:43:06 -0000	3.9
-+++ po/el.po Oct 2003 15:05:27 -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 May 2003 17:48:28 -0000	3.9
-+++ po/eo.po Oct 2003 15:05:27 -0000
-@@ -570,8 +570,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 Apr 2003 10:18:15 -0000	3.11
-+++ po/es.po Oct 2003 15:05:27 -0000
-@@ -575,4 +575,5 @@ 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? "
-+
- 
-@@ -580,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 Mar 2003 22:43:07 -0000	3.10
-+++ po/et.po Oct 2003 15:05:28 -0000
-@@ -570,8 +570,8 @@ msgstr "Krpti kasutades: "
- #: compose.c:165
--msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
--msgstr "PGP (k)rpti, (a)llkiri, allk. ku(i), (m)lemad vi (u)nusta? "
-+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
-+msgstr "PGP (k)rpti, (a)llkiri, allk. ku(i), (m)lemad, k(e)hasse, vi (u)nusta? "
- 
- #: compose.c:166
--msgid "esabf"
--msgstr "kaimu"
-+msgid "esabif"
-+msgstr "kaimeu"
- 
---- po/fr.po Apr 2003 08:38:13 -0000	3.19
-+++ po/fr.po Oct 2003 15:05:28 -0000
-@@ -594,8 +594,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 Mar 2003 22:43:07 -0000	3.8
-+++ po/gl.po Oct 2003 15:05:28 -0000
-@@ -579,8 +579,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 Aug 2003 11:01:09 -0000	3.9
-+++ po/hu.po Oct 2003 15:05:29 -0000
-@@ -563,8 +563,8 @@ msgstr "Titkosts: "
- #: compose.c:165
--msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
--msgstr "PGP (t)itkost, (a)lr, alr (m)int, titkost (s) alr, m(g)se? "
-+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
-+msgstr "PGP (t)itkost, (a)lr, alr (m)int, titkost (s) alr, (b)egyazott, m(g)se? "
- 
- #: compose.c:166
--msgid "esabf"
--msgstr "tamsg"
-+msgid "esabif"
-+msgstr "tamsbg"
- 
---- po/id.po May 2003 17:48:28 -0000	3.10
-+++ po/id.po Oct 2003 15:05:29 -0000
-@@ -571,8 +571,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 Mar 2003 22:43:07 -0000	3.8
-+++ po/it.po Oct 2003 15:05:29 -0000
-@@ -581,8 +581,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 Sep 2003 17:15:20 -0000	3.17
-+++ po/ja.po Oct 2003 15:05:30 -0000
-@@ -568,8 +568,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 Sep 2003 10:11:49 -0000	3.12
-+++ po/ko.po Oct 2003 15:05:30 -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/lt.po Mar 2003 22:43:07 -0000	3.8
-+++ po/lt.po Oct 2003 15:05:30 -0000
-@@ -577,5 +577,5 @@ msgstr "Uifruoti"
- #, 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)irayt, pasirayt k(a)ip, a(b)u, rinktis (m)ic algoritm, "
-+"(u)ifruot, pa(s)irayt, pasirayt k(a)ip, a(b)u, (l)aike, "
- "ar (p)amirti?"
-@@ -584,4 +584,4 @@ msgstr ""
- #, fuzzy
--msgid "esabf"
--msgstr "usabmp"
-+msgid "esabif"
-+msgstr "usablp"
- 
-@@ -597,4 +597,3 @@ msgid ""
- msgstr ""
--"(u)ifruot, pa(s)irayt, pasirayt k(a)ip, a(b)u, rinktis (m)ic algoritm, "
--"ar (p)amirti?"
-+"(u)ifruot, pa(s)irayt, uifruo(t) su, pasirayt k(a)ip, a(b)u, ar (p)amirti?"
- 
-@@ -603,3 +602,3 @@ msgstr ""
- msgid "eswabf"
--msgstr "usabmp"
-+msgstr "ustabp"
- 
---- po/nl.po Sep 2003 13:09:59 -0000	3.12
-+++ po/nl.po Oct 2003 15:05:31 -0000
-@@ -565,8 +565,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)eide, (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)eide, ber(i)cht, (g)een? "
- 
- #: compose.c:166
--msgid "esabf"
--msgstr "voabg"
-+msgid "esabif"
-+msgstr "voabig"
- 
---- po/pl.po Sep 2003 17:20:56 -0000	3.13
-+++ po/pl.po Oct 2003 15:05:31 -0000
-@@ -566,8 +566,8 @@ msgstr "Zaszyfruj uywajc: "
- #: 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 Mar 2003 22:43:08 -0000	3.9
-+++ po/pt_BR.po Oct 2003 15:05:31 -0000
-@@ -580,5 +580,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? "
- 
-@@ -586,4 +586,4 @@ msgstr ""
- #, fuzzy
--msgid "esabf"
--msgstr "escamq"
-+msgid "esabif"
-+msgstr "escaiq"
- 
-@@ -599,3 +599,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? "
- 
-@@ -604,3 +604,3 @@ msgstr ""
- msgid "eswabf"
--msgstr "escamq"
-+msgstr "esncaq"
- 
---- po/ru.po Apr 2003 08:21:09 -0000	3.14
-+++ po/ru.po Oct 2003 15:05:32 -0000
-@@ -576,8 +576,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 Mar 2003 22:43:08 -0000	3.8
-+++ po/sk.po Oct 2003 15:05:32 -0000
-@@ -585,5 +585,5 @@ msgstr "Zaifruj"
- #, 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? "
-@@ -592,4 +592,4 @@ msgstr ""
- #, fuzzy
--msgid "esabf"
--msgstr "esabmf"
-+msgid "esabif"
-+msgstr "esabif"
- 
-@@ -605,4 +605,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? "
- 
-@@ -611,3 +610,3 @@ msgstr ""
- msgid "eswabf"
--msgstr "esabmf"
-+msgstr "eswabf"
- 
---- po/sv.po Mar 2003 22:43:08 -0000	3.9
-+++ po/sv.po Oct 2003 15:05:32 -0000
-@@ -567,8 +567,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 Mar 2003 22:43:08 -0000	3.8
-+++ po/tr.po Oct 2003 15:05:33 -0000
-@@ -576,5 +576,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? "
-@@ -582,4 +582,4 @@ msgstr ""
- #: compose.c:166
--msgid "esabf"
--msgstr "imfkcp"
-+msgid "esabif"
-+msgstr "imfkip"
- 
---- po/uk.po Mar 2003 22:43:08 -0000	3.9
-+++ po/uk.po Oct 2003 15:05:33 -0000
-@@ -571,8 +571,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 Mar 2003 22:43:08 -0000	3.8
-+++ po/zh_CN.po Oct 2003 15:05:33 -0000
-@@ -584,5 +584,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)"
- ""
-@@ -590,4 +590,4 @@ msgstr ""
- #: compose.c:166
--msgid "esabf"
--msgstr ""
-+msgid "esabif"
-+msgstr "esabif"
- 
---- po/zh_TW.po Mar 2003 22:43:08 -0000	3.8
-+++ po/zh_TW.po Oct 2003 15:05:34 -0000
-@@ -576,3 +576,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)放棄?"
-@@ -580,4 +580,4 @@ msgstr "(1)加密, (2)簽名, (3)用別
- #: compose.c:166
--msgid "esabf"
--msgstr "12345"
-+msgid "esabif"
-+msgstr "1234i5"
+ 	char *s = "";
+ 	char buff[LONG_STRING];
+--- protos.h	Wed Nov  5 10:41:33 2003
++++ protos.h	Fri Dec 19 15:00:56 2003
+@@ -129,7 +129,7 @@
+ char *mutt_get_body_charset (char *, size_t, BODY *);
+ 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);
  
+ const char *mutt_make_version (void);
diff -ru  /usr/ports/mail/mutt-devel/scripts/generate-plist ./scripts/generate-plist
--- /usr/ports/mail/mutt-devel/scripts/generate-plist	Thu Nov  6 21:10:56 2003
+++ ./scripts/generate-plist	Fri Dec 19 17:21:29 2003
@@ -138,6 +138,9 @@
     if [ "$MUTT_EDIT_THREADS" = "yes" ]; then
       html=$(($html + 3))
     fi
+    if [ "$MUTT_IMAP_HEADER_CACHE" = "yes" ]; then
+      html=$(($html + 1))
+    fi
     if [ "$MUTT_SIGNATURE_MENU" = "yes" ]; then
       html=$(($html + 1))
     fi
@@ -145,7 +148,7 @@
       html=$(($html + 1))
     fi
     if [ "$MUTT_PGP_PATCH" = "yes" ]; then
-      html=$(($html + 1))
+      html=$(($html + 2))
     fi
     echo "%%DOCSDIR%%/html/manual.html" >> $tmp_first
     echo "%%DOCSDIR%%/html/manual_toc.html" >> $tmp_first 

>Release-Note:
>Audit-Trail:
>Unformatted:
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200312191651.hBJGpijI094685>