Re: Patches
On 2006-04-28 21:45:45 +0200, Thomas Roessler wrote:
> Oh well. Now trying to hack this into some shape that
> remotely resembles decent code.
Try the change below the .signature, it's in CVS now. Still,
playing with this feature a bit, it's a terrible performance
hog.
If you use this, it quite simply requires mutt to parse every
individual message when you scroll through an index for the
first time; with a large-ish mailbox, it's quite painful to
use, even on modern machines with fast hard disks. It's
probably ok with a long-running mutt instance that operates,
say, on an inbox where messages slowly come in and the parsing
can be done one by one.
I'm wondering, is there anybody here who *seriously* uses this
feature?
If the main use case is to simply know whether the top-level
body part is a multipart, then we can get that a *lot* cheaper,
and with a fraction of the code. Persoally, I don't think that
this is particularly useful information (and that's why I threw
the feature out years ago -- it's particularly nonsensical for
multipart/{signed,encrypted}), but I guess I'd rather include
that than have the present attachment counting code stay.
Sorry, David...
--
Thomas Roessler · Personal soap box at <http://log.does-not-exist.org/>.
Index: hdrline.c
===================================================================
RCS file: /cvs/mutt/mutt/hdrline.c,v
retrieving revision 3.18
diff -u -r3.18 hdrline.c
--- hdrline.c 10 Jan 2006 19:15:21 -0000 3.18
+++ hdrline.c 28 Apr 2006 19:52:16 -0000
@@ -657,16 +657,7 @@
case 'X':
{
- int count;
-
- if (hdr->content->parts)
- count = mutt_count_body_parts(hdr, 0);
- else
- {
- mutt_parse_mime_message(ctx, hdr);
- count = mutt_count_body_parts(hdr, 0);
- mutt_free_body(&hdr->content->parts);
- }
+ int count = mutt_count_body_parts (ctx, hdr);
/* The recursion allows messages without depth to return 0. */
if (optional)
Index: mutt.h
===================================================================
RCS file: /cvs/mutt/mutt/mutt.h,v
retrieving revision 3.64
diff -u -r3.64 mutt.h
--- mutt.h 28 Apr 2006 08:35:03 -0000 3.64
+++ mutt.h 28 Apr 2006 19:52:17 -0000
@@ -921,9 +921,7 @@
regex_t minor_rx;
} ATTACH_MATCH;
-/* Flags for mutt_count_body_parts() */
#define M_PARTS_TOPLEVEL (1<<0) /* is the top-level part */
-#define M_PARTS_RECOUNT (1<<1) /* force recount */
#include "ascii.h"
#include "protos.h"
Index: parse.c
===================================================================
RCS file: /cvs/mutt/mutt/parse.c,v
retrieving revision 3.22
diff -u -r3.22 parse.c
--- parse.c 16 Dec 2005 18:49:40 -0000 3.22
+++ parse.c 28 Apr 2006 19:52:18 -0000
@@ -928,7 +928,6 @@
void mutt_parse_mime_message (CONTEXT *ctx, HEADER *cur)
{
MESSAGE *msg;
- int flags = 0;
do {
if (cur->content->type != TYPEMESSAGE &&
@@ -949,7 +948,7 @@
}
} while (0);
- mutt_count_body_parts(cur, flags|M_PARTS_RECOUNT);
+ cur->attach_valid = 0;
}
int mutt_parse_rfc822_line (ENVELOPE *e, HEADER *hdr, char *line, char *p,
short user_hdrs, short weed,
@@ -1599,16 +1598,27 @@
return count < 0 ? 0 : count;
}
-int mutt_count_body_parts (HEADER *hdr, int flags)
+int mutt_count_body_parts (CONTEXT *ctx, HEADER *hdr)
{
- if (hdr->attach_valid && !(flags & M_PARTS_RECOUNT))
- return hdr->attach_total;
+ short keep_parts = 0;
+ if (hdr->attach_valid)
+ return hdr->attach_total;
+
+ if (hdr->content->parts)
+ keep_parts = 1;
+ else
+ mutt_parse_mime_message (ctx, hdr);
+
if (AttachAllow || AttachExclude || InlineAllow || InlineExclude)
- hdr->attach_total = count_body_parts(hdr->content, flags |
M_PARTS_TOPLEVEL);
+ hdr->attach_total = count_body_parts(hdr->content, M_PARTS_TOPLEVEL);
else
hdr->attach_total = 0;
hdr->attach_valid = 1;
+
+ if (!keep_parts)
+ mutt_free_body (&hdr->content->parts);
+
return hdr->attach_total;
}
Index: pattern.c
===================================================================
RCS file: /cvs/mutt/mutt/pattern.c,v
retrieving revision 3.29
diff -u -r3.29 pattern.c
--- pattern.c 15 Jan 2006 21:37:03 -0000 3.29
+++ pattern.c 28 Apr 2006 19:52:18 -0000
@@ -1132,17 +1132,7 @@
return (pat->not ^ (h->thread && h->thread->duplicate_thread));
case M_MIMEATTACH:
{
- int count;
-
- if (h->content->parts)
- count = mutt_count_body_parts(h, 0);
- else
- {
- mutt_parse_mime_message(ctx, h);
- count = mutt_count_body_parts(h, 0);
- mutt_free_body(&h->content->parts);
- }
-
+ int count = mutt_count_body_parts (ctx, h);
return (pat->not ^ (count >= pat->min && (pat->max == M_MAXRANGE ||
count <= pat->max)));
}
Index: protos.h
===================================================================
RCS file: /cvs/mutt/mutt/protos.h,v
retrieving revision 3.43
diff -u -r3.43 protos.h
--- protos.h 9 Jan 2006 19:43:59 -0000 3.43
+++ protos.h 28 Apr 2006 19:52:18 -0000
@@ -168,7 +168,7 @@
void mutt_buffy (char *, size_t);
int mutt_buffy_list (void);
void mutt_canonical_charset (char *, size_t, const char *);
-int mutt_count_body_parts (HEADER *hdr, int flags);
+int mutt_count_body_parts (CONTEXT *, HEADER *);
void mutt_check_rescore (CONTEXT *);
void mutt_clear_error (void);
void mutt_create_alias (ENVELOPE *, ADDRESS *);