Index: head/mail/mutt/Makefile =================================================================== --- head/mail/mutt/Makefile (revision 443854) +++ head/mail/mutt/Makefile (revision 443855) @@ -1,309 +1,308 @@ # Created by: Udo Schweigert # $FreeBSD$ PORTNAME= mutt -PORTVERSION= 1.8.2 -PORTREVISION?= 1 +PORTVERSION= 1.8.3 +PORTREVISION?= 0 CATEGORIES+= mail ipv6 MASTER_SITES= ftp://ftp.mutt.org/pub/mutt/ \ ftp://ftp.fu-berlin.de/pub/unix/mail/mutt/ \ https://bitbucket.org/mutt/mutt/downloads/ \ ftp://ftp.demon.co.uk/pub/mirrors/mutt/ \ http://www.mutt.org.ua/download/mutt-${VVV_PATCH_VERSION}/:vvv \ http://www2.mutt.org.ua/download/mutt-${VVV_PATCH_VERSION}/:vvv DISTFILES= ${DISTNAME}${EXTRACT_SUFX} DIST_SUBDIR= mutt EXTRACT_ONLY= ${DISTNAME}${EXTRACT_SUFX} PATCH_SITES+= http://www.mutt.org.ua/download/mutt-${VVV_PATCH_VERSION}/:vvv \ http://www2.mutt.org.ua/download/mutt-${VVV_PATCH_VERSION}/:vvv \ - https://www.schrab.com/aaron/mutt/:ats \ + https://github.com/aschrab/mutt/compare/dev-base...feature/:ats \ http://vc.org.ua/mutt/:vc PATCH_DIST_STRIP= -p1 -PATCHFILES= patch-1.7.0.ats.date_conditional.1:ats +PATCHFILES= date-conditional.diff:ats MAINTAINER?= dereks@lifeofadishwasher.com COMMENT?= Small but powerful text based program for read/writing e-mail LICENSE= GPLv2+ CONFLICTS?= ja-mutt-[0-9]* ja-mutt-devel-[0-9]* mutt-1.4* mutt-devel-lite-[0-9]* mutt-lite-[0-9]* zh-mutt-devel-[0-9]* DOCSDIR?= ${PREFIX}/share/doc/mutt EXAMPLESDIR?= ${PREFIX}/share/examples/mutt DATADIR?= ${PREFIX}/share/mutt CONFIGURE_ENV= CC="${CC} -I${LOCALBASE}/include" CONFIGURE_ARGS= --disable-fcntl --with-ssl=${OPENSSLBASE} \ --with-docdir=${DOCSDIR} --sysconfdir=${PREFIX}/etc \ --enable-external-dotlock --enable-pop --enable-imap \ --enable-compressed USES+= cpe shebangfix ssl SHEBANG_FILES= doc/gen-map-doc smime_keys.pl contrib/smime_keys_test.pl .if defined(MUTT_CONFIGURE_ARGS) CONFIGURE_ARGS+= ${MUTT_CONFIGURE_ARGS} .endif USES+= autoreconf GNU_CONFIGURE= yes AUTOMAKE_ARGS= --add-missing --foreign OPTIONS_SUB= yes .if defined (MUTT_LITE) OPTIONS_EXCLUDE= NLS DOCS EXAMPLES .else OPTIONS_DEFINE= SASL DEBUG DOCS EXAMPLES FLOCK \ FORCEBASE64 GPGME GREETING_PATCH HTML ICONV IDN IFDEF_PATCH \ LOCALES_FIX MAILBOX_MANPAGES MAILDIR_MTIME_PATCH \ NLS NNTP PARENT_CHILD_MATCH_PATCH QUOTE_PATCH \ REVERSE_REPLY_PATCH SIDEBAR SMART_DATE SMIME_OUTLOOK_COMPAT \ SMTP URLVIEW XML OPTIONS_SINGLE= GSSAPI HCACHE SCREEN OPTIONS_RADIO= SPELL OPTIONS_RADIO_SPELL= ASPELL ISPELL OPTIONS_SINGLE_GSSAPI= GSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE OPTIONS_SINGLE_HCACHE= HCACHE_BDB HCACHE_TOKYOCABINET HCACHE_KYOTOCABINET HCACHE_NONE OPTIONS_SINGLE_SCREEN= NCURSES SLANG SASL_DESC= SASL authentication DEBUG_DESC= Debugging capabilities FLOCK_DESC= flock() usage FORCEBASE64_DESC= Option to force base64 encoding for compose GPGME_DESC= Gpgme interface GREETING_PATCH_DESC= Greeting support HTML_DESC= HTML documentation IDN_DESC= International Domain Names (implies ICONV) IFDEF_PATCH_DESC= ifdef feature LOCALES_FIX_DESC= Locales fix MAILBOX_MANPAGES_DESC= Install mbox.5/mmdf.5 manpages MAILDIR_MTIME_PATCH_DESC= Maildir mtime patch NCURSES_DESC= Ncurses support NLS_DESC= Native language support (implies ICONV) PARENT_CHILD_MATCH_PATCH_DESC= Parent/child match QUOTE_PATCH_DESC= Extended quoting REVERSE_REPLY_PATCH_DESC= Reverse_reply SIDEBAR_DESC= Sidebar support SLANG_DESC= SLANG support SMART_DATE_DESC= Dynamic date formatting with "%@" SMIME_OUTLOOK_COMPAT_DESC= SMIME outlook compatibility SMTP_DESC= SMTP relay support HCACHE_DESC= Header Cache support HCACHE_BDB_DESC= Use Berkeley DB (BDB) HCACHE_TOKYOCABINET_DESC= Use Tokyo Cabinet HCACHE_KYOTOCABINET_DESC= Use Kyoto Cabinet HCACHE_NONE_DESC= Disable Header Cache URLVIEW_DESC= Use urlview for the URL selector menu XML_DESC= Use XML tools for rebuilding documentation OPTIONS_DEFAULT= GPGME HTML HCACHE_BDB ICONV IDN \ IFDEF_PATCH LOCALES_FIX MAILBOX_MANPAGES MAILDIR_MTIME_PATCH \ NLS NCURSES PARENT_CHILD_MATCH_PATCH QUOTE_PATCH \ REVERSE_REPLY_PATCH SMART_DATE SMIME_OUTLOOK_COMPAT SASL SMTP \ URLVIEW XML GSSAPI_NONE .endif RUN_DEPENDS+= ${LOCALBASE}/etc/mime.types:misc/mime-support .if !defined (MUTT_LITE) ASPELL_BUILD_DEPENDS= aspell:textproc/aspell ASPELL_RUN_DEPENDS= aspell:textproc/aspell ISPELL_BUILD_DEPENDS= ispell:textproc/aspell-ispell ISPELL_RUN_DEPENDS= ispell:textproc/aspell-ispell URLVIEW_RUN_DEPENDS= urlview:textproc/urlview .endif .if defined (MUTT_LITE) PKGNAMESUFFIX= -lite USES+= ncurses PLIST_SUB+= MAILBOX_MANPAGES="" PLIST_SUB+= HTML="@comment " PLIST_SUB+= NNTP="@comment " # XXX bug in bpm ? PLIST_SUB+= NLS="@comment " CONFIGURE_ARGS+= --disable-nls --disable-iconv --without-idn .endif .ifmake makesum # for optional distfiles patchfiles PORT_DBDIR= /dev/null OPTIONS_DEFAULT= ${OPTIONS_DEFINE} .endif DEBUG_CONFIGURE_ON= --enable-debug # Handle ncurses/ncurses-port/slang SLANG_CONFIGURE_ON= --with-slang=${LOCALBASE} SLANG_LIB_DEPENDS= libslang.so:devel/libslang2 SLANG_VARS= PKGMESSAGE=${FILESDIR}/pkg-message.slang NCURSES_USES= ncurses NLS_USES= gettext NLS_CONFIGURE_ENABLE= nls NLS_IMPLIES= ICONV # Handle GSSAPI from various places GSSAPI_BASE_USES= gssapi GSSAPI_BASE_CONFIGURE_ON= --with-gss=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS} GSSAPI_HEIMDAL_USES= gssapi:heimdal GSSAPI_HEIMDAL_CONFIGURE_ON= --with-gss=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS} GSSAPI_MIT_USES= gssapi:mit GSSAPI_MIT_CONFIGURE_ON= --with-gss=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS} GSSAPI_NONE_CONFIGURE_ON= --without-gss HCACHE_NONE_CONFIGURE_ON= --disable-hcache HCACHE_NONE_CONFIGURE_OFF= --enable-hcache --without-qdbm --without-gdbm HCACHE_BDB_CONFIGURE_WITH= bdb HCACHE_BDB_USES= bdb:42+ HCACHE_TOKYOCABINET_CONFIGURE_WITH= tokyocabinet HCACHE_TOKYOCABINET_LIB_DEPENDS= libtokyocabinet.so:databases/tokyocabinet HCACHE_KYOTOCABINET_CONFIGURE_WITH= kyotocabinet HCACHE_KYOTOCABINET_LIB_DEPENDS= libkyotocabinet.so:databases/kyotocabinet ICONV_USES= iconv:translit ICONV_CONFIGURE_ON= ${ICONV_CONFIGURE_ARG} ICONV_CONFIGURE_OFF= --disable-iconv ASPELL_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-aspell PARENT_CHILD_MATCH_PATCH_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-parent-child-match REVERSE_REPLY_PATCH_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-reverse_reply SASL_LIB_DEPENDS= libsasl2.so:security/cyrus-sasl2 SASL_CONFIGURE_ON= --with-sasl=${LOCALBASE} SMIME_OUTLOOK_COMPAT_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-smime-outlook SMART_DATE_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-smartdate FLOCK_CONFIGURE_ENABLE= flock LOCALES_FIX_CONFIGURE_ON= --enable-locales-fix IDN_LIB_DEPENDS= libidn.so:dns/libidn IDN_CONFIGURE_WITH= idn IDN_IMPLIES= ICONV +IFDEF_PATCH_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-ifdef + GPGME_LIB_DEPENDS+= libgpgme.so:security/gpgme GPGME_LIB_DEPENDS+= libgpg-error.so:security/libgpg-error GPGME_LIB_DEPENDS+= libassuan.so:security/libassuan GPGME_CONFIGURE_ENABLE= gpgme SMTP_CONFIGURE_ENABLE= smtp GREETING_PATCH_PATCHFILES= mutt-${GREETING_PATCH_VERSION}.vc.greeting:vc QUOTE_PATCH_PATCHFILES= patch-${VVV_PATCH_VERSION}.vvv.initials.gz:vvv \ patch-${VVV_PATCH_VERSION}.vvv.quote.gz:vvv NNTP_DISTFILES= patch-${VVV_PATCH_VERSION}.vvv.nntp.gz:vvv \ patch-${VVV_PATCH_VERSION}.vvv.nntp_ru.gz:vvv NNTP_CONFIGURE_ON= --enable-nntp NNTP_VARS= XML_NEEDED=yes NNTP_CATEGORIES= news SIDEBAR_CONFIGURE_ENABLE= sidebar DOCS_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-doc-ref .include # un/comment as each VERSION is created for PORTVERSION -#VVV_PATCH_VERSION= 1.8.0 -#GREETING_PATCH_VERSION= 1.8.1 +VVV_PATCH_VERSION= 1.8.2 +#GREETING_PATCH_VERSION= 1.8.3 .if !defined(VVV_PATCH_VERSION) VVV_PATCH_VERSION= ${PORTVERSION} .endif .if !defined(GREETING_PATCH_VERSION) GREETING_PATCH_VERSION= ${PORTVERSION} .endif # XXX # this should be done automagically by aclocal but .... # for now, this will have to do pre-build:: @${REINPLACE_CMD} -E -e "s|^(ACLOCAL = ).+|\1${ACLOCAL}|" \ -e "s|^(AUTOCONF = ).+|\1${AUTOCONF}|" \ -e "s|^(AUTOMAKE = ).+|\1${AUTOMAKE}|" \ -e "s|^(AUTOHEADER = ).+|\1${AUTOHEADER}|" \ ${BUILD_WRKSRC}/Makefile LDFLAGS+= -L${LOCALBASE}/lib -Wl,-rpath=${LOCALBASE}/lib:/usr/lib -ltinfow CFLAGS+= ${CFLAGS_ADD} LDFLAGS+= ${LDFLAGS_ADD} pre-patch-NNTP-on: @${GUNZIP_CMD} -c ${DISTDIR}/${DIST_SUBDIR}/patch-${VVV_PATCH_VERSION}.vvv.nntp.gz > ${WRKDIR}/patch-nntp @${REINPLACE_CMD} -E '/^diff.*\/doc\/manual.txt$$/,/^diff/d' \ ${WRKDIR}/patch-nntp @${PATCH} -d ${PATCH_WRKSRC} ${PATCH_ARGS} -p1 < ${WRKDIR}/patch-nntp post-patch-NNTP-on: .if ${PORT_OPTIONS:MMAILDIR_MTIME_PATCH} @${PATCH} -d ${PATCH_WRKSRC} ${PATCH_ARGS} -p1 < ${PATCHDIR}/extra-patch-maildir-mtime-nntp .endif .if ${PORT_OPTIONS:MFORCEBASE64} @${PATCH} -d ${PATCH_WRKSRC} ${PATCH_ARGS} -p1 < ${PATCHDIR}/extra-patch-forcebase64-nntp .endif post-patch-NNTP-off: .if ${PORT_OPTIONS:MMAILDIR_MTIME_PATCH} @${PATCH} -d ${PATCH_WRKSRC} ${PATCH_ARGS} -p1 < ${PATCHDIR}/extra-patch-maildir-mtime .endif .if ${PORT_OPTIONS:MFORCEBASE64} @${PATCH} -d ${PATCH_WRKSRC} ${PATCH_ARGS} -p1 < ${PATCHDIR}/extra-patch-forcebase64 .endif post-install: ${INSTALL_MAN} ${FILESDIR}/mailcap.5 ${STAGEDIR}${MANPREFIX}/man/man5 post-install-NNTP-on: ${INSTALL_DATA} ${WRKSRC}/ChangeLog.nntp ${STAGEDIR}${DOCSDIR} -post-patch-IFDEF_PATCH-on: - @${PATCH} -d ${PATCH_WRKSRC} ${PATCH_ARGS} -p1 < ${PATCHDIR}/extra-patch-ifdef - WRKSRC= ${WRKDIR}/${DISTNAME:S/i$//} -post-patch: +pre-configure:: @${REINPLACE_CMD} -e 's,/usr/bin/gpg,${LOCALBASE}/bin/gpg,g' \ ${WRKSRC}/contrib/gpg.rc @${REINPLACE_CMD} -e 's,pgp6,pgp,g' \ ${WRKSRC}/contrib/pgp6.rc @${REINPLACE_CMD} -E -e 's#(/samples|samples/)#share/examples/mutt#g' \ ${WRKSRC}/doc/reference.html \ ${WRKSRC}/doc/manual.html \ ${WRKSRC}/doc/manual.txt \ ${WRKSRC}/doc/Muttrc \ ${WRKSRC}/INSTALL \ ${WRKSRC}/init.h @${REINPLACE_CMD} -e 's#$$(docdir)/samples#${EXAMPLESDIR}#g' \ ${WRKSRC}/contrib/Makefile.am pre-configure:: @${RM} ${WRKSRC}/missing .if defined(WITH_KRB5_SYS) @${ECHO_CMD} "#define HAVE_HEIMDAL" >> ${WRKSRC}/config.h.in @${REINPLACE_CMD} -e 's|||' \ ${WRKSRC}/imap/auth_gss.c .endif pre-configure-HCACHE_BDB-on: @${REINPLACE_CMD} -E -e 's/BDB_VERSIONS="/&${BDB_LIB_NAME} db${BDB_VER} /' \ ${CONFIGURE_WRKSRC}/${CONFIGURE_SCRIPT}.ac .if defined (XML_NEEDED) && ${PORT_OPTIONS:MXML} BUILD_DEPENDS+= xsltproc:textproc/libxslt \ ${LOCALBASE}/share/xsl/docbook/html/docbook.xsl:textproc/docbook-xsl \ lynx:www/lynx .else pre-build:: @${REINPLACE_CMD} -E -e 's|-xsltproc|@-true xsltproc|g' \ ${WRKSRC}/doc/Makefile .endif .include Index: head/mail/mutt/distinfo =================================================================== --- head/mail/mutt/distinfo (revision 443854) +++ head/mail/mutt/distinfo (revision 443855) @@ -1,15 +1,15 @@ -TIMESTAMP = 1494678618 -SHA256 (mutt/mutt-1.8.2.tar.gz) = 1d057bf1b565f2c38ee50c9a661654cbbe4165f98e25bfa361ebbd707d96f235 -SIZE (mutt/mutt-1.8.2.tar.gz) = 4118429 +TIMESTAMP = 1496461712 +SHA256 (mutt/mutt-1.8.3.tar.gz) = 9b81746d67ffeca5ea44f60893b70dc93c86d4bc10187d4dd360185e4d42ed42 +SIZE (mutt/mutt-1.8.3.tar.gz) = 4122012 SHA256 (mutt/patch-1.8.2.vvv.nntp.gz) = 940cf7fd4fbea39f48bd5594180a7be5c3cc6714d62eeb3f2e5fbc0ab4b3545b SIZE (mutt/patch-1.8.2.vvv.nntp.gz) = 60675 SHA256 (mutt/patch-1.8.2.vvv.nntp_ru.gz) = c85a288ed6864c311cbc70b31bab9f0d0d1051846becb5e8fe737609fd939a9c SIZE (mutt/patch-1.8.2.vvv.nntp_ru.gz) = 3465 -SHA256 (mutt/patch-1.7.0.ats.date_conditional.1) = a7f65e0b6e59713582b3b0a1c3d3c0e54e5875f5dfe3bda285e51a5b6d96e14e -SIZE (mutt/patch-1.7.0.ats.date_conditional.1) = 2415 -SHA256 (mutt/mutt-1.8.2.vc.greeting) = 73113eb0a3eb761755315ab03c0b6bcb316c09603461a1f8a3f54bd870a576cc -SIZE (mutt/mutt-1.8.2.vc.greeting) = 4499 +SHA256 (mutt/date-conditional.diff) = 8936c5fe7a2a62a68f2a8d001c7a6dddf138c48186a338482b6639507ba9133e +SIZE (mutt/date-conditional.diff) = 2023 +SHA256 (mutt/mutt-1.8.3.vc.greeting) = 73113eb0a3eb761755315ab03c0b6bcb316c09603461a1f8a3f54bd870a576cc +SIZE (mutt/mutt-1.8.3.vc.greeting) = 4499 SHA256 (mutt/patch-1.8.2.vvv.initials.gz) = e929c863dd012624b2ac724cd296f346374cd2522f256020fa458e94890ca750 SIZE (mutt/patch-1.8.2.vvv.initials.gz) = 686 SHA256 (mutt/patch-1.8.2.vvv.quote.gz) = 03b1aa4aa9152b968fc1709e68207073df62b9b1a5da43ff1d680d6dfe17fe35 SIZE (mutt/patch-1.8.2.vvv.quote.gz) = 1282 Index: head/mail/mutt/files/extra-patch-ifdef =================================================================== --- head/mail/mutt/files/extra-patch-ifdef (revision 443854) +++ head/mail/mutt/files/extra-patch-ifdef (revision 443855) @@ -1,77 +1,77 @@ ---- PATCHES.orig 2017-04-12 23:01:05 UTC +--- PATCHES.orig 2017-06-03 23:06:11 UTC +++ PATCHES @@ -0,0 +1 @@ +patch-1.5.4.cd.ifdef.1 ---- init.c.orig 2017-04-12 23:01:17 UTC +--- init.c.orig 2017-05-30 19:27:52 UTC +++ init.c @@ -656,6 +656,52 @@ static mbchar_table *parse_mbchar_table return t; } +static int parse_ifdef (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err) +{ + int i, j, res = 0; + BUFFER token; + + memset (&token, 0, sizeof (token)); + mutt_extract_token (tmp, s, 0); + + /* is the item defined as a variable or a function? */ + if (!(res = (mutt_option_index (tmp->data) != -1))) + for (i = 0; !res && i < MENU_MAX; i++) + { + struct binding_t *b = km_get_table (Menus[i].value); + + if (!b) + continue; + + for (j = 0; b[j].name; j++) + if (!ascii_strncasecmp (tmp->data, b[j].name, mutt_strlen (tmp->data)) + && (mutt_strlen (b[j].name) == mutt_strlen (tmp->data))) + { + res = 1; + break; + } + } + + if (!MoreArgs (s)) + { + snprintf (err->data, err->dsize, _("ifdef: too few arguments")); + return (-1); + } + mutt_extract_token (tmp, s, MUTT_TOKEN_SPACE); + + if (res) + { + if (mutt_parse_rc_line (tmp->data, &token, err) == -1) + { + mutt_error ("Erreur: %s", err->data); + FREE (&token.data); + return (-1); + } + FREE (&token.data); + } + return 0; +} + static int parse_unignore (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err) { do ---- init.h.orig 2017-04-12 23:01:17 UTC +--- init.h.orig 2017-06-03 23:06:11 UTC +++ init.h -@@ -3889,6 +3889,7 @@ static int parse_lists (BUFFER *, BUFFER +@@ -3904,6 +3904,7 @@ static int parse_lists (BUFFER *, BUFFER static int parse_unlists (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_alias (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_unalias (BUFFER *, BUFFER *, unsigned long, BUFFER *); +static int parse_ifdef (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_ignore (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_unignore (BUFFER *, BUFFER *, unsigned long, BUFFER *); static int parse_source (BUFFER *, BUFFER *, unsigned long, BUFFER *); -@@ -3951,6 +3952,7 @@ const struct command_t Commands[] = { +@@ -3966,6 +3967,7 @@ const struct command_t Commands[] = { { "hdr_order", parse_list, UL &HeaderOrderList }, #ifdef HAVE_ICONV { "iconv-hook", mutt_parse_hook, MUTT_ICONVHOOK }, + { "ifdef", parse_ifdef, 0 }, #endif { "ignore", parse_ignore, 0 }, { "lists", parse_lists, 0 }, Index: head/mail/mutt/files/extra-patch-maildir-mtime =================================================================== --- head/mail/mutt/files/extra-patch-maildir-mtime (revision 443854) +++ head/mail/mutt/files/extra-patch-maildir-mtime (revision 443855) @@ -1,52 +1,52 @@ ---- PATCHES Dec 2002 17:44:54 -0000 3.6 -+++ PATCHES Feb 2004 13:19:42 -0000 +--- PATCHES.orig 2017-06-03 22:37:15 UTC ++++ PATCHES @@ -0,0 +1 @@ +patch-1.5.7.ust.maildir-mtime.2 ---- browser.c.orig Wed Jan 26 13:41:04 2005 -+++ browser.c Wed Feb 9 09:20:14 2005 -@@ -27,6 +27,7 @@ +--- browser.c.orig 2017-06-03 22:37:03 UTC ++++ browser.c +@@ -32,6 +32,7 @@ #ifdef USE_IMAP #include "imap.h" #endif +#include "mx.h" #include #include -@@ -346,6 +347,21 @@ +@@ -413,6 +414,21 @@ static void init_state (struct browser_s menu->data = state->entry; } +static void check_maildir_times (BUFFY *buf, struct stat *st) +{ + char buffer[_POSIX_PATH_MAX + SHORT_STRING]; + struct stat s; + + if(!buf || buf->magic != MUTT_MAILDIR) + return; + + snprintf (buffer, sizeof (buffer), "%s/tmp", buf->path); + if (lstat (buffer, &s) != 0) + return; + + st->st_mtime = s.st_mtime; +} + static int examine_directory (MUTTMENU *menu, struct browser_state *state, char *d, const char *prefix) { -@@ -409,6 +425,7 @@ +@@ -476,6 +492,7 @@ static int examine_directory (MUTTMENU * tmp = Incoming; while (tmp && mutt_strcmp (buffer, tmp->path)) tmp = tmp->next; + check_maildir_times (tmp, &s); if (tmp && Context && !mutt_strcmp (tmp->realpath, Context->realpath)) { -@@ -454,6 +471,7 @@ +@@ -549,6 +566,7 @@ static int examine_mailboxes (MUTTMENU * strfcpy (buffer, NONULL(tmp->path), sizeof (buffer)); mutt_pretty_mailbox (buffer, sizeof (buffer)); + check_maildir_times (tmp, &s); add_folder (menu, state, buffer, &s, tmp); } while ((tmp = tmp->next)); Index: head/mail/mutt/files/extra-patch-parent-child-match =================================================================== --- head/mail/mutt/files/extra-patch-parent-child-match (revision 443854) +++ head/mail/mutt/files/extra-patch-parent-child-match (revision 443855) @@ -1,171 +1,171 @@ ---- doc/manual.xml.head.orig 2017-02-24 18:29:36 UTC +--- doc/manual.xml.head.orig 2017-05-30 19:27:52 UTC +++ doc/manual.xml.head -@@ -4259,6 +4259,22 @@ variable all, which allow +@@ -4265,6 +4265,22 @@ variable all, which allow their system defaults. + +Parent and child match. +You can tell mutt that the following pattern has to be matched against +the parent message with < or one of its childs with >. +This example matches all mails which have at least an unread duplicate +message: + + + + + +>(~= ~N) + + + + ---- mutt.h.orig 2017-02-24 18:29:36 UTC +--- mutt.h.orig 2017-06-03 23:16:03 UTC +++ mutt.h -@@ -863,6 +863,8 @@ typedef struct pattern_t +@@ -865,6 +865,8 @@ typedef struct pattern_t unsigned int alladdr : 1; unsigned int stringmatch : 1; unsigned int groupmatch : 1; + unsigned int parentmatch : 1; + unsigned int childsmatch : 1; unsigned int ign_case : 1; /* ignore case for local stringmatch searches */ unsigned int isalias : 1; int min; ---- pattern.c.orig 2017-02-24 18:29:37 UTC +--- pattern.c.orig 2017-05-30 19:26:40 UTC +++ pattern.c @@ -46,6 +46,7 @@ static int eat_regexp (pattern_t *pat, B static int eat_date (pattern_t *pat, BUFFER *, BUFFER *); static int eat_range (pattern_t *pat, BUFFER *, BUFFER *); static int patmatch (const pattern_t *pat, const char *buf); +static int pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h, pattern_cache_t *cache); static const struct pattern_flags { @@ -781,6 +782,8 @@ pattern_t *mutt_pattern_comp (/* const * pattern_t *last = NULL; int not = 0; int alladdr = 0; + int parentmatch = 0; + int childsmatch = 0; int or = 0; int implicit = 1; /* used to detect logical AND operator */ int isalias = 0; @@ -810,6 +813,24 @@ pattern_t *mutt_pattern_comp (/* const * ps.dptr++; isalias = !isalias; break; + case '<': + ps.dptr++; + if (childsmatch) { + snprintf (err->data, err->dsize, _("cannot use both < and > as a pattern modifier")); + mutt_pattern_free (&curlist); + return NULL; + } + parentmatch = 1; + break; + case '>': + ps.dptr++; + if (parentmatch) { + snprintf (err->data, err->dsize, _("cannot use both < and > as a pattern modifier")); + mutt_pattern_free (&curlist); + return NULL; + } + childsmatch = 1; + break; case '|': if (!or) { @@ -835,6 +856,8 @@ pattern_t *mutt_pattern_comp (/* const * implicit = 0; not = 0; alladdr = 0; + parentmatch = 0; + childsmatch = 0; isalias = 0; break; case '%': @@ -865,9 +888,13 @@ pattern_t *mutt_pattern_comp (/* const * last = tmp; tmp->not ^= not; tmp->alladdr |= alladdr; + tmp->parentmatch |= parentmatch; + tmp->childsmatch |= childsmatch; tmp->isalias |= isalias; not = 0; alladdr = 0; + parentmatch = 0; + childsmatch = 0; isalias = 0; /* compile the sub-expression */ buf = mutt_substrdup (ps.dptr + 1, p); @@ -896,11 +923,15 @@ pattern_t *mutt_pattern_comp (/* const * tmp = new_pattern (); tmp->not = not; tmp->alladdr = alladdr; + tmp->parentmatch = parentmatch; + tmp->childsmatch = childsmatch; tmp->isalias = isalias; tmp->stringmatch = (*ps.dptr == '=') ? 1 : 0; tmp->groupmatch = (*ps.dptr == '%') ? 1 : 0; not = 0; alladdr = 0; + parentmatch = 0; + childsmatch = 0; isalias = 0; if (last) @@ -967,9 +998,13 @@ pattern_t *mutt_pattern_comp (/* const * last = tmp; tmp->not ^= not; tmp->alladdr |= alladdr; + tmp->parentmatch |= parentmatch; + tmp->childsmatch |= childsmatch; tmp->isalias |= isalias; not = 0; alladdr = 0; + parentmatch = 0; + childsmatch = 0; isalias = 0; ps.dptr = p + 1; /* restore location */ break; @@ -1137,6 +1172,37 @@ int mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h, pattern_cache_t *cache) { + THREAD *t; + + if (pat->parentmatch) { + if (h->thread && h->thread->parent && h->thread->parent->message) + return pattern_exec (pat, flags, ctx, h->thread->parent->message, cache); + else + return pat->not; + } + if (pat->childsmatch) { + if (!h->thread) + return pat->not; + if (!h->thread->child) + return pat->not; + t = h->thread->child; + while (t->prev) + t = t->prev; + for (; t; t = t->next) { + if (!t->message) + continue; + if (pattern_exec (pat, flags, ctx, t->message, cache)) + return !pat->not; + } + return pat->not; + } + return pattern_exec (pat, flags, ctx, h, cache); +} + +static int +pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, HEADER *h, + pattern_cache_t *cache) +{ int result; int *cache_entry; Index: head/mail/mutt/files/extra-patch-reverse_reply =================================================================== --- head/mail/mutt/files/extra-patch-reverse_reply (revision 443854) +++ head/mail/mutt/files/extra-patch-reverse_reply (revision 443855) @@ -1,91 +1,91 @@ ---- PATCHES.orig 2017-04-12 23:01:05 UTC +--- PATCHES.orig 2017-06-03 23:21:18 UTC +++ PATCHES @@ -0,0 +1 @@ +patch-1.5.6.cb.reverse_reply.2 ---- init.h.orig 2017-04-12 23:01:17 UTC +--- init.h.orig 2017-06-03 23:21:18 UTC +++ init.h -@@ -2575,6 +2575,13 @@ struct option_t MuttVars[] = { +@@ -2588,6 +2588,13 @@ struct option_t MuttVars[] = { ** possibly including eventual real names. When it is \fIunset\fP, mutt will ** override any such real names with the setting of the $$realname variable. */ + { "reverse_reply", DT_BOOL, R_NONE, OPTREVREPLY, 0 }, + /* + ** .pp + ** When set, this variable uses the name from your aliases in the To and Cc + ** headers of reply mails you send, like $reverse_alias does in the index. + ** When unset, the headers taken from the original mail are left unchanged. + */ { "rfc2047_parameters", DT_BOOL, R_NONE, OPTRFC2047PARAMS, 0 }, /* ** .pp ---- mutt.h.orig 2017-04-12 23:01:17 UTC +--- mutt.h.orig 2017-06-03 23:21:23 UTC +++ mutt.h -@@ -438,6 +438,7 @@ enum +@@ -440,6 +440,7 @@ enum OPTREVALIAS, OPTREVNAME, OPTREVREAL, + OPTREVREPLY, OPTRFC2047PARAMS, OPTSAVEADDRESS, OPTSAVEEMPTY, ---- protos.h.orig 2017-04-12 23:01:17 UTC +--- protos.h.orig 2017-05-30 19:27:53 UTC +++ protos.h @@ -93,6 +93,7 @@ ADDRESS *mutt_get_address (ENVELOPE *, c ADDRESS *mutt_lookup_alias (const char *s); ADDRESS *mutt_remove_duplicates (ADDRESS *); ADDRESS *mutt_remove_xrefs (ADDRESS *, ADDRESS *); +ADDRESS *mutt_reverse_address (ADDRESS *); ADDRESS *mutt_expand_aliases (ADDRESS *); ADDRESS *mutt_parse_adrlist (ADDRESS *, const char *); ---- send.c.orig 2017-04-12 23:01:07 UTC +--- send.c.orig 2017-05-30 19:27:53 UTC +++ send.c @@ -585,6 +585,10 @@ void mutt_fix_reply_recipients (ENVELOPE /* the CC field can get cluttered, especially with lists */ env->to = mutt_remove_duplicates (env->to); env->cc = mutt_remove_duplicates (env->cc); + if (option (OPTREVREPLY)){ + env->to = mutt_reverse_address (env->to); + env->cc = mutt_reverse_address (env->cc); + } env->cc = mutt_remove_xrefs (env->to, env->cc); if (env->cc && !env->to) ---- sendlib.c.orig 2017-04-12 23:01:08 UTC +--- sendlib.c.orig 2017-05-30 19:27:53 UTC +++ sendlib.c @@ -2714,6 +2714,35 @@ static void set_noconv_flags (BODY *b, s } } +/* given a list of addresses, return a list of reverse_alias'ed addresses */ +ADDRESS *mutt_reverse_address (ADDRESS *addr) +{ + ADDRESS *top,*tmp,*alias; + + if (addr == NULL) + return NULL; + + if ((alias = alias_reverse_lookup (addr)) && alias->personal) { + tmp = rfc822_cpy_adr_real(alias); + tmp->next = addr->next; + addr->next = NULL; + rfc822_free_address(&addr); + addr = tmp; + } + + for (top = addr; top->next != NULL; top = tmp) { + tmp = top->next; + if ((alias = alias_reverse_lookup (tmp)) && alias->personal) { + top->next = rfc822_cpy_adr_real(alias); + top->next->next = tmp->next; + tmp->next = NULL; + rfc822_free_address(&tmp); + tmp = top->next; + } + } + return addr; +} + int mutt_write_fcc (const char *path, HEADER *hdr, const char *msgid, int post, char *fcc) { CONTEXT f; Index: head/mail/mutt/files/extra-patch-smartdate =================================================================== --- head/mail/mutt/files/extra-patch-smartdate (revision 443854) +++ head/mail/mutt/files/extra-patch-smartdate (revision 443855) @@ -1,126 +1,126 @@ ---- hdrline.c.orig 2017-02-24 18:29:36 UTC +--- hdrline.c.orig 2017-06-03 23:31:21 UTC +++ hdrline.c -@@ -248,6 +248,89 @@ static char *apply_subject_mods (ENVELOP +@@ -249,6 +249,89 @@ static char *apply_subject_mods (ENVELOP * %Y = `x-label:' field (if present, tree unfolded, and != parent's x-label) * %Z = status flags */ +static void +format_smartdate( char *buf, size_t max, struct tm *tm, smartdate_type type ) +{ + char *strftime_fmt = NULL; + + switch( type ) { + case FUTURE: /* Date in the future */ + strftime_fmt = "%d%h%y!"; + break; + case SMARTTIME: /* Today */ + strftime_fmt = "%I:%M %p"; + break; + case YESTERDAY: /* Yesterday */ + strncpy( buf, "Yesterday", max ); + break; + case WEEKDAY: /* Within the last 7 days */ + strftime_fmt = "%A"; + break; + case STANDARD: /* Within the last six months */ + strftime_fmt = "%h %d"; + break; + case ANCIENT: /* Older than 6 months */ + strftime_fmt = "%h %Y"; + break; + } + + if( strftime_fmt != NULL ) { + strftime( buf, max, strftime_fmt, tm ); + } +} + +static void +smartdate( char *buf, size_t max, struct tm *tm ) +{ + smartdate_type type = 0; + + struct tm now; + + time_t sse = mktime( tm ); /* Seconds since epoch */ + time_t sse_now = time(NULL); /* Seconds since epoch until now */ + + int dse = 0; /* Days since epoch */ + int dse_now = 0; /* Days since epoch until today */ + + /* Calculate the number of days since epoch */ + dse = sse / (60*60*24); + dse_now = sse_now / (60*60*24); + + /* Default display type */ + type = STANDARD; + + /* Check if the date is in the future */ + if( dse > dse_now ) { + type = FUTURE; + } + else { + int diff = dse_now - dse; + if( diff == 0 ) type = SMARTTIME; + else if( diff == 1 ) type = YESTERDAY; + else if( diff < 7 ) type = WEEKDAY; + else if( diff > 215 ) type = ANCIENT; /* Surely older than six + months */ + else if( diff > 180 ) { + /* + * Slightly heavy calculation to check if the date is more + * than six months in the past. This calculation uses + * calendar months and not the exact number of days. So, + * January 31, 2003 would be considered more than six months + * old whether today's date is August 1 or August 31, 2003 + */ + int monthdiff; + localtime_r( &sse_now, &now ); + monthdiff = ( now.tm_mon - tm->tm_mon ) + + ( ( now.tm_year - tm->tm_year ) * 12 ); + if( monthdiff > 6 ) { + type = ANCIENT; + } + } + } + + format_smartdate( buf, max, tm, type ); +} + static const char * hdr_format_str (char *dest, size_t destlen, -@@ -421,7 +504,13 @@ hdr_format_str (char *dest, +@@ -469,7 +552,13 @@ hdr_format_str (char *dest, if (!do_locales) setlocale (LC_TIME, "C"); - strftime (buf2, sizeof (buf2), dest, tm); + /* Identify the non-strftime smartdate pattern (%@) */ + if( strncmp( dest, "%@", 2 ) == 0 ) { + smartdate( buf2, sizeof( buf2 ), tm ); + } + else { + strftime (buf2, sizeof (buf2), dest, tm); + } if (!do_locales) setlocale (LC_TIME, ""); ---- mutt.h.orig 2017-02-24 18:29:36 UTC +--- mutt.h.orig 2017-05-30 19:27:53 UTC +++ mutt.h @@ -134,6 +134,16 @@ typedef enum MUTT_FORMAT_NOFILTER = (1<<7) /* do not allow filtering on this pass */ } format_flag; +/* flags for SmartDate */ +typedef enum { + FUTURE = 1, + SMARTTIME = 2, + YESTERDAY = 3, + WEEKDAY = 4, + STANDARD = 5, + ANCIENT = 6 +} smartdate_type; + /* types for mutt_add_hook() */ #define MUTT_FOLDERHOOK 1 #define MUTT_MBOXHOOK (1<<1) Index: head/mail/mutt/files/extra-patch-smime-outlook =================================================================== --- head/mail/mutt/files/extra-patch-smime-outlook (revision 443854) +++ head/mail/mutt/files/extra-patch-smime-outlook (revision 443855) @@ -1,11 +1,11 @@ ---- crypt.c.orig Fri Mar 7 09:23:44 2003 -+++ crypt.c Fri Mar 21 00:06:48 2003 -@@ -440,7 +440,7 @@ +--- crypt.c.orig 2017-05-30 19:27:52 UTC ++++ crypt.c +@@ -491,7 +491,7 @@ int mutt_is_application_smime (BODY *m) { len++; if (!ascii_strcasecmp ((t+len), "p7m")) -#if 0 +#if 1 return SMIMEENCRYPT; #else /* Not sure if this is the correct thing to do, but Index: head/mail/mutt/files/patch-dgc-deepif =================================================================== --- head/mail/mutt/files/patch-dgc-deepif (revision 443854) +++ head/mail/mutt/files/patch-dgc-deepif (revision 443855) @@ -1,30 +1,30 @@ ---- muttlib.c.orig 2017-04-19 01:05:29 UTC +--- muttlib.c.orig 2017-06-03 02:20:37 UTC +++ muttlib.c -@@ -1369,6 +1369,12 @@ +@@ -1378,6 +1378,12 @@ void mutt_FormatString (char *dest, /* count = 0; while (count < sizeof (ifstring) && *src && *src != '?' && *src != '&') { + if (*src == '\\') + { + src++; + if (!*src) + break; + } *cp++ = *src++; count++; } -@@ -1381,7 +1387,13 @@ +@@ -1390,7 +1396,13 @@ void mutt_FormatString (char *dest, /* count = 0; while (count < sizeof (elsestring) && *src && *src != '?') { - *cp++ = *src++; + if (*src == '\\') + { + src++; + if (!*src) + break; + } + *cp++ = *src++; count++; } *cp = 0; Index: head/mail/mutt/files/patch-smime-self =================================================================== --- head/mail/mutt/files/patch-smime-self (revision 443854) +++ head/mail/mutt/files/patch-smime-self (revision 443855) @@ -1,63 +1,63 @@ ---- contrib/smime.rc.orig 2016-10-08 19:30:21 UTC +--- contrib/smime.rc.orig 2017-05-30 19:26:40 UTC +++ contrib/smime.rc @@ -23,8 +23,12 @@ set crypt_verify_sig = yes # The (default) keyfile for signing/decrypting. Uncomment the following # line and replace the keyid with your own. -set smime_default_key="12345678.0" +# set smime_default_key="12345678.0" +# Uncomment the following line in addition to the one above, if you want that +# all encrypted messages are also encrypted with your default key. +# set smime_encrypt_self = yes + # Uncomment to make mutt ask what key to use when trying to decrypt a message. # It will use the default key above (if that was set) else. # unset smime_decrypt_use_default_key ---- crypt.c.orig 2016-10-08 19:35:50 UTC +--- crypt.c.orig 2017-06-04 00:05:52 UTC +++ crypt.c @@ -229,8 +229,18 @@ int mutt_protect (HEADER *msg, char *key if ((WithCrypto & APPLICATION_SMIME) && (msg->security & APPLICATION_SMIME)) { - if (!(tmp_pbody = crypt_smime_build_smime_entity (tmp_smime_pbody, - keylist))) + char *new_keylist = keylist; + + if (SmimeDefaultKey && query_quadoption(OPT_SMIMEENCRYPTSELF, _("Encrypt message to S/MIME Default Key also?")) == MUTT_YES) + { + int size = mutt_strlen(keylist) + mutt_strlen (SmimeDefaultKey) + 2; /* +1 for NULL, +1 for \n */ + new_keylist = safe_malloc(size); + snprintf(new_keylist, size, "%s%s\n", keylist, SmimeDefaultKey); + } + + tmp_pbody = crypt_smime_build_smime_entity (tmp_smime_pbody, new_keylist); + safe_free((void **)&new_keylist); + if (!tmp_pbody) { /* signed ? free it! */ return (-1); ---- init.h.orig 2016-10-08 19:35:50 UTC +--- init.h.orig 2017-06-04 00:05:52 UTC +++ init.h -@@ -2997,6 +2997,11 @@ struct option_t MuttVars[] = { +@@ -3017,6 +3017,11 @@ struct option_t MuttVars[] = { ** possible \fCprintf(3)\fP-like sequences. ** (S/MIME only) */ + { "smime_encrypt_self", DT_QUAD, R_NONE, OPT_SMIMEENCRYPTSELF, 1 }, + /* + ** .pp + ** Encrypt the message to smime_default_key too. + */ { "smime_encrypt_with", DT_STR, R_NONE, UL &SmimeCryptAlg, UL "aes256" }, /* ** .pp ---- mutt.h.orig 2016-10-08 19:30:21 UTC +--- mutt.h.orig 2017-06-04 00:05:52 UTC +++ mutt.h -@@ -274,6 +274,7 @@ enum +@@ -284,6 +284,7 @@ enum OPT_FORWEDIT, OPT_FCCATTACH, OPT_INCLUDE, + OPT_SMIMEENCRYPTSELF, OPT_MFUPTO, OPT_MIMEFWD, OPT_MIMEFWDREST, Index: head/mail/mutt/files/patch-smime-sender =================================================================== --- head/mail/mutt/files/patch-smime-sender (revision 443854) +++ head/mail/mutt/files/patch-smime-sender (revision 443855) @@ -1,53 +1,53 @@ ---- commands.c.orig 2017-04-12 23:01:17 UTC +--- commands.c.orig 2017-05-30 19:27:52 UTC +++ commands.c @@ -185,7 +185,7 @@ int mutt_display_message (HEADER *cur) { if (cur->security & GOODSIGN) { - if (!crypt_smime_verify_sender(cur)) + if (option(OPTSMIMENOSENDER) || !crypt_smime_verify_sender(cur)) mutt_message ( _("S/MIME signature successfully verified.")); else mutt_error ( _("S/MIME certificate owner does not match sender.")); ---- contrib/smime.rc.orig 2017-04-12 23:01:05 UTC +--- contrib/smime.rc.orig 2017-06-04 00:06:24 UTC +++ contrib/smime.rc @@ -8,7 +8,10 @@ set smime_is_default # Uncomment this if you don't want to set labels for certificates you add. # unset smime_ask_cert_label - + +# Uncomment this if you don't want to check for sender's email address +# set smime_dont_check_sender = yes + # Passphrase expiration set smime_timeout=300 ---- init.h.orig 2017-04-12 23:01:17 UTC +--- init.h.orig 2017-06-04 00:06:24 UTC +++ init.h -@@ -2980,6 +2980,15 @@ struct option_t MuttVars[] = { +@@ -3000,6 +3000,15 @@ struct option_t MuttVars[] = { ** to determine the key to use. It will ask you to supply a key, if it can't find one. ** (S/MIME only) */ + { "smime_dont_check_sender", DT_BOOL, R_NONE, OPTSMIMENOSENDER, 0 }, + /* + ** .pp + ** This flag controls wether you want the skip the check for the sender's + ** email address against the email address stored in the certificate. + ** This can be useful if most of your email senders use SMIMEv3 which no + ** longer needs email-addresses as part of the certificates. + ** It is not set by default. + */ { "smime_sign_as", DT_SYN, R_NONE, UL "smime_default_key", 0 }, { "smime_default_key", DT_STR, R_NONE, UL &SmimeDefaultKey, 0 }, /* ---- mutt.h.orig 2017-04-12 23:01:17 UTC +--- mutt.h.orig 2017-06-04 00:06:24 UTC +++ mutt.h -@@ -499,6 +499,7 @@ enum +@@ -513,6 +513,7 @@ enum OPTCRYPTTIMESTAMP, OPTSMIMEISDEFAULT, OPTASKCERTLABEL, + OPTSMIMENOSENDER, OPTSDEFAULTDECRYPTKEY, OPTPGPIGNORESUB, OPTPGPCHECKEXIT, Index: head/mail/mutt/files/patch-threadcomplete =================================================================== --- head/mail/mutt/files/patch-threadcomplete (revision 443854) +++ head/mail/mutt/files/patch-threadcomplete (revision 443855) @@ -1,37 +1,37 @@ ---- mutt.h.orig 2017-02-27 01:20:29 UTC +--- mutt.h.orig 2017-06-03 22:52:35 UTC +++ mutt.h -@@ -201,6 +201,7 @@ enum +@@ -211,6 +211,7 @@ enum MUTT_EXPIRED, MUTT_SUPERSEDED, MUTT_TRASH, + MUTT_THREADCOMPLETE, /* actions for mutt_pattern_comp/mutt_pattern_exec */ MUTT_AND, ---- pattern.c.orig 2017-02-27 01:20:06 UTC +--- pattern.c.orig 2017-06-03 22:52:35 UTC +++ pattern.c -@@ -56,6 +56,7 @@ static const struct pattern_flags +@@ -57,6 +57,7 @@ static const struct pattern_flags } Flags[] = { + { 'a', MUTT_THREADCOMPLETE, 0, NULL }, { 'A', MUTT_ALL, 0, NULL }, { 'b', MUTT_BODY, MUTT_FULL_MSG, eat_regexp }, { 'B', MUTT_WHOLE_MSG, MUTT_FULL_MSG, eat_regexp }, -@@ -1236,6 +1237,16 @@ mutt_pattern_exec (struct pattern_t *pat +@@ -1302,6 +1303,16 @@ pattern_exec (struct pattern_t *pat, pat else result = mutt_is_list_cc (pat->alladdr, h->env->to, h->env->cc); return (pat->not ^ result); + case MUTT_THREADCOMPLETE: + { static pattern_t tmp; + static short pattern_set = 0; + if(! pattern_set) { + memset (&tmp, 0, sizeof (tmp)); + tmp.op = MUTT_TAG; + pattern_set = 1; + } + return (pat->not ^ (h->env && match_threadcomplete(&tmp, flags, ctx, h->thread, 1, 1, 1, 1))); + } case MUTT_SUBSCRIBED_LIST: if (cache) {