View | Details | Raw Unified | Return to bug 60403
Collapse All | Expand All

(-)./Makefile (-5 / +28 lines)
Lines 41-46 Link Here
41
#  WITH_MUTT_QUOTE_PATCH
41
#  WITH_MUTT_QUOTE_PATCH
42
#  This is a default knob and can be disabled by WITHOUT_MUTT_QUOTE_PATCH
42
#  This is a default knob and can be disabled by WITHOUT_MUTT_QUOTE_PATCH
43
#
43
#
44
# If you want to have the IMAP header cache define:
45
#  WITH_MUTT_IMAP_HEADER_CACHE
46
#
44
# If you want to make SMIME outlook compatible define:
47
# If you want to make SMIME outlook compatible define:
45
#  WITH_MUTT_SMIME_OUTLOOK_COMPAT
48
#  WITH_MUTT_SMIME_OUTLOOK_COMPAT
46
#  This is a default knob and can be disabled by
49
#  This is a default knob and can be disabled by
Lines 72-77 Link Here
72
75
73
PORTNAME=	mutt-devel
76
PORTNAME=	mutt-devel
74
PORTVERSION=	1.5.5.1
77
PORTVERSION=	1.5.5.1
78
PORTREVISION=	1
75
CATEGORIES+=	mail ipv6
79
CATEGORIES+=	mail ipv6
76
.if defined(WITH_MUTT_NNTP)
80
.if defined(WITH_MUTT_NNTP)
77
CATEGORIES+=	news
81
CATEGORIES+=	news
Lines 86-92 Link Here
86
		http://www2.mutt.org.ua/download/mutt-${VVV_PATCH_VERSION}/:vvv \
90
		http://www2.mutt.org.ua/download/mutt-${VVV_PATCH_VERSION}/:vvv \
87
		ftp://ftp.mutt.org.ua/pub/mutt/mutt-${VVV_PATCH_VERSION}/:vvv \
91
		ftp://ftp.mutt.org.ua/pub/mutt/mutt-${VVV_PATCH_VERSION}/:vvv \
88
		ftp://ftp2.mutt.org.ua/pub/mutt/mutt-${VVV_PATCH_VERSION}/:vvv \
92
		ftp://ftp2.mutt.org.ua/pub/mutt/mutt-${VVV_PATCH_VERSION}/:vvv \
89
		http://cedricduval.free.fr/download/mutt/:cd \
93
		http://cedricduval.free.fr/mutt/patches/download/:cd \
90
		http://home.woolridge.ca/mutt/patches/:dw
94
		http://home.woolridge.ca/mutt/patches/:dw
91
95
92
MAINTAINER?=	udo.schweigert@siemens.com
96
MAINTAINER?=	udo.schweigert@siemens.com
Lines 117-124 Link Here
117
121
118
.include <bsd.port.pre.mk>
122
.include <bsd.port.pre.mk>
119
123
120
CD_PATCH_VERSION=	1.5.4
124
CD_IFDEF_PATCH_VERSION=	1.5.4
121
DW_PATCH_VERSION=	1.5.x
125
DW_PATCH_VERSION=	1.5.5
122
DW_MBOX_PATCH_VERSION=	1.5.4
126
DW_MBOX_PATCH_VERSION=	1.5.4
123
.if !defined(VVV_PATCH_VERSION)
127
.if !defined(VVV_PATCH_VERSION)
124
VVV_PATCH_VERSION=	${PORTVERSION}
128
VVV_PATCH_VERSION=	${PORTVERSION}
Lines 126-136 Link Here
126
.if !defined(CD_PATCH_VERSION)
130
.if !defined(CD_PATCH_VERSION)
127
CD_PATCH_VERSION=	${PORTVERSION}
131
CD_PATCH_VERSION=	${PORTVERSION}
128
.endif
132
.endif
133
.if !defined(CD_IFDEF_PATCH_VERSION)
134
CD_IFDEF_PATCH_VERSION=	${CD_PATCH_VERSION}
135
.endif
129
.if !defined(DW_PATCH_VERSION)
136
.if !defined(DW_PATCH_VERSION)
130
DW_PATCH_VERSION=	${PORTVERSION}
137
DW_PATCH_VERSION=	${PORTVERSION}
131
.endif
138
.endif
132
.if !defined(DW_MBOX_PATCH_VERSION)
139
.if !defined(DW_MBOX_PATCH_VERSION)
133
DW_MBOX_PATCH_VERSION=	${PORTVERSION}
140
DW_MBOX_PATCH_VERSION=	${DW_PATCH_VERSION}
134
.endif
141
.endif
135
142
136
# XXX
143
# XXX
Lines 187-192 Link Here
187
pre-configure::
194
pre-configure::
188
	@${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-smime-outlook
195
	@${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-smime-outlook
189
.endif
196
.endif
197
.if defined(WITH_MUTT_IMAP_HEADER_CACHE)
198
pre-configure::
199
	@${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-imap-header-cache
200
.endif
190
201
191
.if ! defined(WITHOUT_MUTT_PGP_PATCH)
202
.if ! defined(WITHOUT_MUTT_PGP_PATCH)
192
SGML_NEEDED=	yes
203
SGML_NEEDED=	yes
Lines 215-220 Link Here
215
.endif
226
.endif
216
.if defined(WITH_MUTT_NNTP)
227
.if defined(WITH_MUTT_NNTP)
217
PATCHFILES+=	patch-${VVV_PATCH_VERSION}.vvv.nntp.gz:vvv
228
PATCHFILES+=	patch-${VVV_PATCH_VERSION}.vvv.nntp.gz:vvv
229
PATCHFILES+=	patch-${VVV_PATCH_VERSION}.vvv.compose.gz:vvv
218
CONFIGURE_ARGS+=	--enable-nntp
230
CONFIGURE_ARGS+=	--enable-nntp
219
SGML_NEEDED=	yes
231
SGML_NEEDED=	yes
220
.endif
232
.endif
Lines 233-239 Link Here
233
SGML_NEEDED=	yes
245
SGML_NEEDED=	yes
234
.endif
246
.endif
235
.if defined(WITH_MUTT_IFDEF_PATCH)
247
.if defined(WITH_MUTT_IFDEF_PATCH)
236
PATCHFILES+=	patch-${CD_PATCH_VERSION}.cd.ifdef.1:cd
248
PATCHFILES+=	patch-${CD_IFDEF_PATCH_VERSION}.cd.ifdef.1:cd
237
SGML_NEEDED=	yes
249
SGML_NEEDED=	yes
238
.endif
250
.endif
239
.if defined(WITH_MUTT_MBOX_HOOK_PATCH)
251
.if defined(WITH_MUTT_MBOX_HOOK_PATCH)
Lines 262-267 Link Here
262
.if ! defined(WITHOUT_MUTT_QUOTE_PATCH)
274
.if ! defined(WITHOUT_MUTT_QUOTE_PATCH)
263
SCRIPTS_ENV+=	MUTT_QUOTE_PATCH="yes"
275
SCRIPTS_ENV+=	MUTT_QUOTE_PATCH="yes"
264
.endif
276
.endif
277
.if defined(WITH_MUTT_IMAP_HEADER_CACHE)
278
SCRIPTS_ENV+=	MUTT_IMAP_HEADER_CACHE="yes"
279
.endif
265
.if defined(WITH_MUTT_EDIT_THREADS)
280
.if defined(WITH_MUTT_EDIT_THREADS)
266
SCRIPTS_ENV+=	MUTT_EDIT_THREADS="yes"
281
SCRIPTS_ENV+=	MUTT_EDIT_THREADS="yes"
267
.endif
282
.endif
Lines 336-341 Link Here
336
	@${ECHO} "This may work for a color terminal only when defining" >> ${PKGMESSAGE}
351
	@${ECHO} "This may work for a color terminal only when defining" >> ${PKGMESSAGE}
337
	@${ECHO} "COLORTERM=yes and COLORFGBG=color,color in your" >> ${PKGMESSAGE}
352
	@${ECHO} "COLORTERM=yes and COLORFGBG=color,color in your" >> ${PKGMESSAGE}
338
	@${ECHO} "environment." >> ${PKGMESSAGE}
353
	@${ECHO} "environment." >> ${PKGMESSAGE}
354
	@${ECHO} "====================================================" >> ${PKGMESSAGE}
355
.endif
356
.if defined(WITH_MUTT_IMAP_HEADER_CACHE)
357
	@${ECHO} "====================================================" >> ${PKGMESSAGE}
358
	@${ECHO} "You have installed ${PORTNAME} with the IMAP header cache enabled." >> ${PKGMESSAGE}
359
	@${ECHO} "Please be aware that this - at the moment - could result in" >> ${PKGMESSAGE}
360
	@${ECHO} "incorrect display of message flags if there is another client" >> ${PKGMESSAGE}
361
	@${ECHO} "simultaneously using the same mailbox." >> ${PKGMESSAGE}
339
	@${ECHO} "====================================================" >> ${PKGMESSAGE}
362
	@${ECHO} "====================================================" >> ${PKGMESSAGE}
340
.endif
363
.endif
341
.if !defined(BATCH)
364
.if !defined(BATCH)
(-)./distinfo (-2 / +3 lines)
Lines 1-9 Link Here
1
MD5 (mutt/mutt-1.5.5.1i.tar.gz) = 9729ee2a2024b57e2a903ec7753970a5
1
MD5 (mutt/mutt-1.5.5.1i.tar.gz) = 9729ee2a2024b57e2a903ec7753970a5
2
MD5 (mutt/patch-1.5.5.1.rr.compressed.gz) = 12bf7e03af3a0d7529dfbdec5dd0f63a
2
MD5 (mutt/patch-1.5.5.1.rr.compressed.gz) = 12bf7e03af3a0d7529dfbdec5dd0f63a
3
MD5 (mutt/patch-1.5.5.1.vvv.nntp.gz) = a655b6b5ceb582640172d5476093705d
3
MD5 (mutt/patch-1.5.5.1.vvv.nntp.gz) = a655b6b5ceb582640172d5476093705d
4
MD5 (mutt/patch-1.5.5.1.vvv.compose.gz) = 69e946fe70735d37b9f8e6f6ef6376d1
4
MD5 (mutt/patch-1.5.5.1.vvv.initials.gz) = 5abdf15c3f76b5c24f29767e65e0fc32
5
MD5 (mutt/patch-1.5.5.1.vvv.initials.gz) = 5abdf15c3f76b5c24f29767e65e0fc32
5
MD5 (mutt/patch-1.5.5.1.vvv.quote.gz) = abb2ba5829110cba4be323d6b6f303dc
6
MD5 (mutt/patch-1.5.5.1.vvv.quote.gz) = abb2ba5829110cba4be323d6b6f303dc
6
MD5 (mutt/patch-1.5.4.cd.edit_threads.9.5) = f8d7fe6ea1a6a1b92c942f4446918433
7
MD5 (mutt/patch-1.5.5.1.cd.edit_threads.9.5) = a8a3a973d8693f8af526cecf7edbd71f
7
MD5 (mutt/patch-1.5.4.cd.signatures_menu.2.1) = 5b2298335071c46ee1f3ed8c689066b1
8
MD5 (mutt/patch-1.5.5.1.cd.signatures_menu.2.1) = 22caeffb4a612f5fa6e1f585b40c51a6
8
MD5 (mutt/patch-1.5.4.cd.ifdef.1) = a545036cdb55519154d0b35465f52daa
9
MD5 (mutt/patch-1.5.4.cd.ifdef.1) = a545036cdb55519154d0b35465f52daa
9
MD5 (mutt/p0-patch-1.5.4.dw.mbox-hook.1) = 326f415380cc377c99d2232f16267ffe
10
MD5 (mutt/p0-patch-1.5.4.dw.mbox-hook.1) = 326f415380cc377c99d2232f16267ffe
(-)./files/extra-patch-imap-header-cache (+873 lines)
Line 0 Link Here
1
diff -ru old/globals.h work/mutt-1.5.5.1/globals.h
2
--- old/globals.h	Wed Nov  5 10:41:31 2003
3
+++ globals.h	Fri Nov 28 18:30:37 2003
4
@@ -57,6 +57,7 @@
5
 WHERE char *ImapHomeNamespace INITVAL (NULL);
6
 WHERE char *ImapPass INITVAL (NULL);
7
 WHERE char *ImapUser INITVAL (NULL);
8
+WHERE char *ImapHeadercache INITVAL (NULL);
9
 #endif
10
 WHERE char *Inbox;
11
 WHERE char *Ispell;
12
diff -ru old/imap/Makefile.am work/mutt-1.5.5.1/imap/Makefile.am
13
--- old/imap/Makefile.am	Thu Jan 24 14:35:57 2002
14
+++ imap/Makefile.am	Fri Nov 28 18:30:37 2003
15
@@ -22,4 +22,5 @@
16
 noinst_HEADERS = auth.h imap_private.h message.h
17
 
18
 libimap_a_SOURCES = auth.c auth_login.c browse.c command.c imap.c imap.h \
19
-	message.c utf7.c util.c $(AUTHENTICATORS) $(GSSSOURCES)
20
+	imap_headercache.c imap_headercache.h message.c utf7.c util.c \
21
+	$(AUTHENTICATORS) $(GSSSOURCES)
22
diff -ru old/imap/imap.c work/mutt-1.5.5.1/imap/imap.c
23
--- old/imap/imap.c	Wed Nov  5 10:41:36 2003
24
+++ imap/imap.c	Fri Nov 28 18:30:37 2003
25
@@ -29,6 +29,7 @@
26
 #include "browser.h"
27
 #include "message.h"
28
 #include "imap_private.h"
29
+#include "imap_headercache.h"
30
 #ifdef USE_SSL
31
 # include "mutt_ssl.h"
32
 #endif
33
@@ -546,6 +547,13 @@
34
 
35
   /* Clean up path and replace the one in the ctx */
36
   imap_fix_path (idata, mx.mbox, buf, sizeof (buf));
37
+
38
+  if (idata->hcache)
39
+  {
40
+    imap_headercache_close(idata->hcache);
41
+    idata->hcache = NULL;
42
+  }
43
+
44
   FREE(&(idata->mailbox));
45
   idata->mailbox = safe_strdup (buf);
46
   imap_qualify_path (buf, sizeof (buf), &mx, idata->mailbox);
47
@@ -556,6 +564,7 @@
48
   idata->ctx = ctx;
49
 
50
   /* clear mailbox status */
51
+  idata->uidvalidity = 0;
52
   idata->status = 0;
53
   memset (idata->rights, 0, (RIGHTSMAX+7)/8);
54
   idata->newMailCount = 0;
55
@@ -601,6 +610,15 @@
56
       if ((pc = imap_get_flags (&(idata->flags), pc)) == NULL)
57
 	goto fail;
58
     }
59
+    /* save UIDVALIDITY for the header cache */
60
+    else if (ascii_strncasecmp("OK [UIDVALIDITY", pc, 14) == 0)
61
+    {
62
+      dprint(2, (debugfile, "Getting mailbox UIDVALIDITY\n"));
63
+      pc += 3;
64
+      pc = imap_next_word(pc);
65
+
66
+      sscanf(pc, "%u", &(idata->uidvalidity));
67
+    }
68
     else
69
     {
70
       pc = imap_next_word (pc);
71
@@ -684,6 +702,9 @@
72
   ctx->hdrs = safe_calloc (count, sizeof (HEADER *));
73
   ctx->v2r = safe_calloc (count, sizeof (int));
74
   ctx->msgcount = 0;
75
+
76
+  idata->hcache = imap_headercache_open(idata);
77
+
78
   if (count && (imap_read_headers (idata, 0, count-1) < 0))
79
   {
80
     mutt_error _("Error opening mailbox");
81
@@ -693,6 +714,7 @@
82
 
83
   dprint (2, (debugfile, "imap_open_mailbox: msgcount is %d\n", ctx->msgcount));
84
   FREE (&mx.mbox);
85
+
86
   return 0;
87
 
88
  fail:
89
@@ -914,6 +936,7 @@
90
   int n;
91
   int err_continue = M_NO;	/* continue on error? */
92
   int rc;
93
+  IMAP_HEADER h;
94
 
95
   idata = (IMAP_DATA*) ctx->data;
96
 
97
@@ -953,8 +976,20 @@
98
       /* mark these messages as unchanged so second pass ignores them. Done
99
        * here so BOGUS UW-IMAP 4.7 SILENT FLAGS updates are ignored. */
100
       for (n = 0; n < ctx->msgcount; n++)
101
-	if (ctx->hdrs[n]->deleted && ctx->hdrs[n]->changed)
102
-	  ctx->hdrs[n]->active = 0;
103
+      {
104
+	if (ctx->hdrs[n]->deleted)
105
+        {
106
+          if (idata->hcache)
107
+          {
108
+            h.data = HEADER_DATA(ctx->hdrs[n]);
109
+            imap_headercache_delete(idata->hcache, &h);
110
+          }
111
+
112
+          if (ctx->hdrs[n]->changed)
113
+            ctx->hdrs[n]->active = 0;
114
+        }
115
+      }
116
+
117
       if (imap_exec (idata, cmd.data, 0) != 0)
118
       {
119
 	mutt_error (_("Expunge failed"));
120
@@ -972,6 +1007,23 @@
121
     {
122
       ctx->hdrs[n]->changed = 0;
123
 
124
+      if (idata->hcache)
125
+      {
126
+        h.data = HEADER_DATA(ctx->hdrs[n]);
127
+
128
+        h.read     = ctx->hdrs[n]->read;
129
+        h.old      = ctx->hdrs[n]->old;
130
+        h.deleted  = ctx->hdrs[n]->deleted;
131
+        h.flagged  = ctx->hdrs[n]->flagged;
132
+        h.replied  = ctx->hdrs[n]->replied;
133
+        h.changed  = ctx->hdrs[n]->changed;
134
+        h.sid      = ctx->hdrs[n]->index + 1;
135
+        h.received = ctx->hdrs[n]->received;
136
+        h.content_length = ctx->hdrs[n]->content->length;
137
+        
138
+        imap_headercache_update(idata->hcache, &h);
139
+      }
140
+
141
       mutt_message (_("Saving message status flags... [%d/%d]"), n+1,
142
         ctx->msgcount);
143
 
144
@@ -1099,6 +1151,11 @@
145
 
146
     idata->reopen &= IMAP_REOPEN_ALLOW;
147
     idata->state = IMAP_AUTHENTICATED;
148
+    if (idata->hcache)
149
+    {
150
+      imap_headercache_close(idata->hcache);
151
+      idata->hcache = NULL;
152
+    }
153
     FREE (&(idata->mailbox));
154
     mutt_free_list (&idata->flags);
155
     idata->ctx = NULL;
156
diff -ru old/imap/imap_private.h work/mutt-1.5.5.1/imap/imap_private.h
157
--- old/imap/imap_private.h	Wed Nov  5 10:41:36 2003
158
+++ imap/imap_private.h	Fri Nov 28 18:30:37 2003
159
@@ -21,6 +21,7 @@
160
 #define _IMAP_PRIVATE_H 1
161
 
162
 #include "imap.h"
163
+#include "imap_headercache.h"
164
 #include "mutt_socket.h"
165
 
166
 /* -- symbols -- */
167
@@ -148,7 +149,7 @@
168
   int state;
169
 } IMAP_COMMAND;
170
 
171
-typedef struct
172
+typedef struct IMAP_DATA
173
 {
174
   /* This data is specific to a CONNECTION to an IMAP server */
175
   CONNECTION *conn;
176
@@ -175,6 +176,7 @@
177
   char *mailbox;
178
   unsigned short check_status;
179
   unsigned char reopen;
180
+  unsigned int uidvalidity;
181
   unsigned char rights[(RIGHTSMAX + 7)/8];
182
   unsigned int newMailCount;
183
   IMAP_CACHE cache[IMAP_CACHE_LEN];
184
@@ -182,6 +184,7 @@
185
   
186
   /* all folder flags - system flags AND keywords */
187
   LIST *flags;
188
+  IMAP_HEADERCACHE *hcache;
189
 } IMAP_DATA;
190
 /* I wish that were called IMAP_CONTEXT :( */
191
 
192
diff -ru old/imap/message.c work/mutt-1.5.5.1/imap/message.c
193
--- old/imap/message.c	Wed Nov  5 10:41:36 2003
194
+++ imap/message.c	Fri Nov 28 18:30:38 2003
195
@@ -25,6 +25,7 @@
196
 #include "mutt.h"
197
 #include "mutt_curses.h"
198
 #include "imap_private.h"
199
+#include "imap_headercache.h"
200
 #include "message.h"
201
 #include "mx.h"
202
 
203
@@ -54,9 +55,14 @@
204
   int msgno;
205
   IMAP_HEADER h;
206
   int rc, mfhrc, oldmsgcount;
207
+  IMAP_HEADERCACHE *hc = NULL;
208
+  int msgbegin_hc;
209
   int fetchlast = 0;
210
+
211
   const char *want_headers = "DATE FROM SUBJECT TO CC MESSAGE-ID REFERENCES CONTENT-TYPE IN-REPLY-TO REPLY-TO LINES X-LABEL";
212
 
213
+  msgno = msgbegin;
214
+
215
   ctx = idata->ctx;
216
 
217
   if (mutt_bit_isset (idata->capabilities,IMAP4REV1))
218
@@ -87,36 +93,150 @@
219
   }
220
   unlink (tempfile);
221
 
222
+  oldmsgcount = ctx->msgcount;
223
+
224
+  msgbegin_hc = msgbegin;
225
+
226
+  hc = idata->hcache;
227
+
228
+restart:
229
   /* make sure context has room to hold the mailbox */
230
   while ((msgend) >= idata->ctx->hdrmax)
231
     mx_alloc_memory (idata->ctx);
232
 
233
-  oldmsgcount = ctx->msgcount;
234
   idata->reopen &= ~IMAP_NEWMAIL_PENDING;
235
   idata->newMailCount = 0;
236
 
237
+  if (hc)
238
+  {
239
+    snprintf(buf, sizeof(buf), "FETCH %d:%d (UID)", msgbegin_hc + 1, 
240
+             msgend + 1);
241
+    imap_cmd_start(idata, buf);
242
+
243
+    for (msgno = msgbegin_hc; msgno <= msgend; msgno++)
244
+    {
245
+      if (ReadInc && (!msgno || ((msgno+1) % ReadInc == 0)))
246
+        mutt_message (_("Fetching message UIDs... [%d/%d]"), msgno + 1,
247
+                      msgend + 1);
248
+
249
+      /* XXX */
250
+      ctx->hdrs[msgno] = NULL;
251
+
252
+      /* XXX leaking h.data on successful exit */
253
+      memset (&h, 0, sizeof (h));
254
+      h.data = safe_calloc (1, sizeof (IMAP_HEADER_DATA));
255
+
256
+      do
257
+      {
258
+        FILE *cache_fp;
259
+
260
+        mfhrc = 0;
261
+
262
+        rc = imap_cmd_step (idata);
263
+        if (rc != IMAP_CMD_CONTINUE)
264
+          break;
265
+
266
+        if ((mfhrc = msg_fetch_header (idata->ctx, &h, idata->cmd.buf, NULL)) == -1)
267
+          continue;
268
+        else if (mfhrc < 0)
269
+          break;
270
+
271
+        cache_fp = imap_headercache_find(hc, &h);
272
+        if (cache_fp)
273
+        {
274
+          /* update context with message header */
275
+          ctx->hdrs[msgno] = mutt_new_header ();
276
+
277
+          ctx->hdrs[msgno]->index = h.sid - 1;
278
+
279
+          /* messages which have not been expunged are ACTIVE (borrowed from mh 
280
+           * folders) */
281
+          ctx->hdrs[msgno]->active = 1;
282
+          ctx->hdrs[msgno]->read = h.read;
283
+          ctx->hdrs[msgno]->old = h.old;
284
+          ctx->hdrs[msgno]->deleted = h.deleted;
285
+          ctx->hdrs[msgno]->flagged = h.flagged;
286
+          ctx->hdrs[msgno]->replied = h.replied;
287
+          ctx->hdrs[msgno]->changed = h.changed;
288
+          ctx->hdrs[msgno]->received = h.received;
289
+          ctx->hdrs[msgno]->data = (void *) (h.data);
290
+
291
+          /* NOTE: if Date: header is missing, mutt_read_rfc822_header depends
292
+           *   on h.received being set */
293
+          ctx->hdrs[msgno]->env = mutt_read_rfc822_header (cache_fp, ctx->hdrs[msgno],
294
+            0, 0);
295
+          /* content built as a side-effect of mutt_read_rfc822_header */
296
+          ctx->hdrs[msgno]->content->length = h.content_length;
297
+
298
+          imap_headercache_done(hc, cache_fp);
299
+        }
300
+      }
301
+      while (mfhrc == -1);
302
+
303
+      /* in case we get new mail while fetching the headers */
304
+      if (idata->reopen & IMAP_NEWMAIL_PENDING)
305
+      {
306
+        msgbegin_hc = msgno + 1;
307
+        msgend = idata->newMailCount - 1;
308
+        goto restart;
309
+      }
310
+      /* XXX freshen... etc */
311
+    }
312
+  }
313
+
314
+  /* Remember where we left if we get new mail while fetching actual headers */
315
+  msgbegin_hc = msgno;
316
+
317
+  /* Now, either one of the following is true:
318
+   * 1. We don't have a headercache (hc == 0)
319
+   * 2. All messages found in the cache have ctx->hdrs[msgno] != NULL, and
320
+   * filled up.
321
+   */
322
+
323
+  /*
324
+   * Make one request for everything. This makes fetching headers an
325
+   * order of magnitude faster if you have a large mailbox.
326
+   *
327
+   * If we get more messages while doing this, we make another
328
+   * request for all the new messages.
329
+   */
330
+  if (!hc)
331
+  {
332
+    snprintf (buf, sizeof (buf),
333
+      "FETCH %d:%d (UID FLAGS INTERNALDATE RFC822.SIZE %s)", msgbegin + 1,
334
+      msgend + 1, hdrreq);
335
+
336
+    imap_cmd_start (idata, buf);
337
+  }
338
+
339
   for (msgno = msgbegin; msgno <= msgend ; msgno++)
340
   {
341
     if (ReadInc && (!msgno || ((msgno+1) % ReadInc == 0)))
342
       mutt_message (_("Fetching message headers... [%d/%d]"), msgno + 1,
343
         msgend + 1);
344
 
345
-    if (msgno + 1 > fetchlast)
346
+    /* If the message is in the cache, skip it */
347
+    if (hc)
348
     {
349
-      /*
350
-       * Make one request for everything. This makes fetching headers an
351
-       * order of magnitude faster if you have a large mailbox.
352
-       *
353
-       * If we get more messages while doing this, we make another
354
-       * request for all the new messages.
355
-       */
356
-      snprintf (buf, sizeof (buf),
357
-        "FETCH %d:%d (UID FLAGS INTERNALDATE RFC822.SIZE %s)", msgno + 1,
358
-        msgend + 1, hdrreq);
359
-
360
-      imap_cmd_start (idata, buf);
361
+      if (ctx->hdrs[msgno])
362
+      {
363
+        ctx->msgcount++;
364
+        continue;
365
+      }
366
+      else if (msgno >= fetchlast)
367
+      {
368
+        /* Find the longest "run" of messages not in the cache and fetch it in
369
+         * one go
370
+         */
371
+        for (fetchlast = msgno + 1; 
372
+             fetchlast <= msgend && !ctx->hdrs[fetchlast]; fetchlast++);
373
+
374
+        snprintf (buf, sizeof (buf),
375
+          "FETCH %d:%d (UID FLAGS INTERNALDATE RFC822.SIZE %s)", msgno + 1,
376
+          fetchlast, hdrreq);
377
 
378
-      fetchlast = msgend + 1;
379
+        imap_cmd_start (idata, buf);
380
+      }
381
     }
382
 
383
     /* freshen fp, h */
384
@@ -130,6 +250,8 @@
385
      */
386
     do
387
     {
388
+      size_t hdrsz;
389
+
390
       mfhrc = 0;
391
 
392
       rc = imap_cmd_step (idata);
393
@@ -144,12 +266,16 @@
394
       /* make sure we don't get remnants from older larger message headers */
395
       fputs ("\n\n", fp);
396
 
397
+      hdrsz = (size_t)ftell(fp);
398
+
399
       /* update context with message header */
400
       ctx->hdrs[msgno] = mutt_new_header ();
401
 
402
       ctx->hdrs[msgno]->index = h.sid - 1;
403
+#if 0
404
       if (h.sid != ctx->msgcount + 1)
405
 	dprint (1, (debugfile, "imap_read_headers: msgcount and sequence ID are inconsistent!"));
406
+#endif
407
       /* messages which have not been expunged are ACTIVE (borrowed from mh 
408
        * folders) */
409
       ctx->hdrs[msgno]->active = 1;
410
@@ -163,6 +289,13 @@
411
       ctx->hdrs[msgno]->data = (void *) (h.data);
412
 
413
       rewind (fp);
414
+
415
+      if (hc)
416
+      {
417
+        imap_headercache_add(hc, &h, fp, hdrsz);
418
+        rewind(fp);
419
+      }
420
+
421
       /* NOTE: if Date: header is missing, mutt_read_rfc822_header depends
422
        *   on h.received being set */
423
       ctx->hdrs[msgno]->env = mutt_read_rfc822_header (fp, ctx->hdrs[msgno],
424
@@ -172,8 +305,7 @@
425
 
426
       ctx->msgcount++;
427
     }
428
-    while ((rc != IMAP_CMD_OK) && ((mfhrc == -1) ||
429
-      ((msgno + 1) >= fetchlast)));
430
+    while (mfhrc == -1);
431
 
432
     if ((mfhrc < -1) || ((rc != IMAP_CMD_CONTINUE) && (rc != IMAP_CMD_OK)))
433
     {
434
@@ -186,11 +318,9 @@
435
     /* in case we get new mail while fetching the headers */
436
     if (idata->reopen & IMAP_NEWMAIL_PENDING)
437
     {
438
+      msgbegin = msgno + 1;
439
       msgend = idata->newMailCount - 1;
440
-      while ((msgend) >= ctx->hdrmax)
441
-	mx_alloc_memory (ctx);
442
-      idata->reopen &= ~IMAP_NEWMAIL_PENDING;
443
-      idata->newMailCount = 0;
444
+      goto restart;
445
     }
446
   }
447
 
448
@@ -735,6 +865,7 @@
449
   IMAP_DATA* idata;
450
   long bytes;
451
   int rc = -1; /* default now is that string isn't FETCH response*/
452
+  int fetch_rc;
453
 
454
   idata = (IMAP_DATA*) ctx->data;
455
 
456
@@ -757,9 +888,15 @@
457
 
458
   /* FIXME: current implementation - call msg_parse_fetch - if it returns -2,
459
    *   read header lines and call it again. Silly. */
460
-  if (msg_parse_fetch (h, buf) != -2)
461
+  fetch_rc = msg_parse_fetch(h, buf);
462
+  if (fetch_rc == 0)
463
+    return 0;
464
+  else if (fetch_rc != -2)
465
     return rc;
466
-  
467
+
468
+  if (!fp)
469
+    return -2;
470
+
471
   if (imap_get_literal_count (buf, &bytes) < 0)
472
     return rc;
473
   imap_read_literal (fp, idata, bytes);
474
diff -ru old/init.h work/mutt-1.5.5.1/init.h
475
--- old/init.h	Wed Nov  5 10:41:32 2003
476
+++ init.h	Fri Nov 28 18:30:37 2003
477
@@ -856,6 +856,11 @@
478
   ** .pp
479
   ** This variable defaults to your user name on the local machine.
480
   */
481
+  { "imap_headercache", DT_STR, R_NONE, UL &ImapHeadercache, UL 0 },
482
+  /*
483
+  ** .pp
484
+  ** The location of the IMAP headercache directory.
485
+  */
486
 #endif
487
   { "implicit_autoview", DT_BOOL,R_NONE, OPTIMPLICITAUTOVIEW, 0},
488
   /*
489
diff -ruN old/imap/imap_headercache.c work/mutt-1.5.5.1/imap/imap_headercache.c
490
--- old/imap/imap_headercache.c	Thu Jan  1 01:00:00 1970
491
+++ imap/imap_headercache.c	Fri Nov 28 18:30:55 2003
492
@@ -0,0 +1,330 @@
493
+/*
494
+ * Copyright (C) 2002 Tudor Bosman <tudorb-mutt@dwyn.net>
495
+ * 
496
+ *     This program is free software; you can redistribute it and/or modify
497
+ *     it under the terms of the GNU General Public License as published by
498
+ *     the Free Software Foundation; either version 2 of the License, or
499
+ *     (at your option) any later version.
500
+ * 
501
+ *     This program is distributed in the hope that it will be useful,
502
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
503
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
504
+ *     GNU General Public License for more details.
505
+ * 
506
+ *     You should have received a copy of the GNU General Public License
507
+ *     along with this program; if not, write to the Free Software
508
+ *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
509
+ */ 
510
+
511
+#include "mutt.h"
512
+#include "imap.h"
513
+#include "imap_private.h"
514
+#include "imap_headercache.h"
515
+#include "mx.h"
516
+#include <stdio.h>
517
+#include <sys/types.h>
518
+#include <sys/stat.h>
519
+#include <fcntl.h>
520
+#include <errno.h>
521
+#include <unistd.h>
522
+#include <dirent.h>
523
+#include <assert.h>
524
+
525
+/* Delete all messages from headercache */
526
+static int imap_headercache_purge(IMAP_HEADERCACHE *hc)
527
+{
528
+  int rc = -1;
529
+  DIR *dir;
530
+  struct dirent *ent;
531
+
532
+  dir = opendir(hc->name);
533
+  if (!dir)
534
+  {
535
+    mutt_error(_("IMAP headercache: can't purge directory %s: %s"), hc->name,
536
+               strerror(errno));
537
+    mutt_sleep(2);
538
+    return -1;
539
+  }
540
+
541
+  while ((ent = readdir(dir)) != NULL)
542
+  {
543
+    if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
544
+      continue;
545
+
546
+    sprintf(hc->tmpname, "%s/%s", hc->name, ent->d_name);
547
+    if (unlink(hc->tmpname) == -1)
548
+    {
549
+      mutt_error(_("IMAP headercache: can't unlink file %s: %s"), hc->tmpname,
550
+                 strerror(errno));
551
+      mutt_sleep(2);
552
+      goto bail;
553
+    }
554
+  }
555
+  
556
+  rc = 0;
557
+
558
+bail:
559
+  closedir(dir);
560
+
561
+  return rc;
562
+}
563
+
564
+/* Open headercache */
565
+IMAP_HEADERCACHE *imap_headercache_open(IMAP_DATA *idata)
566
+{
567
+  IMAP_HEADERCACHE *hc;
568
+  char hcdir[_POSIX_PATH_MAX + 1];
569
+  FILE *f;
570
+  size_t len;
571
+  char *p;
572
+
573
+  if (!ImapHeadercache || ImapHeadercache[0] == '\0')
574
+    return NULL;
575
+
576
+  strfcpy(hcdir, ImapHeadercache, _POSIX_PATH_MAX);
577
+  mutt_expand_path(hcdir, _POSIX_PATH_MAX);
578
+
579
+  hc = safe_malloc(sizeof(IMAP_HEADERCACHE));
580
+
581
+  len = strlen(hcdir) + strlen(idata->conn->account.host) +
582
+        strlen(idata->mailbox) + 5;
583
+
584
+  hc->name = safe_malloc(len);
585
+  hc->tmpname = safe_malloc(len + NAME_MAX + 2);
586
+
587
+  sprintf(hc->name, "%s/%s", hcdir, idata->conn->account.host);
588
+  
589
+  if (mkdir(hcdir, 0777) == -1 && errno != EEXIST)
590
+  {
591
+    mutt_error(_("Can't create IMAP headercache root directory %s: %s"), 
592
+                 hcdir, strerror(errno));
593
+    mutt_sleep(2);
594
+    goto bail;
595
+  }
596
+
597
+  if (mkdir(hc->name, 0700) == -1 && errno != EEXIST)
598
+  {
599
+    mutt_error(_("Can't create IMAP headercache server directory %s: %s"),
600
+                 hc->name, strerror(errno));
601
+    mutt_sleep(2);
602
+    goto bail;
603
+  }
604
+
605
+  p = idata->mailbox;
606
+  while ((p = strchr(p, '/')) != NULL)
607
+  {
608
+    *p = '\0';
609
+    sprintf(hc->name, "%s/%s/%s", hcdir, 
610
+            idata->conn->account.host, idata->mailbox);
611
+
612
+    if (mkdir(hc->name, 0700) == -1 && errno != EEXIST)
613
+    {
614
+      mutt_error(_("Can't create IMAP headercache mailbox directory %s: %s"),
615
+                   hc->name, strerror(errno));
616
+      mutt_sleep(2);
617
+      goto bail;
618
+    }
619
+
620
+    *p = '/';
621
+    p++;
622
+  }
623
+
624
+  sprintf(hc->name, "%s/%s/%s", hcdir, 
625
+          idata->conn->account.host, idata->mailbox);
626
+
627
+  if (mkdir(hc->name, 0700) == -1 && errno != EEXIST)
628
+  {
629
+    mutt_error(_("Can't create IMAP headercache mailbox directory %s: %s"),
630
+                 hc->name, strerror(errno));
631
+    mutt_sleep(2);
632
+    goto bail;
633
+  }
634
+  
635
+  sprintf(hc->tmpname, "%s/uidvalidity", hc->name);
636
+  f = fopen(hc->tmpname, "r");
637
+
638
+  if (f)
639
+  {
640
+    fscanf(f, "%u", &hc->uidvalidity);
641
+    if (idata->uidvalidity != hc->uidvalidity)
642
+    {
643
+      fclose(f);
644
+      f = NULL;
645
+    }
646
+  }
647
+
648
+  if (!f)
649
+  {
650
+    if (imap_headercache_purge(hc) == -1)
651
+      goto bail;
652
+
653
+    sprintf(hc->tmpname, "%s/uidvalidity", hc->name);
654
+    f = fopen(hc->tmpname, "w");
655
+    if (!f)
656
+    {
657
+      mutt_error(_("Can't create IMAP headercache uidvalidity file %s: %s"),
658
+                   hc->tmpname, strerror(errno));
659
+      mutt_sleep(2);
660
+      goto bail;
661
+    }
662
+
663
+    hc->uidvalidity = idata->uidvalidity;
664
+
665
+    fprintf(f, "%u\n", hc->uidvalidity);
666
+    fclose(f);
667
+  }
668
+
669
+  return hc;
670
+
671
+bail:
672
+  safe_free((void **)&hc->tmpname);
673
+  safe_free((void **)&hc->name);
674
+  safe_free((void **)&hc);
675
+
676
+  return NULL;
677
+}
678
+
679
+/* Close headercache */
680
+void imap_headercache_close(IMAP_HEADERCACHE *hc)
681
+{
682
+  safe_free((void **)&hc->tmpname);
683
+  safe_free((void **)&hc->name);
684
+  safe_free((void **)&hc);
685
+}
686
+
687
+static void imap_headercache_writehdr(FILE *f, IMAP_HEADER *h)
688
+{
689
+  /* Write the stuff in the header.  This must have a fixed length, as it is
690
+   * overwritten in case of imap_headercache_update
691
+   */
692
+  fprintf(f, "%1x %1x %1x %1x %1x %1x %8x %16lx %16lx %8x\n",
693
+          h->read, h->old, h->deleted, h->flagged, h->replied, h->changed,
694
+          h->sid, h->received, h->content_length, HEADER_DATA(h)->uid);
695
+}
696
+
697
+/* Add message to headercache */
698
+int imap_headercache_add(IMAP_HEADERCACHE *hc, IMAP_HEADER *h, FILE *from,
699
+                         size_t hdrsz)
700
+{
701
+  FILE *f;
702
+#define BUFSIZE 4096
703
+  char buf[BUFSIZE];
704
+  size_t sz;
705
+  int rc = -1;
706
+
707
+  sprintf(hc->tmpname, "%s/%u", hc->name, HEADER_DATA(h)->uid);
708
+
709
+  f = fopen(hc->tmpname, "w");
710
+  if (!f)
711
+  {
712
+    mutt_error(_("Can't create IMAP headercache message file %s: %s"),
713
+                 hc->tmpname, strerror(errno));
714
+    mutt_sleep(2);
715
+    goto bail;
716
+  }
717
+
718
+  imap_headercache_writehdr(f, h);
719
+
720
+  while ((sz = fread(buf, 1, (hdrsz < BUFSIZE ? hdrsz : BUFSIZE), from)) != 0)
721
+  {
722
+    hdrsz -= sz;
723
+    fwrite(buf, 1, sz, f);
724
+  }
725
+
726
+  fclose(f);
727
+
728
+  rc = 0;
729
+
730
+bail:
731
+  return rc;
732
+}
733
+
734
+/* Update flags in headercache message */
735
+int imap_headercache_update(IMAP_HEADERCACHE *hc, IMAP_HEADER *h)
736
+{
737
+  FILE *f;
738
+  int rc = -1;
739
+
740
+  sprintf(hc->tmpname, "%s/%u", hc->name, HEADER_DATA(h)->uid);
741
+
742
+  f = fopen(hc->tmpname, "r+");
743
+  if (!f)
744
+    goto bail;
745
+
746
+  imap_headercache_writehdr(f, h);
747
+
748
+  fclose(f);
749
+
750
+  rc = 0;
751
+
752
+bail:
753
+  return rc;
754
+}
755
+
756
+/* Delete message from headercache */
757
+int imap_headercache_delete(IMAP_HEADERCACHE *hc, IMAP_HEADER *h)
758
+{
759
+  int rc = -1;
760
+
761
+  sprintf(hc->tmpname, "%s/%u", hc->name, HEADER_DATA(h)->uid);
762
+
763
+  if (unlink(hc->tmpname) == -1)
764
+  {
765
+    mutt_error(_("Can't delete IMAP headercache message %s: %s"),
766
+               hc->tmpname, strerror(errno));
767
+    mutt_sleep(2);
768
+    goto bail;
769
+  }
770
+
771
+  rc = 0;
772
+  
773
+bail:
774
+  return rc;
775
+}
776
+
777
+/* Find message in headercache */
778
+FILE *imap_headercache_find(IMAP_HEADERCACHE *hc, IMAP_HEADER *h)
779
+{
780
+  FILE *f = NULL;
781
+  unsigned int flag_read, flag_old, flag_deleted, flag_flagged, flag_replied;
782
+  unsigned int flag_changed;
783
+  unsigned int uid;
784
+  unsigned long received;
785
+  unsigned long content_length;
786
+
787
+  sprintf(hc->tmpname, "%s/%u", hc->name, HEADER_DATA(h)->uid);
788
+
789
+  f = fopen(hc->tmpname, "r");
790
+  if (!f)
791
+    goto bail;
792
+
793
+  fscanf(f, "%x %x %x %x %x %x %x %lx %lx %x\n",
794
+         &flag_read, &flag_old, &flag_deleted, &flag_flagged, &flag_replied,
795
+         &flag_changed, &h->sid, &received, &content_length, &uid);
796
+
797
+  if (uid != HEADER_DATA(h)->uid)
798
+  {
799
+    fclose(f);
800
+    f = NULL;
801
+    goto bail;
802
+  }
803
+
804
+  h->received = received;
805
+  h->read = flag_read;
806
+  h->old = flag_old;
807
+  h->deleted = flag_deleted;
808
+  h->flagged = flag_flagged;
809
+  h->replied = flag_replied;
810
+  h->changed = flag_changed;
811
+  h->content_length = (long)content_length;
812
+
813
+bail:
814
+  return f;
815
+}
816
+
817
+/* Close file returned by imap_headercache_find */
818
+void imap_headercache_done(IMAP_HEADERCACHE *hc, FILE *f)
819
+{
820
+  fclose(f);
821
+}
822
+
823
diff -ruN old/imap/imap_headercache.h work/mutt-1.5.5.1/imap/imap_headercache.h
824
--- old/imap/imap_headercache.h	Thu Jan  1 01:00:00 1970
825
+++ imap/imap_headercache.h	Fri Nov 28 18:30:55 2003
826
@@ -0,0 +1,47 @@
827
+/*
828
+ * Copyright (C) 2002 Tudor Bosman <tudorb-mutt@dwyn.net>
829
+ * 
830
+ *     This program is free software; you can redistribute it and/or modify
831
+ *     it under the terms of the GNU General Public License as published by
832
+ *     the Free Software Foundation; either version 2 of the License, or
833
+ *     (at your option) any later version.
834
+ * 
835
+ *     This program is distributed in the hope that it will be useful,
836
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
837
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
838
+ *     GNU General Public License for more details.
839
+ * 
840
+ *     You should have received a copy of the GNU General Public License
841
+ *     along with this program; if not, write to the Free Software
842
+ *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
843
+ */ 
844
+
845
+#ifndef _IMAP_HEADERCACHE_H
846
+#define _IMAP_HEADERCACHE_H
847
+#include "imap_private.h"
848
+#include "message.h"
849
+
850
+typedef struct IMAP_HEADERCACHE
851
+{
852
+  char *name;
853
+  char *tmpname;
854
+  unsigned int uidvalidity;
855
+  int exists;
856
+} IMAP_HEADERCACHE;
857
+
858
+struct IMAP_DATA;
859
+
860
+IMAP_HEADERCACHE *imap_headercache_open(struct IMAP_DATA *idata);
861
+
862
+void imap_headercache_close(IMAP_HEADERCACHE *hc);
863
+
864
+int imap_headercache_add(IMAP_HEADERCACHE *hc, IMAP_HEADER *h, FILE *from,
865
+                         size_t hdrsz);
866
+int imap_headercache_update(IMAP_HEADERCACHE *hc, IMAP_HEADER *h);
867
+int imap_headercache_delete(IMAP_HEADERCACHE *hc, IMAP_HEADER *h);
868
+
869
+FILE *imap_headercache_find(IMAP_HEADERCACHE *hc, IMAP_HEADER *h);
870
+void imap_headercache_done(IMAP_HEADERCACHE *hc, FILE *f);
871
+
872
+#endif
873
+
(-)./files/extra-patch-pgp-dw (-741 / +194 lines)
Lines 1-767 Link Here
1
http://www.woolridge.ca/mutt/patches/p0-patch-1.5.x.dw.pgp-menu-traditional.2
1
http://www.woolridge.ca/mutt/patches/p0-patch-1.5.x.dw.pgp-menu-traditional.2
2
--- PATCHES Dec 2002 17:44:54 -0000	3.6
2
--- PATCHES.old	Tue Apr 15 15:18:34 2003
3
+++ PATCHES Oct 2003 15:05:24 -0000
3
+++ PATCHES	Fri Dec 19 15:00:56 2003
4
@@ -0,0 +1 @@
4
@@ -0,0 +1,3 @@
5
+patch-1.5.x.dw.pgp-menu-traditional.2
5
+patch-1.5.5.dw.multiple-crypt-hook.2
6
--- compose.c.orig	Thu Nov  6 08:28:10 2003
6
+patch-1.5.5.dw.crypt-autoselectkey.1
7
+++ compose.c	Thu Nov  6 08:32:17 2003
7
+patch-1.5.5.dw.confirm-crypt-hook.1
8
@@ -131,6 +131,13 @@
8
--- doc/manual.sgml.head.old	Wed Nov  5 10:41:34 2003
9
     addstr (_("Sign"));
9
+++ doc/manual.sgml.head	Fri Dec 19 15:00:56 2003
10
   else
10
@@ -1421,7 +1421,9 @@
11
     addstr (_("Clear"));
11
 or because, for some reasons, you need to override the key Mutt would
12
+
12
 normally use.  The crypt-hook command provides a method by which you can
13
+  if ((WithCrypto & APPLICATION_PGP))
13
 specify the ID of the public key to be used when encrypting messages to
14
+    if ((msg->security & (ENCRYPT | SIGN)))
14
-a certain recipient.
15
+      if ((msg->security & INLINE))
15
+a certain recipient.  You may use multiple pgp-hook's with the same
16
+	addstr (_(" (inline)"));
16
+pattern; multiple matching pgp-hook's result in the use of multiple
17
+      else
17
+keyids for recipient.
18
+	addstr (_(" (PGP/MIME)"));
18
 
19
   clrtoeol ();
19
 The meaning of "key id" is to be taken broadly in this context:  You
20
 
20
 can either put a numerical key ID here, an e-mail address, or even
21
   move (HDR_CRYPTINFO, 0);
21
--- doc/muttrc.man.head.orig	Fri Dec 19 15:14:55 2003
22
@@ -156,21 +163,25 @@
22
+++ doc/muttrc.man.head	Fri Dec 19 15:19:05 2003
23
@@ -290 +290,4 @@
24
-or even just an arbitrary search string.
25
+or even just an arbitrary search string.  You may use multiple
26
+\fBpgp-hook\fPs with the same \fIpattern\fP; multiple matching
27
+\fBpgp-hook\fPs result in the use of multiple \fIkey-id\fPs for
28
+recipient.
29
--- hook.c	Tue Jan 21 13:25:21 2003
30
+++ hook.c	Fri Dec 19 15:00:56 2003
31
@@ -117,7 +117,11 @@
32
 	ptr->rx.not == not &&
33
 	!mutt_strcmp (pattern.data, ptr->rx.pattern))
34
     {
35
+#ifdef M_CRYPTHOOK
36
+      if (data & (M_FOLDERHOOK | M_SENDHOOK | M_MESSAGEHOOK | M_ACCOUNTHOOK | M_REPLYHOOK | M_CRYPTHOOK))
37
+#else
38
       if (data & (M_FOLDERHOOK | M_SENDHOOK | M_MESSAGEHOOK | M_ACCOUNTHOOK | M_REPLYHOOK))
39
+#endif
40
       {
41
 	/* these hooks allow multiple commands with the same
42
 	 * pattern, so if we've already seen this pattern/command pair, just
43
@@ -443,9 +447,25 @@
44
   return _mutt_string_hook (chs, M_ICONVHOOK);
45
 }
23
 
46
 
24
 static int pgp_send_menu (HEADER *msg, int *redraw)
47
-char *mutt_crypt_hook (ADDRESS *adr)
48
+LIST *mutt_crypt_hook (ADDRESS *adr)
25
 {
49
 {
26
+  int use_autoinline = 0;
50
-  return _mutt_string_hook (adr->mailbox, M_CRYPTHOOK);
27
   pgp_key_t p;
51
+  HOOK *hook;
28
   char input_signas[SHORT_STRING];
52
+  LIST *key_list = NULL;
29
 
30
   if (!(WithCrypto & APPLICATION_PGP))
31
     return msg->security;
32
 
33
-  switch (mutt_multi_choice (_("PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "),
34
-			     N_("esabf")))
35
+  if (! (msg->security & (SIGN | ENCRYPT)))
36
+    use_autoinline = 1;
37
+
53
+
38
+  switch (mutt_multi_choice (_("PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "),
54
+  if (!adr && !adr->mailbox)
39
+			     _("esabif")))
55
+    return (NULL);
40
   {
41
   case 1: /* (e)ncrypt */
42
-    msg->security |= ENCRYPT;
43
+    msg->security ^= ENCRYPT;
44
     break;
45
 
46
   case 2: /* (s)ign */
47
-    msg->security |= SIGN;
48
+    msg->security ^= SIGN;
49
     break;
50
 
51
   case 3: /* sign (a)s */
52
@@ -197,18 +208,38 @@
53
     break;
54
 
55
   case 4: /* (b)oth */
56
-    msg->security = ENCRYPT | SIGN;
57
+    if ((msg->security & (ENCRYPT | SIGN)) == (ENCRYPT | SIGN))
58
+      msg->security = 0;
59
+    else
60
+      msg->security |= (ENCRYPT | SIGN);
61
+    break;
62
+
56
+
63
+  case 5: /* (i)nline */
57
+  for (hook = Hooks; hook; hook = hook->next)
64
+    if ((msg->security & (ENCRYPT | SIGN)))
65
+      msg->security ^= INLINE;
66
+    else
67
+      msg->security &= ~INLINE;
68
     break;
69
 
70
-  case 5: /* (f)orget it */
71
+  case 6: /* (f)orget it */
72
     msg->security = 0;
73
     break;
74
   }
75
 
76
-  if (msg->security && msg->security != APPLICATION_PGP)
77
-    msg->security |= APPLICATION_PGP;
78
-  else
79
-    msg->security = 0;
80
+  if (msg->security)
81
+  {
58
+  {
82
+    if (! (msg->security & (ENCRYPT | SIGN)))
59
+    if (!hook->command)
83
+    {
60
+      continue;
84
+      msg->security = 0;
61
+    if (!(hook->type & M_CRYPTHOOK))
85
+    }
62
+      continue;
86
+    else
87
+    {
88
+      msg->security |= APPLICATION_PGP;
89
+
63
+
90
+      if (use_autoinline && option (OPTPGPAUTOINLINE))
64
+    if ((regexec (hook->rx.rx, adr->mailbox, 0, NULL, 0) == 0) ^ hook->rx.not)
91
+	msg->security |= INLINE;
65
+      key_list = mutt_add_list (key_list, hook->command);
92
+    }
93
+  }
66
+  }
67
+  return (key_list);
68
 }
94
 
69
 
95
   if(*redraw)
70
 #ifdef USE_SOCKET
96
       redraw_crypt_lines (msg);
71
--- init.h	Wed Nov  5 10:41:32 2003
97
--- crypt.c Sep 2003 13:03:25 -0000	3.19
72
+++ init.h	Fri Dec 19 15:00:46 2003
98
+++ crypt.c Oct 2003 15:05:24 -0000
73
@@ -1209,6 +1209,16 @@
99
@@ -161,3 +161,3 @@ int crypt_valid_passphrase(int flags)
74
   ** when you are at the end of a message and invoke the \fInext-page\fP
100
 
75
   ** function.
101
-int mutt_protect (HEADER *msg, HEADER *cur, char *keylist)
102
+int mutt_protect (HEADER *msg, char *keylist)
103
 {
104
@@ -166,3 +166,2 @@ int mutt_protect (HEADER *msg, HEADER *c
105
   BODY *tmp_pgp_pbody = NULL;
106
-  int traditional = 0;
107
   int flags = (WithCrypto & APPLICATION_PGP)? msg->security: 0;
108
@@ -176,29 +175,9 @@ int mutt_protect (HEADER *msg, HEADER *c
109
 
110
-  if ((WithCrypto & APPLICATION_PGP) && (msg->security & APPLICATION_PGP))
111
+  if ((WithCrypto & APPLICATION_PGP) && ((msg->security & PGPINLINE) == PGPINLINE))
112
   {
113
-    if ((msg->content->type == TYPETEXT) &&
114
-	!ascii_strcasecmp (msg->content->subtype, "plain"))
115
-    {
116
-      if (cur && cur->security && option (OPTPGPAUTOTRAD)
117
-	  && (option (OPTCRYPTREPLYENCRYPT)
118
-	      || option (OPTCRYPTREPLYSIGN)
119
-	      || option (OPTCRYPTREPLYSIGNENCRYPTED)))
120
-	{
121
-	  if(mutt_is_application_pgp(cur->content))
122
-	    traditional = 1;
123
-	}
124
-      else
125
-	{
126
-	  if ((i = query_quadoption (OPT_PGPTRADITIONAL, _("Create a traditional (inline) PGP message?"))) == -1)
127
-	    return -1;
128
-	  else if (i == M_YES)
129
-	    traditional = 1;
130
-	}
131
-    }
132
-    if (traditional)
133
+    /* they really want to send it inline... go for it */
134
+    if (!isendwin ()) mutt_endwin _("Invoking PGP...");
135
+    pbody = crypt_pgp_traditional_encryptsign (msg->content, flags, keylist);
136
+    if (pbody)
137
     {
138
-      if (!isendwin ()) mutt_endwin _("Invoking PGP...");
139
-      if (!(pbody = crypt_pgp_traditional_encryptsign (msg->content, flags, keylist)))
140
-	return -1;
141
-
142
       msg->content = pbody;
143
@@ -206,2 +185,8 @@ int mutt_protect (HEADER *msg, HEADER *c
144
     }
145
+
146
+    /* otherwise inline won't work...ask for revert */
147
+    if ((i = query_quadoption (OPT_PGPMIMEASK, _("Message can't be sent inline.  Revert to using PGP/MIME?"))) != M_YES)
148
+      return -1;
149
+
150
+    /* go ahead with PGP/MIME */
151
   }
152
@@ -391,2 +376,5 @@ int mutt_is_application_pgp (BODY *m)
153
   }
154
+  if (t)
155
+    t |= PGPINLINE;
156
+
157
   return t;
158
--- init.h Sep 2003 15:10:09 -0000	3.40
159
+++ init.h Oct 2003 15:05:25 -0000
160
@@ -1380,2 +1380,44 @@ struct option_t MuttVars[] = {
161
   */
76
   */
162
+  { "pgp_create_traditional",	DT_SYN, R_NONE, UL "pgp_autoinline", 0 },
77
+  
163
+  { "pgp_autoinline",		DT_BOOL, R_NONE, OPTPGPAUTOINLINE, 0 },
78
+
79
+  { "pgp_autoselectkey",	DT_SYN,  R_NONE, UL "crypt_autoselectkey", 0 },
80
+  { "crypt_autoselectkey",	DT_BOOL, R_NONE, OPTCRYPTAUTOSELECT, 0 },
164
+  /*
81
+  /*
165
+  ** .pp
82
+  ** .pp
166
+  ** This option controls whether Mutt generates old-style inline
83
+  ** If set, then a list of keys is not presented for selection when only
167
+  ** (traditional) PGP encrypted or signed messages under certain
84
+  ** one matching key is available.  This may be useful in conjunction with
168
+  ** circumstances.  This can be overridden by use of the \fIpgp-menu\fP,
85
+  ** the \fIcrypt-hook\fP command.
169
+  ** when inline is not required.
170
+  ** .pp
171
+  ** Note that Mutt might automatically use PGP/MIME for messages
172
+  ** which consist of more than a single MIME part.  Mutt can be
173
+  ** configured to ask before sending PGP/MIME messages when inline
174
+  ** (traditional) would not work.
175
+  ** See also: ``$$pgp_mime_ask''.
176
+  ** .pp
177
+  ** Also note that using the old-style PGP message format is \fBstrongly\fP
178
+  ** \fBdeprecated\fP.
179
+  ** (PGP only)
180
+  */
86
+  */
181
+  { "pgp_auto_traditional",	DT_SYN, R_NONE, UL "pgp_replyinline", 0 },
87
   { "pgp_autosign", 	DT_SYN,  R_NONE, UL "crypt_autosign", 0 },
182
+  { "pgp_replyinline",		DT_BOOL, R_NONE, OPTPGPREPLYINLINE, 0 },
88
   { "crypt_autosign",	DT_BOOL, R_NONE, OPTCRYPTAUTOSIGN, 0 },
89
   /*
90
@@ -1233,6 +1243,15 @@
91
   ** then OpenSSL is used instead to create S/MIME messages and
92
   ** settings can be overridden by use of the \fIsmime-menu\fP.
93
   ** (Crypto only)
94
+  */
95
+  { "pgp_confirmhook",		DT_SYN, R_NONE, UL "crypt_confirmhook", 1 },
96
+  { "crypt_confirmhook",	DT_BOOL, R_NONE, OPTCRYPTCONFIRMHOOK, 1 },
183
+  /*
97
+  /*
184
+  ** .pp
98
+  ** .pp
185
+  ** Setting this variable will cause Mutt to always attempt to
99
+  ** If set, then you will be prompted for confirmation of keys when using
186
+  ** create an inline (traditional) message when replying to a
100
+  ** the \fIcrypt-hook\fP command.  If unset, no such confirmation prompt will
187
+  ** message which is PGP encrypted/signed inline.  This can be
101
+  ** be presented.  This is generally considered unsafe, especially where
188
+  ** overridden by use of the \fIpgp-menu\fP, when inline is not
102
+  ** typos are concerned.
189
+  ** required.  This option does not automatically detect if the
190
+  ** (replied-to) message is inline; instead it relies on Mutt
191
+  ** internals for previously checked/flagged messages.
192
+  ** .pp
193
+  ** Note that Mutt might automatically use PGP/MIME for messages
194
+  ** which consist of more than a single MIME part.  Mutt can be
195
+  ** configured to ask before sending PGP/MIME messages when inline
196
+  ** (traditional) would not work.
197
+  ** See also: ``$$pgp_mime_ask''.
198
+  ** .pp
199
+  ** Also note that using the old-style PGP message format is \fBstrongly\fP
200
+  ** \fBdeprecated\fP.
201
+  ** (PGP only)
202
+  ** 
203
+  */
204
   { "pgp_show_unusable", DT_BOOL, R_NONE, OPTPGPSHOWUNUSABLE, 1 },
205
@@ -1429,11 +1471,8 @@ struct option_t MuttVars[] = {
206
   */
103
   */
207
-  { "pgp_create_traditional", DT_QUAD, R_NONE, OPT_PGPTRADITIONAL, M_NO },
104
   { "pgp_ignore_subkeys", DT_BOOL, R_NONE, OPTPGPIGNORESUB, 1},
208
+  { "pgp_mime_ask", DT_QUAD, R_NONE, OPT_PGPMIMEASK, M_NO },
209
   /*
105
   /*
210
   ** .pp
106
--- mutt.h	Wed Nov  5 10:41:32 2003
211
-  ** This option controls whether Mutt generates old-style inline PGP
107
+++ mutt.h	Fri Dec 19 15:00:46 2003
212
-  ** encrypted or signed messages.
108
@@ -427,6 +427,7 @@
213
-  ** .pp
109
 
214
-  ** Note that PGP/MIME will be used automatically for messages which have
110
   /* PGP options */
215
-  ** a character set different from us-ascii, or which consist of more than
111
   
216
-  ** a single MIME part.
112
+  OPTCRYPTAUTOSELECT,
217
+  ** This option controls whether Mutt will prompt you for
113
   OPTCRYPTAUTOSIGN,
218
+  ** automatically sending a (signed/encrypted) message using
114
   OPTCRYPTAUTOENCRYPT,
219
+  ** PGP/MIME when inline (traditional) fails (for any reason).
115
   OPTCRYPTAUTOPGP,
220
   ** .pp
116
@@ -438,6 +439,7 @@
221
@@ -1441,19 +1480,2 @@ struct option_t MuttVars[] = {
117
   OPTSMIMEISDEFAULT,
222
   ** \fBdeprecated\fP.
118
   OPTASKCERTLABEL,
223
-  ** (PGP only)
119
   OPTSDEFAULTDECRYPTKEY,
224
-  */
120
+  OPTCRYPTCONFIRMHOOK,
225
-  { "pgp_auto_traditional", DT_BOOL, R_NONE, OPTPGPAUTOTRAD, 0 },
121
   OPTPGPIGNORESUB,
226
-  /*
122
   OPTPGPCHECKEXIT,
227
-  ** .pp
228
-  ** This option causes Mutt to generate an old-style inline PGP
229
-  ** encrypted or signed message when replying to an old-style
230
-  ** message, and a PGP/MIME message when replying to a PGP/MIME
231
-  ** message.  Note that this option is only meaningful when using
232
-  ** ``$$crypt_replyencrypt'', ``$$crypt_replysign'', or
233
-  ** ``$$crypt_replysignencrypted''.
234
-  ** .pp
235
-  ** Also note that PGP/MIME will be used automatically for messages
236
-  ** which have a character set different from us-ascii, or which
237
-  ** consist of more than a single MIME part.
238
-  ** .pp
239
-  ** This option overrides ``$$pgp_create_traditional''
240
   ** (PGP only)
241
--- mutt.h Oct 2003 20:34:59 -0000	3.21
242
+++ mutt.h Oct 2003 15:05:25 -0000
243
@@ -276,2 +276,3 @@ enum
244
   OPT_MOVE,
245
+  OPT_PGPMIMEASK,     /* ask to revert to PGP/MIME when inline fails */
246
   OPT_PGPTRADITIONAL, /* create old-style PGP messages */
247
@@ -443,3 +444,2 @@ enum
248
   OPTPGPLONGIDS,
123
   OPTPGPLONGIDS,
249
-  OPTPGPAUTOTRAD,
124
--- pgp.c	Wed Nov  5 10:41:33 2003
250
 #if 0
125
+++ pgp.c	Fri Dec 19 15:00:56 2003
251
@@ -451,2 +451,4 @@ enum
126
@@ -1016,6 +1016,8 @@
252
   OPTPGPSHOWUNUSABLE,
127
   char *keyID, *keylist = NULL, *t;
253
+  OPTPGPAUTOINLINE,
128
   size_t keylist_size = 0;
254
+  OPTPGPREPLYINLINE,
129
   size_t keylist_used = 0;
255
 
130
+  LIST *hook_list = NULL;
256
@@ -632,4 +634,4 @@ typedef struct header
131
+  LIST *hook = NULL;
132
   ADDRESS *tmp = NULL, *addr = NULL;
133
   ADDRESS **last = &tmp;
134
   ADDRESS *p, *q;
135
@@ -1055,7 +1057,7 @@
136
     {
137
       int r;
138
       snprintf (buf, sizeof (buf), _("Use keyID = \"%s\" for %s?"), keyID, p->mailbox);
139
-      if ((r = mutt_yesorno (buf, M_YES)) == M_YES)
140
+      if (!option(OPTCRYPTCONFIRMHOOK) || (r = mutt_yesorno (buf, M_YES)) == M_YES)
141
       {
142
 	if (is_numerical_keyid (keyID))
143
 	{
144
--- pgpkey.c	Wed Nov  5 10:41:33 2003
145
+++ pgpkey.c	Fri Dec 19 15:00:46 2003
146
@@ -435,8 +435,13 @@
147
   return rv;
148
 }
149
 
150
+
151
+#define pgp_trusted_id(uid) (!option(OPTPGPCHECKTRUST) \
152
+			     || (pgp_id_is_valid((uid)) \
153
+				 && pgp_id_is_strong((uid))))
154
+
155
 static pgp_key_t pgp_select_key (pgp_key_t keys,
156
-                                 ADDRESS * p, const char *s)
157
+				  ADDRESS * p, const char *s)
257
 {
158
 {
258
-  unsigned int security : 7;  /* bit 0-4: flags, bit 5,6: application.
159
   int keymax;
259
-				 see: crypt.h pgplib.h, smime.h */
160
   pgp_uid_t **KeyTable;
260
+  unsigned int security : 9;  /* bit 0-6: flags, bit 7,8: application.
161
@@ -450,6 +455,7 @@
261
+				 see: mutt_crypt.h */
162
   pgp_uid_t *a;
262
 
163
   int (*f) (const void *, const void *);
263
--- mutt_crypt.h Jan 2003 23:54:30 -0000	3.4
164
 
264
+++ mutt_crypt.h Oct 2003 15:05:25 -0000
165
+  int keymatch = 0;		/* count matching keys */
265
@@ -35,7 +35,9 @@
166
   int unusable = 0;
266
 #define GOODSIGN   (1 << 2)
167
 
267
-#define BADSIGN    (1 << 3) /* FIXME: value also used below for PGPKEY */
168
   keymax = 0;
268
+#define BADSIGN    (1 << 3)
169
@@ -479,6 +485,7 @@
269
 #define SIGNOPAQUE (1 << 4)
170
       
270
+#define KEYBLOCK   (1 << 5) /* KEY too generic? */
171
       KeyTable[i++] = a;
271
+#define INLINE     (1 << 6)
172
     }
272
 
173
+    keymatch++;
273
-#define APPLICATION_PGP    (1 << 5) 
174
   }
274
-#define APPLICATION_SMIME  (1 << 6)
275
+#define APPLICATION_PGP    (1 << 7) 
276
+#define APPLICATION_SMIME  (1 << 8)
277
 
278
@@ -44,3 +46,4 @@
279
 #define PGPGOODSIGN (APPLICATION_PGP | GOODSIGN)
280
-#define PGPKEY      (APPLICATION_PGP | (1 << 3)) 
281
+#define PGPKEY      (APPLICATION_PGP | KEYBLOCK) 
282
+#define PGPINLINE   (APPLICATION_PGP | INLINE)
283
 
284
@@ -103,3 +106,3 @@ typedef struct pgp_keyinfo *pgp_key_t;
285
 
286
-int mutt_protect (HEADER *, HEADER *, char *);
287
+int mutt_protect (HEADER *, char *);
288
 
289
--- postpone.c Sep 2003 17:22:09 -0000	3.9
290
+++ postpone.c Oct 2003 15:05:25 -0000
291
@@ -486,2 +486,7 @@ int mutt_parse_crypt_hdr (char *p, int s
292
 
175
 
293
+      case 'i':
176
   if (!i && unusable)
294
+      case 'I':
177
@@ -487,6 +494,21 @@
295
+	pgp |= INLINE;
178
     mutt_sleep (1);
296
+	break;
179
     return NULL;
297
+
180
   }
298
       default:
181
+  else if (keymatch == 1 && option(OPTCRYPTAUTOSELECT))
299
--- send.c Sep 2003 12:56:49 -0000	3.26
182
+  {
300
+++ send.c Oct 2003 15:05:25 -0000
183
+    /*
301
@@ -1256,3 +1256,10 @@ ci_send_message (int flags,		/* send mod
184
+     * Only one matching key...see if there's an id with enough trust to auto-select
302
 	msg->security |= SIGN;
185
+     */
303
-    }      
186
+    kp = KeyTable[0]->parent;
304
+      if (WithCrypto & APPLICATION_PGP && (msg->security & (ENCRYPT | SIGN)))
187
+    for (a = kp->address; a; a = a->next)
188
+    {
189
+      if (pgp_trusted_id(a))
305
+      {
190
+      {
306
+	if (option (OPTPGPAUTOINLINE))
191
+	safe_free ((void **) &KeyTable);
307
+	  msg->security |= INLINE;
192
+	return (kp);
308
+	if (option (OPTPGPREPLYINLINE) && cur && (cur->security & INLINE))
309
+	  msg->security |= INLINE;
310
+      }
193
+      }
311
+    }
194
+    }
195
+  }
312
 
196
 
313
@@ -1494,3 +1501,3 @@ main_loop:
197
   switch (PgpSortKeys & SORT_MASK)
314
       if ((crypt_get_keys (msg, &pgpkeylist) == -1) ||
198
   {
315
-          mutt_protect (msg, cur, pgpkeylist) == -1)
199
@@ -597,9 +619,7 @@
316
+          mutt_protect (msg, pgpkeylist) == -1)
200
 	  break;
201
 	}
202
       
203
-      if (option (OPTPGPCHECKTRUST) &&
204
-	  (!pgp_id_is_valid (KeyTable[menu->current])
205
-	   || !pgp_id_is_strong (KeyTable[menu->current])))
206
+      if (!pgp_trusted_id(KeyTable[menu->current]))
317
       {
207
       {
318
@@ -1574,3 +1581,3 @@ main_loop:
208
 	char *s = "";
319
 
209
 	char buff[LONG_STRING];
320
-	  if (mutt_protect (msg, cur, pgpkeylist) == -1)
210
--- protos.h	Wed Nov  5 10:41:33 2003
321
+	  if (mutt_protect (msg, pgpkeylist) == -1)
211
+++ protos.h	Fri Dec 19 15:00:56 2003
322
 	  {
212
@@ -129,7 +129,7 @@
323
--- sendlib.c Sep 2003 13:03:26 -0000	3.24
213
 char *mutt_get_body_charset (char *, size_t, BODY *);
324
+++ sendlib.c Oct 2003 15:05:25 -0000
214
 const char *mutt_get_name (ADDRESS *);
325
@@ -2407,2 +2407,4 @@ int mutt_write_fcc (const char *path, HE
215
 char *mutt_get_parameter (const char *, PARAMETER *);
326
     }
216
-char *mutt_crypt_hook (ADDRESS *);
327
+    if (hdr->security & INLINE)
217
+LIST *mutt_crypt_hook (ADDRESS *);
328
+      fputc ('I', msg->fp);
218
 char *mutt_make_date (char *, size_t);
329
     fputc ('\n', msg->fp);
330
--- po/ca.po Apr 2003 11:00:59 -0000	3.10
331
+++ po/ca.po Oct 2003 15:05:26 -0000
332
@@ -602,10 +602,10 @@ msgstr "Xifra amb: "
333
 #: compose.c:165
334
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
335
-msgstr "PGP: (x)ifra, (s)igna, si(g)na com a, (a)mbdós, o en (c)lar? "
336
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
337
+msgstr "PGP: (x)ifra, (s)igna, si(g)na com a, (a)mbdós, en (l)ínia, o en (c)lar? "
338
 
339
 # ivb (2003/03/26)
340
-# ivb  (x)ifra, (s)igna, si(g)na com a, (a)mbdós, (c)lar
341
+# ivb  (x)ifra, (s)igna, si(g)na com a, (a)mbdós, en (l)ínia, o en (c)lar
342
 #: compose.c:166
343
-msgid "esabf"
344
-msgstr "xsgac"
345
+msgid "esabif"
346
+msgstr "xsgalc"
347
 
348
--- po/cs.po Mar 2003 22:43:06 -0000	3.8
349
+++ po/cs.po Oct 2003 15:05:26 -0000
350
@@ -687,4 +687,4 @@ msgstr "Za¹ifrovat"
351
 #, fuzzy
352
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
353
-msgstr "(¹)ifrovat, (p)odepsat, podepsat (j)ako, (o)bojí, èi (n)ic?"
354
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
355
+msgstr "(¹)ifrovat, (p)odepsat, podepsat (j)ako, (o)bojí, pøí(m)ý, èi (n)ic?"
356
 
357
@@ -692,4 +692,4 @@ msgstr "(¹)ifrovat, (p)odepsat, podepsat
358
 #: compose.c:166
359
-msgid "esabf"
360
-msgstr "¹pjon"
361
+msgid "esabif"
362
+msgstr "¹pjomn"
363
 
364
--- po/da.po Mar 2003 22:43:06 -0000	3.8
365
+++ po/da.po Oct 2003 15:05:26 -0000
366
@@ -577,8 +577,8 @@ msgstr "Kryptér"
367
 #, fuzzy
368
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
369
-msgstr "(k)ryptér, (u)nderskriv, underskriv (s)om, (b)egge, (i)ngen PGP"
370
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
371
+msgstr "(k)ryptér, (u)nderskriv, underskriv (s)om, (b)egge, i(n)tegreret, (i)ngen PGP"
372
 
373
 #: compose.c:166
374
-msgid "esabf"
375
-msgstr "kusbi"
376
+msgid "esabif"
377
+msgstr "kusbni"
378
 
379
--- po/de.po Apr 2003 08:31:00 -0000	3.11
380
+++ po/de.po Oct 2003 15:05:27 -0000
381
@@ -568,8 +568,8 @@ msgstr "Verschlüsseln mit: "
382
 #: compose.c:165
383
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
384
-msgstr "PGP (v)erschl., (s)ign., sign. (a)ls, (b)eides, (k)ein PGP? "
385
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
386
+msgstr "PGP (v)erschl., (s)ign., sign. (a)ls, (b)eides, (i)nline, (k)ein PGP? "
387
 
388
 #: compose.c:166
389
-msgid "esabf"
390
-msgstr "vsabk"
391
+msgid "esabif"
392
+msgstr "vsabik"
393
 
394
--- po/el.po Mar 2003 22:43:06 -0000	3.9
395
+++ po/el.po Oct 2003 15:05:27 -0000
396
@@ -700,4 +700,4 @@ msgstr "ÊñõðôïãñÜöçóç ìå: "
397
 #: compose.c:165
398
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
399
-msgstr "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, Þ (f)orget it? "
400
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
401
+msgstr "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)êåßìåíï, Þ (f)orget it? "
402
 
403
@@ -706,4 +706,4 @@ msgstr "PGP (e)ncrypt, (s)ign, sign (a)s
404
 #: compose.c:166
405
-msgid "esabf"
406
-msgstr "esabf"
407
+msgid "esabif"
408
+msgstr "esabif"
409
 
410
--- po/eo.po May 2003 17:48:28 -0000	3.9
411
+++ po/eo.po Oct 2003 15:05:27 -0000
412
@@ -570,8 +570,8 @@ msgstr "Æifri per: "
413
 #: compose.c:165
414
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
415
-msgstr "PGP æ(i)fri, (s)ubskribi, subskribi (k)iel, (a)mbaý, aý (f)orgesi? "
416
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
417
+msgstr "PGP æ(i)fri, (s)ubskribi, subskribi (k)iel, (a)mbaý, \"i(n)line\", aý (f)orgesi? "
418
 
419
 #: compose.c:166
420
-msgid "esabf"
421
-msgstr "iskaf"
422
+msgid "esabif"
423
+msgstr "iskanf"
424
 
425
--- po/es.po Apr 2003 10:18:15 -0000	3.11
426
+++ po/es.po Oct 2003 15:05:27 -0000
427
@@ -575,4 +575,5 @@ msgstr "Cifrar"
428
 #, fuzzy
429
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
430
-msgstr "¿co(d)ificar, f(i)rmar (c)omo, amb(o)s o ca(n)celar? "
431
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
432
+msgstr "¿co(d)ificar, f(i)rmar (c)omo, amb(o)s, inc(l)uido, o ca(n)celar? "
433
+
434
 
435
@@ -580,4 +581,4 @@ msgstr "¿co(d)ificar, f(i)rmar (c)omo, a
436
 #, fuzzy
437
-msgid "esabf"
438
-msgstr "dicon"
439
+msgid "esabif"
440
+msgstr "dicoln"
441
 
442
--- po/et.po Mar 2003 22:43:07 -0000	3.10
443
+++ po/et.po Oct 2003 15:05:28 -0000
444
@@ -570,8 +570,8 @@ msgstr "Krüpti kasutades: "
445
 #: compose.c:165
446
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
447
-msgstr "PGP (k)rüpti, (a)llkiri, allk. ku(i), (m)õlemad või (u)nusta? "
448
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
449
+msgstr "PGP (k)rüpti, (a)llkiri, allk. ku(i), (m)õlemad, k(e)hasse, või (u)nusta? "
450
 
451
 #: compose.c:166
452
-msgid "esabf"
453
-msgstr "kaimu"
454
+msgid "esabif"
455
+msgstr "kaimeu"
456
 
457
--- po/fr.po Apr 2003 08:38:13 -0000	3.19
458
+++ po/fr.po Oct 2003 15:05:28 -0000
459
@@ -594,8 +594,8 @@ msgstr "Chiffrer avec : "
460
 #: compose.c:165
461
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
462
-msgstr "(c)hiffrer PGP, (s)igner, (e)n tant que, les (d)eux, ou (o)ublier ? "
463
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
464
+msgstr "(c)hiffrer PGP, (s)igner, (e)n tant que, les (d)eux, en (l)igne, ou (o)ublier ? "
465
 
466
 #: compose.c:166
467
-msgid "esabf"
468
-msgstr "csedo"
469
+msgid "esabif"
470
+msgstr "csedlo"
471
 
472
--- po/gl.po Mar 2003 22:43:07 -0000	3.8
473
+++ po/gl.po Oct 2003 15:05:28 -0000
474
@@ -579,8 +579,8 @@ msgstr "Encriptar"
475
 #, fuzzy
476
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
477
-msgstr "¿(e)ncriptar, (f)irmar, firmar (c)omo, (a)mbas ou (o)lvidar? "
478
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
479
+msgstr "¿(e)ncriptar, (f)irmar, firmar (c)omo, (a)mbas, (i)nterior, ou (o)lvidar? "
480
 
481
 #: compose.c:166
482
-msgid "esabf"
483
-msgstr "efcao"
484
+msgid "esabif"
485
+msgstr "efcaio"
486
 
487
--- po/hu.po Aug 2003 11:01:09 -0000	3.9
488
+++ po/hu.po Oct 2003 15:05:29 -0000
489
@@ -563,8 +563,8 @@ msgstr "Titkosítás: "
490
 #: compose.c:165
491
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
492
-msgstr "PGP (t)itkosít, (a)láír, aláír (m)int, titkosít é(s) aláír, mé(g)se? "
493
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
494
+msgstr "PGP (t)itkosít, (a)láír, aláír (m)int, titkosít é(s) aláír, (b)eágyazott, mé(g)se? "
495
 
496
 #: compose.c:166
497
-msgid "esabf"
498
-msgstr "tamsg"
499
+msgid "esabif"
500
+msgstr "tamsbg"
501
 
502
--- po/id.po May 2003 17:48:28 -0000	3.10
503
+++ po/id.po Oct 2003 15:05:29 -0000
504
@@ -571,8 +571,8 @@ msgstr "Enkrip dengan: "
505
 #: compose.c:165
506
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
507
-msgstr "PGP (e)nkrip, (t)andatangan, tandatangan (s)bg, ke(d)uanya, (b)atal? "
508
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
509
+msgstr "PGP (e)nkrip, (t)andatangan, tandatangan (s)bg, ke(d)uanya, (i)nline, (b)atal? "
510
 
511
 #: compose.c:166
512
-msgid "esabf"
513
-msgstr "etsdb"
514
+msgid "esabif"
515
+msgstr "etsdib"
516
 
517
--- po/it.po Mar 2003 22:43:07 -0000	3.8
518
+++ po/it.po Oct 2003 15:05:29 -0000
519
@@ -581,8 +581,8 @@ msgstr "Crittografa"
520
 #, fuzzy
521
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
522
-msgstr "cifra(e), firma(s), firma come(a), entrambi(b), annulla(f) "
523
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
524
+msgstr "cifra(e), firma(s), firma come(a), entrambi(b), in l(i)nea , annulla(f) "
525
 
526
 #: compose.c:166
527
-msgid "esabf"
528
-msgstr "esabf"
529
+msgid "esabif"
530
+msgstr "esabif"
531
 
532
--- po/ja.po Sep 2003 17:15:20 -0000	3.17
533
+++ po/ja.po Oct 2003 15:05:30 -0000
534
@@ -568,8 +568,8 @@ msgstr "  °Å¹æ²½Êý¼°: "
535
 #: compose.c:165
536
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
537
-msgstr "PGP (e)°Å¹æ²½,(s)½ð̾,(a)..¤È¤·¤Æ½ð̾,(b)ξ¼Ô,(f)²ò½ü?"
538
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
539
+msgstr "PGP (e)°Å¹æ²½,(s)½ð̾,(a)..¤È¤·¤Æ½ð̾,(b)ξ¼Ô,(i)nline,(f)²ò½ü?"
540
 
541
 #: compose.c:166
542
-msgid "esabf"
543
-msgstr "esabf"
544
+msgid "esabif"
545
+msgstr "esabif"
546
 
547
--- po/ko.po Sep 2003 10:11:49 -0000	3.12
548
+++ po/ko.po Oct 2003 15:05:30 -0000
549
@@ -569,8 +569,8 @@ msgstr "¾Ïȣȭ ¹æ½Ä: "
550
 #: compose.c:165
551
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
552
-msgstr "PGP ¾Ïȣȭ(e), ¼­¸í(s), »ç¿ë ¼­¸í(a), µÑ ´Ù(b), Ãë¼Ò(f)? "
553
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
554
+msgstr "PGP ¾Ïȣȭ(e), ¼­¸í(s), »ç¿ë ¼­¸í(a), µÑ ´Ù(b), (i)nline, Ãë¼Ò(f)? "
555
 
556
 #: compose.c:166
557
-msgid "esabf"
558
-msgstr "esabf"
559
+msgid "esabif"
560
+msgstr "esabif"
561
 
562
--- po/lt.po Mar 2003 22:43:07 -0000	3.8
563
+++ po/lt.po Oct 2003 15:05:30 -0000
564
@@ -577,5 +577,5 @@ msgstr "Uþðifruoti"
565
 #, fuzzy
566
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
567
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
568
 msgstr ""
569
-"(u)þðifruot, pa(s)iraðyt, pasiraðyt k(a)ip, a(b)u, rinktis (m)ic algoritmà, "
570
+"(u)þðifruot, pa(s)iraðyt, pasiraðyt k(a)ip, a(b)u, (l)aiðke, "
571
 "ar (p)amirðti?"
572
@@ -584,4 +584,4 @@ msgstr ""
573
 #, fuzzy
574
-msgid "esabf"
575
-msgstr "usabmp"
576
+msgid "esabif"
577
+msgstr "usablp"
578
 
579
@@ -597,4 +597,3 @@ msgid ""
580
 msgstr ""
581
-"(u)þðifruot, pa(s)iraðyt, pasiraðyt k(a)ip, a(b)u, rinktis (m)ic algoritmà, "
582
-"ar (p)amirðti?"
583
+"(u)þðifruot, pa(s)iraðyt, uþðifruo(t) su, pasiraðyt k(a)ip, a(b)u, ar (p)amirðti?"
584
 
585
@@ -603,3 +602,3 @@ msgstr ""
586
 msgid "eswabf"
587
-msgstr "usabmp"
588
+msgstr "ustabp"
589
 
590
--- po/nl.po Sep 2003 13:09:59 -0000	3.12
591
+++ po/nl.po Oct 2003 15:05:31 -0000
592
@@ -565,8 +565,8 @@ msgstr "Versleutelen met: "
593
 #: compose.c:165
594
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
595
-msgstr "PGP (v)ersleutel, (o)ndertekenen, ondert. (a)ls, (b)eide, (g)een? "
596
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
597
+msgstr "PGP (v)ersleutel, (o)ndertekenen, ondert. (a)ls, (b)eide, ber(i)cht, (g)een? "
598
 
599
 #: compose.c:166
600
-msgid "esabf"
601
-msgstr "voabg"
602
+msgid "esabif"
603
+msgstr "voabig"
604
 
605
--- po/pl.po Sep 2003 17:20:56 -0000	3.13
606
+++ po/pl.po Oct 2003 15:05:31 -0000
607
@@ -566,8 +566,8 @@ msgstr "Zaszyfruj u¿ywaj±c: "
608
 #: compose.c:165
609
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
610
-msgstr "PGP: (z)aszyfruj, podpi(s)z, podpisz j(a)ko, o(b)a, b(e)z PGP? "
611
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
612
+msgstr "PGP: (z)aszyfruj, podpi(s)z, podpisz j(a)ko, o(b)a, (i)nline, b(e)z PGP? "
613
 
614
 #: compose.c:166
615
-msgid "esabf"
616
-msgstr "zsabe"
617
+msgid "esabif"
618
+msgstr "zsabie"
619
 
620
--- po/pt_BR.po Mar 2003 22:43:08 -0000	3.9
621
+++ po/pt_BR.po Oct 2003 15:05:31 -0000
622
@@ -580,5 +580,5 @@ msgstr "Encriptar"
623
 #, fuzzy
624
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
625
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
626
 msgstr ""
627
-"(e)ncripa, a(s)sina, assina (c)omo, (a)mbos, escolhe (m)ic, ou es(q)uece? "
628
+"(e)ncripa, a(s)sina, assina (c)omo, (a)mbos, em l(i)nha, ou es(q)uece? "
629
 
630
@@ -586,4 +586,4 @@ msgstr ""
631
 #, fuzzy
632
-msgid "esabf"
633
-msgstr "escamq"
634
+msgid "esabif"
635
+msgstr "escaiq"
636
 
637
@@ -599,3 +599,3 @@ msgid ""
638
 msgstr ""
639
-"(e)ncripa, a(s)sina, assina (c)omo, (a)mbos, escolhe (m)ic, ou es(q)uece? "
640
+"(e)ncripa, a(s)sina, e(n)cripa com, assina (c)omo, (a)mbos, ou es(q)uece? "
641
 
642
@@ -604,3 +604,3 @@ msgstr ""
643
 msgid "eswabf"
644
-msgstr "escamq"
645
+msgstr "esncaq"
646
 
647
--- po/ru.po Apr 2003 08:21:09 -0000	3.14
648
+++ po/ru.po Oct 2003 15:05:32 -0000
649
@@ -576,8 +576,8 @@ msgstr "úÁÛÉÆÒÏ×ÁÔØ: "
650
 #: compose.c:165
651
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
652
-msgstr "PGP (e)ÛÉÆÒ, (s)ÐÏÄÐÉÓØ, (a)ÐÏÄÐÉÓØ ËÁË, (b)ÏÂÁ, (f)ÏÔËÁÚÁÔØÓÑ? "
653
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
654
+msgstr "PGP (e)ÛÉÆÒ, (s)ÐÏÄÐÉÓØ, (a)ÐÏÄÐÉÓØ ËÁË, (b)ÏÂÁ, (i)nline, (f)ÏÔËÁÚÁÔØÓÑ? "
655
 
656
 #: compose.c:166
657
-msgid "esabf"
658
-msgstr "esabf"
659
+msgid "esabif"
660
+msgstr "esabif"
661
 
662
--- po/sk.po Mar 2003 22:43:08 -0000	3.8
663
+++ po/sk.po Oct 2003 15:05:32 -0000
664
@@ -585,5 +585,5 @@ msgstr "Za¹ifruj"
665
 #, fuzzy
666
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
667
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
668
 msgstr ""
669
-"(e)-¹ifr, (s)-podp, podp (a)ko, o(b)e, oznaè alg. mi(c), alebo (f)-zabudnú» "
670
+"(e)-¹ifr, (s)-podp, podp (a)ko, o(b)e, (i)nline, alebo (f)-zabudnú» "
671
 "na to? "
672
@@ -592,4 +592,4 @@ msgstr ""
673
 #, fuzzy
674
-msgid "esabf"
675
-msgstr "esabmf"
676
+msgid "esabif"
677
+msgstr "esabif"
678
 
679
@@ -605,4 +605,3 @@ msgid ""
680
 msgstr ""
681
-"(e)-¹ifr, (s)-podp, podp (a)ko, o(b)e, oznaè alg. mi(c), alebo (f)-zabudnú» "
682
-"na to? "
683
+"(e)-¹ifr, (s)-podp, (w)-¹ifr s, podp (a)ko, o(b)e, alebo (f)-zabudnú» na to? "
684
 
685
@@ -611,3 +610,3 @@ msgstr ""
686
 msgid "eswabf"
687
-msgstr "esabmf"
688
+msgstr "eswabf"
689
 
690
--- po/sv.po Mar 2003 22:43:08 -0000	3.9
691
+++ po/sv.po Oct 2003 15:05:32 -0000
692
@@ -567,8 +567,8 @@ msgstr "Kryptera med: "
693
 #: compose.c:165
694
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
695
-msgstr "PGP: (k)ryptera, (s)ignera, signera s(o)m, (b)åda, eller sk(i)ppa det?"
696
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
697
+msgstr "PGP: (k)ryptera, (s)ignera, signera s(o)m, (b)åda, i(n)fogat, eller sk(i)ppa det?"
698
 
699
 #: compose.c:166
700
-msgid "esabf"
701
-msgstr "ksobi"
702
+msgid "esabif"
703
+msgstr "ksobni"
704
 
705
--- po/tr.po Mar 2003 22:43:08 -0000	3.8
706
+++ po/tr.po Oct 2003 15:05:33 -0000
707
@@ -576,5 +576,5 @@ msgstr "Þifrele"
708
 #, fuzzy
709
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
710
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
711
 msgstr ""
712
-"þ(i)frele, i(m)zala, (f)arklý imzala, i(k)isi de, mi(c) algoritmini seç "
713
+"þ(i)frele, i(m)zala, (f)arklý imzala, i(k)isi de, (i)nline, "
714
 "yoksa i(p)talmý? "
715
@@ -582,4 +582,4 @@ msgstr ""
716
 #: compose.c:166
717
-msgid "esabf"
718
-msgstr "imfkcp"
719
+msgid "esabif"
720
+msgstr "imfkip"
721
 
722
--- po/uk.po Mar 2003 22:43:08 -0000	3.9
723
+++ po/uk.po Oct 2003 15:05:33 -0000
724
@@ -571,8 +571,8 @@ msgstr "ûÉÆÒÕ×ÁÎÎÑ"
725
 #, fuzzy
726
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
727
-msgstr "ÛÉÆÒ.(e), ЦÄÐ.(s), ЦÄÐ. ÑË(a), ÕÓÅ(b) ÞÉ ×¦ÄͦÎÁ(f)? "
728
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
729
+msgstr "ÛÉÆÒ.(e), ЦÄÐ.(s), ЦÄÐ. ÑË(a), ÕÓÅ(b), (i)nline ÞÉ ×¦ÄͦÎÁ(f)? "
730
 
731
 #: compose.c:166
732
-msgid "esabf"
733
-msgstr ""
734
+msgid "esabif"
735
+msgstr "esabif"
736
 
737
--- po/zh_CN.po Mar 2003 22:43:08 -0000	3.8
738
+++ po/zh_CN.po Oct 2003 15:05:33 -0000
739
@@ -584,5 +584,5 @@ msgstr "¼ÓÃÜ"
740
 #, fuzzy
741
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
742
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
743
 msgstr ""
744
-"(e)¼ÓÃÜ, (s)Ç©Ãû, (a)ÓñðµÄÉí·ÝÇ©, (b)Á½Õß½ÔÒª, Ñ¡Ôñ (m)ic ÑÝËã·¨ »ò (f)·Å"
745
+"(e)¼ÓÃÜ, (s)Ç©Ãû, (a)ÓñðµÄÉí·ÝÇ©, (b)Á½Õß½ÔÒª, (i)nline, »ò (f)·Å"
746
 "Æú£¿"
747
@@ -590,4 +590,4 @@ msgstr ""
748
 #: compose.c:166
749
-msgid "esabf"
750
-msgstr ""
751
+msgid "esabif"
752
+msgstr "esabif"
753
 
754
--- po/zh_TW.po Mar 2003 22:43:08 -0000	3.8
755
+++ po/zh_TW.po Oct 2003 15:05:34 -0000
756
@@ -576,3 +576,3 @@ msgstr "加密"
757
 #, fuzzy
758
-msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, or (f)orget it? "
759
+msgid "PGP (e)ncrypt, (s)ign, sign (a)s, (b)oth, (i)nline, or (f)orget it? "
760
 msgstr "(1)加密, (2)簽名, (3)用別的身份簽, (4)兩者皆要, 或 (5)放棄?"
761
@@ -580,4 +580,4 @@ msgstr "(1)加密, (2)簽名, (3)用別ç
762
 #: compose.c:166
763
-msgid "esabf"
764
-msgstr "12345"
765
+msgid "esabif"
766
+msgstr "1234i5"
767
 
219
 
220
 const char *mutt_make_version (void);
(-)./scripts/generate-plist (-1 / +4 lines)
Lines 138-143 Link Here
138
    if [ "$MUTT_EDIT_THREADS" = "yes" ]; then
138
    if [ "$MUTT_EDIT_THREADS" = "yes" ]; then
139
      html=$(($html + 3))
139
      html=$(($html + 3))
140
    fi
140
    fi
141
    if [ "$MUTT_IMAP_HEADER_CACHE" = "yes" ]; then
142
      html=$(($html + 1))
143
    fi
141
    if [ "$MUTT_SIGNATURE_MENU" = "yes" ]; then
144
    if [ "$MUTT_SIGNATURE_MENU" = "yes" ]; then
142
      html=$(($html + 1))
145
      html=$(($html + 1))
143
    fi
146
    fi
Lines 145-151 Link Here
145
      html=$(($html + 1))
148
      html=$(($html + 1))
146
    fi
149
    fi
147
    if [ "$MUTT_PGP_PATCH" = "yes" ]; then
150
    if [ "$MUTT_PGP_PATCH" = "yes" ]; then
148
      html=$(($html + 1))
151
      html=$(($html + 2))
149
    fi
152
    fi
150
    echo "%%DOCSDIR%%/html/manual.html" >> $tmp_first
153
    echo "%%DOCSDIR%%/html/manual.html" >> $tmp_first
151
    echo "%%DOCSDIR%%/html/manual_toc.html" >> $tmp_first
154
    echo "%%DOCSDIR%%/html/manual_toc.html" >> $tmp_first

Return to bug 60403