diff -ru /usr/ports/mail/mutt-devel/Makefile ./Makefile --- /usr/ports/mail/mutt-devel/Makefile Wed Sep 1 06:06:34 2004 +++ ./Makefile Sat Sep 4 12:36:35 2004 @@ -40,6 +40,9 @@ # If you do not want mutt to use the iconv library define: # WITHOUT_MUTT_ICONV # +# If you want mutt to use the idn library define: +# WITH_MUTT_IDN +# # If you want to enable extended quoting functions define: # WITH_MUTT_QUOTE_PATCH # This is a default knob and can be disabled by WITHOUT_MUTT_QUOTE_PATCH @@ -59,10 +62,6 @@ # If you want to read and post news with mutt define: # WITH_MUTT_NNTP # -# If you want to use the SASL authentication features with your email server -# define -# WITH_MUTT_CYRUS_SASL -# # If you want to use the rethreading functions define: # WITH_MUTT_EDIT_THREADS # @@ -115,7 +114,7 @@ CONFIGURE_ARGS= --enable-flock --disable-fcntl --with-ssl=${OPENSSLBASE} \ --with-sharedir=${PREFIX}/share/mutt --with-docdir=${DOCSDIR} \ --sysconfdir=${PREFIX}/etc --enable-external-dotlock \ - --enable-pop --enable-imap + --enable-pop --enable-imap --disable-warnings .if defined(MUTT_CONFIGURE_ARGS) CONFIGURE_ARGS+= ${MUTT_CONFIGURE_ARGS} .endif @@ -203,14 +202,16 @@ .elif defined(MUTT_USES_SLANG) LIB_DEPENDS+= slang.1:${PORTSDIR}/devel/libslang .endif -.if defined(WITH_MUTT_CYRUS_SASL) -BROKEN= "mutt-devel's SASL code appears to be broken" -LIB_DEPENDS+= sasl.8:${PORTSDIR}/security/cyrus-sasl -.endif .if defined(WITH_MUTT_MAILDIR_HEADER_CACHE) LIB_DEPENDS+= db-4.2.2:${PORTSDIR}/databases/db42 CFLAGS+= -I${PREFIX}/include/db42 .endif +.if exists(${LOCALBASE}/lib/libidn.so) +WITH_MUTT_IDN= yes +.endif +.if defined(WITH_MUTT_IDN) +LIB_DEPENDS+= idn.15:${PORTSDIR}/devel/libidn +.endif .if ! defined(WITHOUT_MUTT_SMIME_OUTLOOK_COMPAT) pre-configure:: @${PATCH} ${PATCH_ARGS} < ${PATCHDIR}/extra-patch-smime-outlook @@ -252,9 +253,6 @@ CONFIGURE_ARGS+= --with-slang=${PREFIX} PATCHFILES+= patch-${VVV_PATCH_VERSION}.vvv.slang.gz:vvv .endif -.if defined(WITH_MUTT_CYRUS_SASL) -CONFIGURE_ARGS+= --with-sasl=${LOCALBASE} -.endif .if defined(WITHOUT_NLS) CONFIGURE_ARGS+= --disable-nls .endif @@ -263,6 +261,11 @@ .else CONFIGURE_ARGS+= --with-libiconv-prefix=${PREFIX} .endif +.if defined(WITH_MUTT_IDN) +CONFIGURE_ARGS+= --with-idn +.else +CONFIGURE_ARGS+= --without-idn +.endif PATCH_DIST_STRIP= -p1 @@ -321,7 +324,7 @@ .endif .if defined(WITH_MUTT_MAILDIR_HEADER_CACHE) SCRIPTS_ENV+= MUTT_MAILDIR_HEADER_CACHE="yes" -CONFIGURE_ARGS+= --enable-hcache +CONFIGURE_ARGS+= --enable-hcache --without-gdbm --with-bdb .endif .if defined(WITH_MUTT_EDIT_THREADS) SCRIPTS_ENV+= MUTT_EDIT_THREADS="yes" diff -ru /usr/ports/mail/mutt-devel/files/extra-patch-maildir-header-cache ./files/extra-patch-maildir-header-cache --- /usr/ports/mail/mutt-devel/files/extra-patch-maildir-header-cache Mon Aug 30 06:06:29 2004 +++ ./files/extra-patch-maildir-header-cache Fri Sep 3 17:52:43 2004 @@ -2,11 +2,11 @@ --- a/PATCHES +++ b/PATCHES @@ -0,0 +1 @@ -+patch-1.5.6.tg.hcache.2 ++patch-1.5.6.tg.hcache.6 diff -Nru a/configure.in b/configure.in --- a/configure.in 2004-08-18 09:43:09 +02:00 -+++ b/configure.in 2004-08-18 06:34:04 +02:00 -@@ -768,6 +768,81 @@ ++++ b/configure.in 2004-09-02 13:09:08 +02:00 +@@ -768,6 +768,90 @@ fi]) @@ -19,66 +19,75 @@ + OLDCPPFLAGS="$CPPFLAGS" + OLDLIBS="$LIBS" + -+ BDB_VERSIONS="db-4 db4 db-4.3 db4.3 db43 db-4.2 db4.2 db42 db-4.1 db4.1 db41 db" -+ -+ AC_MSG_CHECKING([for BerkeleyDB > 4.0]) ++ ac_prefer_gdbm=yes ++ AC_ARG_WITH(gdbm, [ --without-gdbm Get rid of gdbm even if it is available ], ++ ac_prefer_gdbm=$withval) ++ if test x$ac_prefer_gdbm != xno; then ++ CPPFLAGS="$OLDCPPFLAGS" ++ LIBS="$OLDLIBS -lgdbm"; ++ AC_CACHE_CHECK(for gdbm_open, ac_cv_gdbmopen,[ ++ ac_cv_gdbmopen=no ++ AC_TRY_LINK([#include ],[gdbm_open(0,0,0,0,0);],[ac_cv_gdbmopen=yes]) ++ ]) ++ fi + -+ for d in /opt/csw/bdb4 /opt /usr/local /usr; do -+ for v in `echo $BDB_VERSIONS .`; do -+ if test -r "$d/include/$v/db.h"; then -+ BDB_INCLUDE_DIR="$d/include/$v" -+ break -+ fi ++ ac_bdb_prefix=yes ++ AC_ARG_WITH(bdb, [ --with-bdb[=DIR] Use BerkeleyDB4 if gdbm is not available ], ++ ac_bdb_prefix=$withval) ++ if test x$ac_bdb_prefix != xno -a x$ac_cv_gdbmopen != xyes; then ++ test x$ac_bdb_prefix = xyes && ac_bdb_prefix="$mutt_cv_prefix /opt/csw/bdb4 /opt /usr/local /usr" ++ for d in $ac_bdb_prefix; do ++ bdbpfx="$bdbpfx $d" ++ for v in BerkeleyDB.4.3 BerkeleyDB.4.2 BerkeleyDB.4.1; do ++ bdbpfx="$bdbpfx $d/$v" ++ done + done -+ for v in `echo $BDB_VERSIONS .`; do -+ if test -d "$d/lib/$v"; then -+ BDB_LIB_DIR="$d/lib/$v" -+ break -+ fi ++ BDB_VERSIONS="db-4 db4 db-4.3 db4.3 db43 db-4.2 db4.2 db42 db-4.1 db4.1 db41 db ''" ++ AC_MSG_CHECKING([for BerkeleyDB > 4.0]) ++ for d in $bdbpfx; do ++ BDB_INCLUDE_DIR="" ++ BDB_LIB_DIR="" ++ for v in / $BDB_VERSIONS; do ++ if test -r "$d/include/$v/db.h"; then ++ BDB_INCLUDE_DIR="$d/include/$v" ++ if test -d "$d/lib/$v"; then ++ BDB_LIB_DIR="$d/lib/$v" ++ for l in `echo $BDB_VERSIONS`; do ++ CPPFLAGS="-I$BDB_INCLUDE_DIR $OLDCPPFLAGS" ++ LIBS="$OLDLIBS -L$BDB_LIB_DIR -l$l" ++ AC_TRY_LINK([ ++ #include ++ #include ++ ],[ ++ DB *db = NULL; ++ db->open(db,NULL,NULL,NULL,0,0,0); ++ ],[ ++ ac_cv_dbcreate=yes ++ BDB_LIB="$l" ++ break ++ ]) ++ done ++ test x$ac_dbcreate = xyes && break ++ fi ++ fi ++ done ++ test x$BDB_LIB != x && break + done -+ for v in BerkeleyDB.4.3 BerkeleyDB.4.2 BerkeleyDB.4.1; do -+ test -r "$d/$v/include/db.h" && BDB_INCLUDE_DIR="$d/$v/include" -+ test -d "$d/$v/lib" && BDB_LIB_DIR="$d/$v/lib" -+ done -+ test x$BDB_INCLUDE_DIR = x -o x$BDB_LIB_DIR = x && continue -+ for v in `echo $BDB_VERSIONS`; do -+ CPPFLAGS="$OLDCPPFLAGS -I$BDB_INCLUDE_DIR" -+ LIBS="$OLDLIBS -L$BDB_LIB_DIR -l$v" -+ AC_TRY_LINK([ -+ #include -+ #include -+ ],[ -+ DB *db = NULL; -+ db->open(db,NULL,NULL,NULL,0,0,0); -+ ],[ -+ ac_cv_dbcreate=yes -+ BDB_LIB="$v" -+ break -+ ]) -+ done -+ test x$BDB_LIB != x && break -+ done -+ -+ if test x$ac_cv_dbcreate = xyes; then -+ AC_MSG_RESULT(yes) -+ else -+ AC_MSG_RESULT(no) ++ if test x$ac_cv_dbcreate = xyes; then ++ AC_MSG_RESULT(yes) ++ else ++ AC_MSG_RESULT(no) ++ fi + fi + -+ CPPFLAGS="$OLDCPPFLAGS" -+ LIBS="$OLDLIBS -lgdbm"; -+ AC_CACHE_CHECK(for gdbm_open, ac_cv_gdbmopen, -+ [ac_cv_gdbmopen=no -+ AC_TRY_LINK([#include ],[gdbm_open(0,0,0,0,0);],[ac_cv_gdbmopen=yes])]) -+ -+ if test x$ac_cv_dbcreate = xyes; then -+ CPPFLAGS="$OLDCPPFLAGS -I$BDB_INCLUDE_DIR" -+ LIBS="$OLDLIBS -L$BDB_LIB_DIR -l$BDB_LIB" -+ AC_DEFINE(HAVE_DB4, 1, [Sleepycat DB4 Support]) -+ elif test x$ac_cv_gdbmopen = xyes; then ++ if test x$ac_cv_gdbmopen = xyes; then + CPPFLAGS="$OLDCPPFLAGS" + LIBS="$OLDLIBS -lgdbm"; + AC_DEFINE(HAVE_GDBM, 1, [GDBM Support]) ++ elif test x$ac_cv_dbcreate = xyes; then ++ CPPFLAGS="-I$BDB_INCLUDE_DIR $OLDCPPFLAGS" ++ LIBS="$OLDLIBS -L$BDB_LIB_DIR -l$BDB_LIB" ++ AC_DEFINE(HAVE_DB4, 1, [Sleepycat DB4 Support]) + else + AC_MSG_ERROR(You need Sleepycat DB4 or GDBM for --enable-hcache) + fi @@ -104,8 +113,8 @@ WHERE char *MhUnseen; diff -Nru a/hcache.c b/hcache.c --- /dev/null Wed Dec 31 16:00:00 196900 -+++ b/hcache.c 2004-08-26 22:32:53 +02:00 -@@ -0,0 +1,798 @@ ++++ b/hcache.c 2004-09-02 14:29:03 +02:00 +@@ -0,0 +1,797 @@ +/* + * Copyright (C) 2004 Thomas Glanzmann + * Copyright (C) 2004 Tobias Werth @@ -133,7 +142,7 @@ +#if HAVE_GDBM +#include +#elif HAVE_DB4 -+#include ++#include +#endif + +#include @@ -514,7 +523,7 @@ +{ + int crc = 0; + -+ crc = crc32(crc, (unsigned char const *) "sithglan@stud.uni-erlangen.de[sithglan]|hcache.c|20040826203315|26242", mutt_strlen("sithglan@stud.uni-erlangen.de[sithglan]|hcache.c|20040826203315|26242")); ++ crc = crc32(crc, (unsigned char const *) "sithglan@stud.uni-erlangen.de[sithglan]|hcache.c|20040902122921|26232", mutt_strlen("sithglan@stud.uni-erlangen.de[sithglan]|hcache.c|20040902122921|26232")); + +#if HAVE_LANGINFO_CODESET + crc = crc32(crc, (unsigned char const *) Charset, mutt_strlen(Charset)); @@ -614,12 +623,11 @@ +mutt_hcache_open(const char *path, const char *folder) +{ + struct header_cache *h = safe_calloc(1, sizeof(HEADER_CACHE)); ++ int pagesize = atoi(HeaderCachePageSize) ? atoi(HeaderCachePageSize) : 16384; + h->db = NULL; + h->folder = safe_strdup (folder); + h->crc = generate_crc32(); + -+ int pagesize = atoi(HeaderCachePageSize) ? atoi(HeaderCachePageSize) : 16384; -+ + if (! path || path[0] == '\0') { + FREE(& h->folder); + FREE(& h); @@ -1247,86 +1255,100 @@ #ifdef ISPELL diff -Nru a/mh.c b/mh.c --- a/mh.c 2004-08-18 09:43:13 +02:00 -+++ b/mh.c 2004-07-26 09:37:28 +02:00 -@@ -779,11 +779,68 @@ ++++ b/mh.c 2004-09-03 14:33:12 +02:00 +@@ -779,30 +779,79 @@ return r; } +#if USE_HCACHE -+ +static size_t maildir_hcache_keylen (const char *fn) +{ + const char * p = strchr (fn, ':'); + return p ? (size_t) (p - fn) : mutt_strlen(fn); +} -+ ++#endif /* * This function does the second parsing pass for a maildir-style * folder. */ -+void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) -+{ -+ struct maildir *p; -+ void *hc = NULL; -+ char fn[_POSIX_PATH_MAX]; -+ void *data; -+ unsigned int size; -+ struct timeval *when = NULL; -+ struct stat lastchanged; -+ int ret; -+ -+ hc = mutt_hcache_open (HeaderCache, ctx->path); +- + void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) + { + struct maildir *p; + char fn[_POSIX_PATH_MAX]; ++ int count; + +- for (p = md; p; p = p->next) +- if (p && p->h && !p->header_parsed) +- { +- snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path); +- if (maildir_parse_message (ctx->magic, fn, p->h->old, p->h)) +- p->header_parsed = 1; +- else +- mutt_free_header (&p->h); +- } ++#if USE_HCACHE ++ void *hc = NULL; ++ void *data; ++ unsigned int size; ++ struct timeval *when = NULL; ++ struct stat lastchanged; ++ int ret; + -+ for (p = md; p; p = p->next) { -+ if (! (p && p->h && !p->header_parsed)) { -+ continue; -+ } ++ hc = mutt_hcache_open (HeaderCache, ctx->path); ++#endif + -+ data = mutt_hcache_fetch (hc, p->h->path + 3, &maildir_hcache_keylen); -+ when = (struct timeval *) data; ++ for (p = md, count = 0; p; p = p->next, count++) ++ { ++ if (! (p && p->h && !p->header_parsed)) ++ continue; + -+ snprintf(fn, sizeof (fn), "%s/%s", ctx->path, p->h->path); ++#if USE_HCACHE ++ data = mutt_hcache_fetch (hc, p->h->path + 3, &maildir_hcache_keylen); ++ when = (struct timeval *) data; ++#endif + -+ if (option(OPTHCACHEVERIFY)) { -+ ret = stat(fn, &lastchanged); -+ } else { -+ lastchanged.st_mtime = 0; -+ ret = 0; -+ } ++ snprintf (fn, sizeof (fn), "%s/%s", ctx->path, p->h->path); + -+ if (data != NULL -+ && ret == 0 -+ && lastchanged.st_mtime <= when->tv_sec) { -+ p->h = mutt_hcache_restore ((unsigned char *)data, &p->h); -+ maildir_parse_flags (p->h, fn); -+ -+ } else if (maildir_parse_message (ctx->magic, fn, p->h->old, p->h)) { -+ maildir_parse_flags(p->h, fn); -+ p->header_parsed = 1; -+ mutt_hcache_store (hc, p->h->path + 3, p->h, 0, &maildir_hcache_keylen); -+ } else { -+ mutt_free_header (&p->h); -+ } -+ FREE(&data); -+ } -+ mutt_hcache_close (hc); -+} ++#if USE_HCACHE ++ if (option(OPTHCACHEVERIFY)) { ++ ret = stat(fn, &lastchanged); ++ } else { ++ lastchanged.st_mtime = 0; ++ ret = 0; ++ } + -+#else /* USE_HCACHE */ - - void maildir_delayed_parsing (CONTEXT * ctx, struct maildir *md) - { -@@ -801,7 +858,7 @@ - } ++ if (data != NULL && !ret && lastchanged.st_mtime <= when->tv_sec) ++ { ++ p->h = mutt_hcache_restore ((unsigned char *)data, &p->h); ++ maildir_parse_flags (p->h, fn); ++ } else ++#endif ++ if (maildir_parse_message (ctx->magic, fn, p->h->old, p->h)) ++ { ++ p->header_parsed = 1; ++ maildir_parse_flags (p->h, fn); ++#if USE_HCACHE ++ mutt_hcache_store (hc, p->h->path + 3, p->h, 0, &maildir_hcache_keylen); ++#endif ++ } else ++ mutt_free_header (&p->h); ++#if USE_HCACHE ++ FREE(&data); ++#endif ++ } ++#if USE_HCACHE ++ mutt_hcache_close (hc); ++#endif } - -+#endif /* USE_HCACHE */ - +- /* Read a MH/maildir style mailbox. * -@@ -1293,6 +1350,9 @@ + * args: +@@ -1293,6 +1342,9 @@ { char path[_POSIX_PATH_MAX], tmp[_POSIX_PATH_MAX]; int i, j; @@ -1336,7 +1358,7 @@ if (ctx->magic == M_MH) i = mh_check_mailbox (ctx, index_hint); -@@ -1302,6 +1362,11 @@ +@@ -1302,6 +1354,11 @@ if (i != 0) return i; @@ -1348,7 +1370,7 @@ for (i = 0; i < ctx->msgcount; i++) { if (ctx->hdrs[i]->deleted -@@ -1310,7 +1375,13 @@ +@@ -1310,7 +1367,13 @@ snprintf (path, sizeof (path), "%s/%s", ctx->path, ctx->hdrs[i]->path); if (ctx->magic == M_MAILDIR || (option (OPTMHPURGE) && ctx->magic == M_MH)) @@ -1362,7 +1384,7 @@ else if (ctx->magic == M_MH) { /* MH just moves files out of the way when you delete them */ -@@ -1332,16 +1403,21 @@ +@@ -1332,16 +1395,21 @@ if (ctx->magic == M_MAILDIR) { if (maildir_sync_message (ctx, i) == -1) @@ -1386,7 +1408,7 @@ if (ctx->magic == M_MH) mh_update_sequences (ctx); -@@ -1362,6 +1438,13 @@ +@@ -1362,6 +1430,13 @@ } return 0; diff -ru /usr/ports/mail/mutt-devel/files/patch-01 ./files/patch-01 --- /usr/ports/mail/mutt-devel/files/patch-01 Sun Jul 28 19:26:11 2002 +++ ./files/patch-01 Thu Jan 1 01:00:00 1970 @@ -1,20 +0,0 @@ ---- configure.in.orig Thu May 2 01:21:49 2002 -+++ configure.in Wed Jul 17 17:08:49 2002 -@@ -591,7 +591,7 @@ - then - if test "$with_sasl" != "yes" - then -- CPPFLAGS="$CPPFLAGS -I$with_sasl/include" -+ CPPFLAGS="$CPPFLAGS -I$with_sasl/include/sasl1" - LDFLAGS="$LDFLAGS -L$with_sasl/lib" - fi - -@@ -644,7 +644,7 @@ - fi]) - - if test x$GCC = xyes -a $mutt_cv_warnings = yes; then -- CFLAGS="-Wall -pedantic $CFLAGS" -+ CFLAGS="-Wall $CFLAGS" - fi - - AC_ARG_ENABLE(nfs-fix, [ --enable-nfs-fix Work around an NFS with broken attributes caching ], diff -ru /usr/ports/mail/mutt-devel/files/patch-threadcomplete ./files/patch-threadcomplete --- /usr/ports/mail/mutt-devel/files/patch-threadcomplete Mon Aug 30 06:06:29 2004 +++ ./files/patch-threadcomplete Mon Sep 6 09:49:42 2004 @@ -1,21 +1,12 @@ diff -Nru a/PATCHES b/PATCHES ---- PATCHES 2004-07-24 12:27:17 +02:00 -+++ PATCHES 2004-08-22 02:01:52 +02:00 +--- PATCHES ++++ PATCHES @@ -0,0 +1 @@ -+patch-1.5.6.cb.thread_pattern.1 ++patch-1.5.6+20040904.tg.mutt-thread.3 diff -Nru a/doc/manual.sgml.head b/doc/manual.sgml.head --- doc/manual.sgml.head 2004-07-24 12:27:29 +02:00 -+++ doc/manual.sgml.head 2004-08-25 14:54:08 +02:00 -@@ -1771,6 +1771,8 @@ - messages: - - -+~a messages in threads that contain at least one tagged message; -+ this is the same as ~(~T) [see below for ~(..)] - ~A all messages - ~b EXPR messages which contain EXPR in the message body - ~B EXPR messages which contain EXPR in the whole message -@@ -1809,6 +1811,8 @@ ++++ doc/manual.sgml.head 2004-09-04 12:40:02 +02:00 +@@ -1809,6 +1809,8 @@ ~y EXPR messages which contain EXPR in the `X-Label' field ~z [MIN]-[MAX] messages with a size in the range MIN to MAX *) ~= duplicated messages (see $duplicate_threads) @@ -24,15 +15,11 @@ Where EXPR, USER, ID, and SUBJECT are + Where EXPR, USER, ID, and SUBJECT are diff -Nru a/mutt.h b/mutt.h --- mutt.h 2004-07-24 12:27:21 +02:00 -+++ mutt.h 2004-08-25 14:04:40 +02:00 -@@ -207,10 +207,12 @@ - M_LIMIT, - M_EXPIRED, - M_SUPERSEDED, -+ M_THREADCOMPLETE, - ++++ mutt.h 2004-09-04 12:36:18 +02:00 +@@ -211,6 +211,7 @@ /* actions for mutt_pattern_comp/mutt_pattern_exec */ M_AND, M_OR, @@ -42,16 +29,8 @@ M_COLLAPSED, diff -Nru a/pattern.c b/pattern.c --- pattern.c 2004-07-24 12:27:23 +02:00 -+++ pattern.c 2004-08-25 15:37:51 +02:00 -@@ -44,6 +44,7 @@ - } - Flags[] = - { -+ { 'a', M_THREADCOMPLETE, 0, NULL }, - { 'A', M_ALL, 0, NULL }, - { 'b', M_BODY, M_FULL_MSG, eat_regexp }, - { 'B', M_WHOLE_MSG, M_FULL_MSG, eat_regexp }, -@@ -700,7 +701,7 @@ ++++ pattern.c 2004-09-04 12:37:52 +02:00 +@@ -700,7 +700,7 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err) { pattern_t *curlist = NULL; @@ -60,7 +39,7 @@ pattern_t *last = NULL; int not = 0; int alladdr = 0; -@@ -755,6 +756,39 @@ +@@ -755,6 +755,39 @@ alladdr = 0; break; case '~': @@ -100,7 +79,7 @@ if (implicit && or) { /* A | B & C == (A | B) & C */ -@@ -945,6 +979,30 @@ +@@ -945,6 +978,29 @@ return alladdr; } @@ -112,10 +91,9 @@ + if(!t) + return 0; + h = t->message; -+ if(!h) -+ return 0; -+ if(mutt_pattern_exec(pat, flags, ctx, h)) -+ return 1; ++ if(h) ++ if(mutt_pattern_exec(pat, flags, ctx, h)) ++ return 1; + + if(up && (a=match_threadcomplete(pat, flags, ctx, t->parent,1,1,1,0))) + return a; @@ -131,7 +109,7 @@ /* flags M_MATCH_FULL_ADDRESS match both personal and machine address */ int -@@ -958,6 +1016,8 @@ +@@ -958,6 +1014,8 @@ return (pat->not ^ (perform_and (pat->child, flags, ctx, h) > 0)); case M_OR: return (pat->not ^ (perform_or (pat->child, flags, ctx, h) > 0)); @@ -140,7 +118,38 @@ case M_ALL: return (!pat->not); case M_EXPIRED: -@@ -1023,6 +1083,16 @@ +--- doc/manual.sgml.head.orig2 Mon Sep 6 09:24:16 2004 ++++ doc/manual.sgml.head Mon Sep 6 09:25:41 2004 +@@ -1773,6 +1773,8 @@ + messages: + + ++~a messages in threads that contain at least one tagged message; ++ this is the same as ~(~T) [see below for ~(..)] + ~A all messages + ~b EXPR messages which contain EXPR in the message body + ~B EXPR messages which contain EXPR in the whole message +--- mutt.h.orig2 Mon Sep 6 09:24:17 2004 ++++ mutt.h Mon Sep 6 09:27:04 2004 +@@ -212,6 +212,7 @@ + M_LIMIT, + M_EXPIRED, + M_SUPERSEDED, ++ M_THREADCOMPLETE, + + /* actions for mutt_pattern_comp/mutt_pattern_exec */ + M_AND, +--- pattern.c.orig2 Mon Sep 6 09:24:10 2004 ++++ pattern.c Mon Sep 6 09:30:02 2004 +@@ -44,6 +44,7 @@ + } + Flags[] = + { ++ { 'a', M_THREADCOMPLETE, 0, NULL }, + { 'A', M_ALL, 0, NULL }, + { 'b', M_BODY, M_FULL_MSG, eat_regexp }, + { 'B', M_WHOLE_MSG, M_FULL_MSG, eat_regexp }, +@@ -1024,6 +1083,16 @@ pat->alladdr, 2, h->env->to, h->env->cc)); case M_LIST: return (pat->not ^ mutt_is_list_recipient (pat->alladdr, h->env->to, h->env->cc));