ports/71103: maintainer-update of mail/mutt-devel

Udo Schweigert ust at cert.siemens.de
Sun Aug 29 13:00:39 UTC 2004


>Number:         71103
>Category:       ports
>Synopsis:       maintainer-update of mail/mutt-devel
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Sun Aug 29 13:00:38 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Udo Schweigert
>Release:        FreeBSD 4.10-STABLE i386
>Organization:
>Environment:

>Description:

Maintainer update of mail/mutt-devel:

	- Change the default from WITH_MUTT_NCURSES to WITH_MUTT_SLANG to be in
	  sync with mail/mutt.
	- Update the maildir header cache to the current version.
	- Update the threadcomplete patch (including some documentation on it).
	- Beautify the documentation in some cases.
	- Correct the note how to get SLANG working.
	- Bump PORTREVISION.

Dear committer: 

(1) cvs add files/patch-doc-manual.sgml.head

(2) The following entry to /usr/ports/UPDATING would be nice:

20040829:
  AFFECTS: users of mail/mutt-devel
  AUTHOR: udo.schweigert at siemens.com

  The defaults of the port have been changed from WITH_MUTT_NCURSES to
  WITH_MUTT_SLANG to be in sync with the mail/mutt port. If you really have
  problems with slang (which should be a very rare case) be sure to have set
  COLORTERM=yes and COLORFGBG="color1;color2" in your environment, or recompile
  the port with the WITH_MUTT_NCURSES knob set (e.g. by adding
  WITH_MUTT_NCURSES=yes to your /etc/make.conf).

>How-To-Repeat:
>Fix:

diff -ru  /usr/ports/mail/mutt-devel/Makefile ./Makefile
--- /usr/ports/mail/mutt-devel/Makefile	Wed Aug 18 20:02:35 2004
+++ ./Makefile	Wed Aug 25 14:30:10 2004
@@ -19,9 +19,9 @@
 #
 # The two most important knobs are:
 #
-# In general you can choose between using the SLANG port (WITH_MUTT_SLANG)
-# and ncurses (WITH_MUTT_NCURSES) which is the default. Note that you may
-# have to set the variables COLORTERM=yes and COLORFGBG=color,color in your
+# In general you can choose between using ncurses (WITH_MUTT_NCURSES)
+# and SLANG (WITH_MUTT_SLANG) which is the default. Note that you may
+# have to set the variables COLORTERM=yes and COLORFGBG="color1;color2" in your
 # environment to get slang function properly.
 #
 # If you want to install the mutt documentation in html and ps format define:
@@ -81,7 +81,7 @@
 
 PORTNAME=	mutt-devel
 PORTVERSION=	1.5.6
-PORTREVISION=	8
+PORTREVISION=	9
 CATEGORIES+=	mail ipv6
 .if defined(WITH_MUTT_NNTP)
 CATEGORIES+=	news
@@ -171,15 +171,15 @@
 .if defined(WITH_MUTT_NCURSES_PORT)
 WITH_MUTT_NCURSES=	yes
 .endif
-.if defined(WITH_MUTT_NCURSES)
-MUTT_USES_NCURSES=	yes
-.endif
-.if defined(WITH_MUTT_SLANG) && !defined(MUTT_USES_NCURSES)
+.if defined(WITH_MUTT_SLANG)
 MUTT_USES_SLANG=	yes
 .endif
-.if !defined(MUTT_USES_NCURSES) && !defined(WITHOUT_MUTT_NCURSES) && !defined(MUTT_USES_SLANG)
+.if defined(WITH_MUTT_NCURSES) && !defined(MUTT_USES_SLANG)
 MUTT_USES_NCURSES=	yes
 .endif
+.if !defined(MUTT_USES_SLANG) && !defined(WITHOUT_MUTT_SLANG) && !defined(MUTT_USES_NCURSES)
+MUTT_USES_SLANG=	yes
+.endif
 .if defined(WITHOUT_MUTT_SGMLFORMAT)
 SGML_USED=	no
 .endif
@@ -399,7 +399,7 @@
 	@${ECHO} "=====================================================" >> ${PKGMESSAGE}
 	@${ECHO} "You have installed ${PORTNAME} with SLANG support." >> ${PKGMESSAGE}
 	@${ECHO} "This may work for a color terminal only when defining" >> ${PKGMESSAGE}
-	@${ECHO} "COLORTERM=yes and COLORFGBG=color,color in your" >> ${PKGMESSAGE}
+	@${ECHO} "COLORTERM=yes and COLORFGBG=\"color1;color2\" in your" >> ${PKGMESSAGE}
 	@${ECHO} "environment." >> ${PKGMESSAGE}
 	@${ECHO} "=====================================================" >> ${PKGMESSAGE}
 .endif
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	Wed Aug 18 20:02:36 2004
+++ ./files/extra-patch-maildir-header-cache	Fri Aug 27 14:21:40 2004
@@ -1,14 +1,12 @@
-diff -Nru a/Makefile.am b/Makefile.am
---- a/Makefile.am	2004-08-18 10:08:12 +02:00
-+++ b/Makefile.am	2004-08-18 10:08:12 +02:00
-@@ -20,2 +20,3 @@
- mutt_SOURCES = $(BUILT_SOURCES) \
-+	hcache.c \
- 	addrbook.c alias.c attach.c base64.c browser.c buffy.c color.c \
+diff -Nru a/PATCHES b/PATCHES
+--- a/PATCHES
++++ b/PATCHES
+@@ -0,0 +1 @@
++patch-1.5.6.tg.hcache.2
 diff -Nru a/configure.in b/configure.in
---- a/configure.in	2004-08-18 10:08:12 +02:00
-+++ b/configure.in	2004-08-18 10:08:12 +02:00
-@@ -768,6 +768,80 @@
+--- 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 @@
  
          fi])
  
@@ -16,6 +14,7 @@
 +AC_ARG_ENABLE(hcache, [  --enable-hcache            Enable header caching],
 +[if test x$enableval = xyes; then
 +    AC_DEFINE(USE_HCACHE, 1, [Enable header caching])
++    MUTT_LIB_OBJECTS="$MUTT_LIB_OBJECTS hcache.o"
 +
 +    OLDCPPFLAGS="$CPPFLAGS"
 +    OLDLIBS="$LIBS"
@@ -90,23 +89,23 @@
  AC_SUBST(MUTT_LIB_OBJECTS)
  AC_SUBST(LIBIMAP)
 diff -Nru a/globals.h b/globals.h
---- a/globals.h	2004-08-18 10:08:12 +02:00
-+++ b/globals.h	2004-08-18 10:08:12 +02:00
+--- a/globals.h	2004-08-18 09:43:11 +02:00
++++ b/globals.h	2004-08-26 22:32:53 +02:00
 @@ -63,6 +63,10 @@
  WHERE char *Locale;
  WHERE char *MailcapPath;
  WHERE char *Maildir;
 +#if USE_HCACHE
 +WHERE char *HeaderCache;
-+WHERE short HeaderCachePageSize;
++WHERE char *HeaderCachePageSize;
 +#endif
  WHERE char *MhFlagged;
  WHERE char *MhReplied;
  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-18 10:08:12 +02:00
-@@ -0,0 +1,794 @@
++++ b/hcache.c	2004-08-26 22:32:53 +02:00
+@@ -0,0 +1,798 @@
 +/*
 + * Copyright (C) 2004 Thomas Glanzmann <sithglan at stud.uni-erlangen.de>
 + * Copyright (C) 2004 Tobias Werth <sitowert at stud.uni-erlangen.de>
@@ -515,7 +514,7 @@
 +{
 +	int crc = 0;
 +
-+	crc = crc32(crc, (unsigned char const *) "HCACHE V1", mutt_strlen("HCACHE V1"));
++	crc = crc32(crc, (unsigned char const *) "sithglan at stud.uni-erlangen.de[sithglan]|hcache.c|20040826203315|26242", mutt_strlen("sithglan at stud.uni-erlangen.de[sithglan]|hcache.c|20040826203315|26242"));
 +
 +#if HAVE_LANGINFO_CODESET
 +	crc = crc32(crc, (unsigned char const *) Charset, mutt_strlen(Charset));
@@ -619,19 +618,21 @@
 +        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);
 +		return NULL;
 +	}
 +
-+	h->db = gdbm_open((char *) path, (int) HeaderCachePageSize, GDBM_WRCREAT, 00600, NULL);
++	h->db = gdbm_open((char *) path, pagesize, GDBM_WRCREAT, 00600, NULL);
 +	if (h->db) {
 +		return h;
 +	}
 +
 +	/* if rw failed try ro */
-+	h->db = gdbm_open((char *) path, (int) HeaderCachePageSize, GDBM_READER, 00600, NULL);
++	h->db = gdbm_open((char *) path, pagesize, GDBM_READER, 00600, NULL);
 +	if(h->db) {
 +		return h;
 +	} else {
@@ -703,7 +704,7 @@
 +	key.dptr  = path;
 +	key.dsize = keylen(path);
 +
-+	data.dptr = mutt_hcache_dump(db, header, &data.dsize, uid_validity); 
++	data.dptr = mutt_hcache_dump(db, header, &data.dsize, uid_validity);
 +
 +	ret = gdbm_store(h->db, key, data, GDBM_REPLACE);
 +
@@ -757,6 +758,8 @@
 +	u_int32_t createflags = DB_CREATE;
 +	int ret;
 +	struct header_cache *h = calloc(1, sizeof(HEADER_CACHE));
++	int pagesize = atoi(HeaderCachePageSize);
++
 +
 +	h->crc = generate_crc32();
 +
@@ -799,7 +802,7 @@
 +
 +	if (stat(path, &sb) != 0 && errno == ENOENT) {
 +		createflags |= DB_EXCL;
-+		h->db->set_pagesize(h->db, (int) HeaderCachePageSize);
++		h->db->set_pagesize(h->db, pagesize);
 +	}
 +
 +	ret = h->db->open(h->db, NULL, path, folder, DB_BTREE, createflags, 0600);
@@ -875,7 +878,7 @@
 +
 +	mutt_hcache_dbt_empty_init(&data);
 +	data.flags = DB_DBT_USERMEM;
-+	data.data = mutt_hcache_dump(db, header, (signed int *) &data.size, uid_validity); 
++	data.data = mutt_hcache_dump(db, header, (signed int *) &data.size, uid_validity);
 +	data.ulen = data.size;
 +
 +	ret = h->db->put(h->db, NULL, &key, &data, 0);
@@ -902,8 +905,8 @@
 +}
 +#endif
 diff -Nru a/imap/imap.c b/imap/imap.c
---- a/imap/imap.c	2004-08-18 10:08:12 +02:00
-+++ b/imap/imap.c	2004-08-18 10:08:12 +02:00
+--- a/imap/imap.c	2004-08-18 09:43:27 +02:00
++++ b/imap/imap.c	2004-08-17 00:34:10 +02:00
 @@ -602,6 +602,17 @@
        if ((pc = imap_get_flags (&(idata->flags), pc)) == NULL)
  	goto fail;
@@ -923,8 +926,8 @@
      {
        pc = imap_next_word (pc);
 diff -Nru a/imap/imap_private.h b/imap/imap_private.h
---- a/imap/imap_private.h	2004-08-18 10:08:12 +02:00
-+++ b/imap/imap_private.h	2004-08-18 10:08:12 +02:00
+--- a/imap/imap_private.h	2004-08-18 09:43:27 +02:00
++++ b/imap/imap_private.h	2004-07-24 12:39:31 +02:00
 @@ -179,6 +179,9 @@
    unsigned int newMailCount;
    IMAP_CACHE cache[IMAP_CACHE_LEN];
@@ -936,8 +939,8 @@
    /* all folder flags - system flags AND keywords */
    LIST *flags;
 diff -Nru a/imap/message.c b/imap/message.c
---- a/imap/message.c	2004-08-18 10:08:12 +02:00
-+++ b/imap/message.c	2004-08-18 10:08:12 +02:00
+--- a/imap/message.c	2004-08-18 09:43:27 +02:00
++++ b/imap/message.c	2004-08-06 02:09:41 +02:00
 @@ -39,6 +39,12 @@
  static int msg_parse_fetch (IMAP_HEADER* h, char* s);
  static char* msg_parse_flags (IMAP_HEADER* h, char* s);
@@ -1192,9 +1195,9 @@
  /* msg_has_flag: do a caseless comparison of the flag against a flag list,
   *   return 1 if found or flag list has '\*', 0 otherwise */
 diff -Nru a/init.h b/init.h
---- a/init.h	2004-08-18 10:08:12 +02:00
-+++ b/init.h	2004-08-18 10:08:12 +02:00
-@@ -981,6 +981,30 @@
+--- a/init.h	2004-08-18 09:43:12 +02:00
++++ b/init.h	2004-08-26 22:32:53 +02:00
+@@ -981,6 +981,31 @@
    ** \fBDON'T CHANGE THIS SETTING UNLESS YOU ARE REALLY SURE WHAT YOU ARE
    ** DOING!\fP
    */
@@ -1213,21 +1216,22 @@
 +  ** files when the header cache is in use.  This incurs one stat(2) per
 +  ** message every time the folder is opened.
 +  */
-+  { "header_cache_pagesize", DT_NUM, R_NONE, UL &HeaderCachePageSize, 16384 },
++  { "header_cache_pagesize", DT_STR, R_NONE, UL &HeaderCachePageSize, UL "16384" },
 +  /*
 +  ** .pp
 +  ** Change the maildir header cache database page size.  Too large
 +  ** or too small of a page size for the common header can waste
-+  ** space, memory effectiveness, or CPU time.  You can use the
-+  ** db_dump utility to determine the optimal page size.
++  ** space, memory effectiveness, or CPU time. The default should be more or
++  ** less the best you can get. For details google after mutt maildir header
++  ** cache (first hit).
 +  */
 +#endif /* USE_HCACHE */
    { "maildir_trash", DT_BOOL, R_NONE, OPTMAILDIRTRASH, 0 },
    /*
    ** .pp
 diff -Nru a/main.c b/main.c
---- a/main.c	2004-08-18 10:08:12 +02:00
-+++ b/main.c	2004-08-18 10:08:12 +02:00
+--- a/main.c	2004-08-18 09:43:12 +02:00
++++ b/main.c	2004-07-24 12:39:30 +02:00
 @@ -411,6 +411,12 @@
  	"-HAVE_GETADDRINFO  "
  #endif
@@ -1242,8 +1246,8 @@
  
  #ifdef ISPELL
 diff -Nru a/mh.c b/mh.c
---- a/mh.c	2004-08-18 10:08:12 +02:00
-+++ b/mh.c	2004-08-18 10:08:12 +02:00
+--- 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 @@
    return r;
  }
@@ -1397,8 +1401,8 @@
  
  static char *maildir_canon_filename (char *dest, const char *src, size_t l)
 diff -Nru a/mutt.h b/mutt.h
---- a/mutt.h	2004-08-18 10:08:12 +02:00
-+++ b/mutt.h	2004-08-18 10:08:12 +02:00
+--- a/mutt.h	2004-08-18 09:43:13 +02:00
++++ b/mutt.h	2004-07-24 12:39:30 +02:00
 @@ -345,6 +345,9 @@
    OPTFORCENAME,
    OPTFORWDECODE,
@@ -1410,8 +1414,8 @@
    OPTHEADER,
    OPTHELP,
 diff -Nru a/protos.h b/protos.h
---- a/protos.h	2004-08-18 10:08:12 +02:00
-+++ b/protos.h	2004-08-18 10:08:12 +02:00
+--- a/protos.h	2004-08-18 09:43:16 +02:00
++++ b/protos.h	2004-08-09 08:05:48 +02:00
 @@ -99,6 +99,16 @@
  ENVELOPE *mutt_read_rfc822_header (FILE *, HEADER *, short, short);
  HEADER *mutt_dup_header (HEADER *);
@@ -1429,7 +1433,3 @@
  ATTACHPTR **mutt_gen_attach_list (BODY *, int, ATTACHPTR **, short *, short *, int, int);
  
  time_t mutt_decrease_mtime (const char *, struct stat *);
---- PATCHES.orig    Tue Nov  6 19:59:33 2001
-+++ PATCHES     Tue Nov  6 19:59:42 2001
-@@ -1,0 +1 @@
-+patch-1.5.6.tg.hcache.0
diff -ru  /usr/ports/mail/mutt-devel/files/patch-doc-manual.sgml.head ./files/patch-doc-manual.sgml.head
--- /usr/ports/mail/mutt-devel/files/patch-doc-manual.sgml.head	Thu Jan  1 01:00:00 1970
+++ ./files/patch-doc-manual.sgml.head	Wed Aug 25 14:04:22 2004
@@ -0,0 +1,111 @@
+--- doc/manual.sgml.head.orig	Sun Feb  1 18:49:53 2004
++++ doc/manual.sgml.head	Wed Aug 25 14:02:33 2004
+@@ -125,24 +125,24 @@
+ <tscreen><verb>
+ ^A or <Home>    bol             move to the start of the line
+ ^B or <Left>    backward-char   move back one char
+-Esc B		backward-word	move back one word
++Esc B           backward-word   move back one word
+ ^D or <Delete>  delete-char     delete the char under the cursor
+ ^E or <End>     eol             move to the end of the line
+ ^F or <Right>   forward-char    move forward one char
+-Esc F		forward-word	move forward one word
++Esc F           forward-word    move forward one word
+ <Tab>           complete        complete filename or alias
+ ^T              complete-query  complete address with query
+ ^K              kill-eol        delete to the end of the line
+-ESC d		kill-eow	delete to the end ot the word
++ESC d           kill-eow        delete to the end ot the word
+ ^W              kill-word       kill the word in front of the cursor
+ ^U              kill-line       delete entire line
+ ^V              quote-char      quote the next typed key
+ <Up>            history-up      recall previous string from history
+ <Down>          history-down    recall next string from history
+ <BackSpace>     backspace       kill the char in front of the cursor
+-Esc u		upcase-word	convert word to upper case
+-Esc l		downcase-word	convert word to lower case
+-Esc c		capitalize-word capitalize the word
++Esc u           upcase-word     convert word to upper case
++Esc l           downcase-word   convert word to lower case
++Esc c           capitalize-word capitalize the word
+ ^G              n/a             abort
+ <Return>        n/a             finish editing
+ </verb></tscreen>
+@@ -325,8 +325,8 @@
+ ESC p   previous-subthread      jump to the start of the previous subthread
+ ESC r   read-subthread          mark the current subthread as read
+ ESC t   tag-thread              toggle the tag on the current thread
+-ESC v	collapse-thread		toggle collapse for the current thread
+-ESC V	collapse-all		toggle collapse for all threads
++ESC v   collapse-thread         toggle collapse for the current thread
++ESC V   collapse-all            toggle collapse for all threads
+ P       parent-message          jump to parent message in thread
+ </verb></tscreen>
+ 
+@@ -513,7 +513,7 @@
+ 
+ <tscreen><verb>
+ a       attach-file             attach a file
+-A	attach-message		attach message(s) to the message
++A       attach-message          attach message(s) to the message
+ ESC k   attach-key              attach a PGP public key
+ d       edit-description        edit description on attachment
+ D       detach-file             detach a file
+@@ -529,7 +529,7 @@
+ p       pgp-menu                select PGP options
+ P       postpone-message        postpone this message until later
+ q       quit                    quit (abort) sending the message
+-w	write-fcc		write the message to a folder
++w       write-fcc               write the message to a folder
+ i       ispell                  check spelling (if available on your system)
+ ^F      forget-passphrase       wipe passphrase(s) from memory
+ </verb></tscreen>
+@@ -1760,7 +1760,7 @@
+ ~g              cryptographically signed messages
+ ~G              cryptographically encrypted messages
+ ~h EXPR         messages which contain EXPR in the message header
+-~k		message contains PGP key material
++~k              message contains PGP key material
+ ~i ID           message which match ID in the ``Message-ID'' field
+ ~L EXPR         message is either originated or received by EXPR
+ ~l              message is addressed to a known mailing list
+@@ -1778,12 +1778,12 @@
+ ~T              tagged messages
+ ~t USER         messages addressed to USER
+ ~U              unread messages
+-~v		message is part of a collapsed thread.
+-~V		cryptographically verified messages
++~v              message is part of a collapsed thread.
++~V              cryptographically verified messages
+ ~x EXPR         messages which contain EXPR in the `References' field
+ ~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)
++~=              duplicated messages (see $duplicate_threads)
+ </verb></tscreen>
+ 
+ Where EXPR, USER, ID, and SUBJECT are 
+@@ -1885,10 +1885,10 @@
+ An error margin is a sign (+ or -), followed by a digit, followed by
+ one of the following units:
+ <verb>
+-y	years
+-m	months
+-w	weeks
+-d	days
++y       years
++m       months
++w       weeks
++d       days
+ </verb>
+ As a special case, you can replace the sign by a ``*'' character,
+ which is equivalent to giving identical plus and minus error margins.
+@@ -2919,7 +2919,7 @@
+ to send messages from the command line as well.
+ 
+ <tscreen><verb>
+--A	expand an alias
++-A      expand an alias
+ -a      attach a file to a message
+ -b      specify a blind carbon-copy (BCC) address
+ -c      specify a carbon-copy (Cc) address
diff -ru  /usr/ports/mail/mutt-devel/files/patch-threadcomplete ./files/patch-threadcomplete
--- /usr/ports/mail/mutt-devel/files/patch-threadcomplete	Fri Jul 11 19:32:26 2003
+++ ./files/patch-threadcomplete	Fri Aug 27 11:48:02 2004
@@ -1,18 +1,33 @@
-written by Nicolas Rachinsky <nr at rachinsky.de>
-http://www.rachinsky.de
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published
-by the Free Software Foundation;  version 2 of the License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-General Public License for more details.
-
---- mutt-1.3.28.ori/mutt.h	Thu Mar 14 19:22:25 2002
-+++ mutt.h	Fri Mar 15 00:22:41 2002
-@@ -198,6 +198,7 @@
+diff -Nru a/PATCHES b/PATCHES
+--- PATCHES	2004-07-24 12:27:17 +02:00
++++ PATCHES	2004-08-22 02:01:52 +02:00
+@@ -0,0 +1 @@
++patch-1.5.6.cb.thread_pattern.1
+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:
+ 
+ <tscreen><verb>
++~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 @@
+ ~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)
++~(PATTERN)      messages in threads containing messages matching a certain
++                pattern, e.g. all threads containing messages from you: ~(~P)
+ </verb></tscreen>
+ 
+ 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,
@@ -20,8 +35,14 @@
  
    /* actions for mutt_pattern_comp/mutt_pattern_exec */
    M_AND,
---- pattern.c.orig	Fri Jul 11 09:19:06 2003
-+++ pattern.c	Fri Jul 11 09:23:17 2003
+   M_OR,
++  M_THREAD,
+   M_TO,
+   M_CC,
+   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[] =
@@ -30,44 +51,109 @@
    { 'A', M_ALL,			0,		NULL },
    { 'b', M_BODY,		M_FULL_MSG,	eat_regexp },
    { 'B', M_WHOLE_MSG,		M_FULL_MSG,	eat_regexp },
-@@ -946,6 +947,27 @@
+@@ -700,7 +701,7 @@
+ pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err)
+ {
+   pattern_t *curlist = NULL;
+-  pattern_t *tmp;
++  pattern_t *tmp, *tmp2;
+   pattern_t *last = NULL;
+   int not = 0;
+   int alladdr = 0;
+@@ -755,6 +756,39 @@
+ 	alladdr = 0;
+ 	break;
+       case '~':
++	if (*(ps.dptr + 1) == '(') {
++		ps.dptr ++; /* skip ~ */
++		p = find_matching_paren (ps.dptr + 1);
++		if (*p != ')')
++		{
++		  snprintf (err->data, err->dsize, _("mismatched brackets: %s"), ps.dptr);
++		  mutt_pattern_free (&curlist);
++		  return NULL;
++		}
++		tmp = new_pattern ();
++		tmp->op = M_THREAD;
++		if (last)
++		  last->next = tmp;
++		else
++		  curlist = tmp;
++		last = tmp;
++		tmp->not ^= not;
++		tmp->alladdr |= alladdr;
++		not = 0;
++		alladdr = 0;
++		/* compile the sub-expression */
++		buf = mutt_substrdup (ps.dptr + 1, p);
++		if ((tmp2 = mutt_pattern_comp (buf, flags, err)) == NULL)
++		{
++		  FREE (&buf);
++		  mutt_pattern_free (&curlist);
++		  return NULL;
++		}
++		FREE (&buf);
++		tmp->child = tmp2;
++		ps.dptr = p + 1; /* restore location */
++		break;
++	}
+ 	if (implicit && or)
+ 	{
+ 	  /* A | B & C == (A | B) & C */
+@@ -945,6 +979,30 @@
    return alladdr;
  }
  
-+static int match_threadcomplete(int flag,THREAD *t,int left,int up,int right,int down)
++static int match_threadcomplete(struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx, THREAD *t,int left,int up,int right,int down)
 +{
-+	int a=0;
-+	HEADER *h=NULL;
++  int a;
++  HEADER *h;
 +
-+	if(! t)return 0;
-+	h=t->message;
-+	if(! flag && h && h->tagged)return 1;
-+	if(flag && h && ! h->tagged) return 1;
++  if(!t)
++    return 0;
++  h = t->message;
++  if(!h)
++    return 0;
++  if(mutt_pattern_exec(pat, flags, ctx, h))
++    return 1;
 +
-+	if(up)a=match_threadcomplete(flag,t->parent,1,1,1,0);
-+	if(a)return a;
-+	if(right && t->parent)a=match_threadcomplete(flag,t->next,0,0,1,1);
-+	if(a)return a;
-+	if(left && t->parent)a=match_threadcomplete(flag,t->prev,1,0,0,1);
-+	if(a)return a;
-+	if(down)a=match_threadcomplete(flag,t->child,1,0,1,1);
-+	if(a)return a;
-+	return 0;
++  if(up && (a=match_threadcomplete(pat, flags, ctx, t->parent,1,1,1,0)))
++    return a;
++  if(right && t->parent && (a=match_threadcomplete(pat, flags, ctx, t->next,0,0,1,1)))
++    return a;
++  if(left && t->parent && (a=match_threadcomplete(pat, flags, ctx, t->prev,1,0,0,1)))
++    return a;
++  if(down && (a=match_threadcomplete(pat, flags, ctx, t->child,1,0,1,1)))
++    return a;
++  return 0;
 +}
 +
  /* flags
     	M_MATCH_FULL_ADDRESS	match both personal and machine address */
  int
-@@ -1024,6 +1046,8 @@
+@@ -958,6 +1016,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));
++    case M_THREAD:
++      return (pat->not ^ match_threadcomplete(pat->child, flags, ctx, h->thread, 1, 1, 1, 1));
+     case M_ALL:
+       return (!pat->not);
+     case M_EXPIRED:
+@@ -1023,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));
 +    case M_THREADCOMPLETE:
-+      return ((h->thread && match_threadcomplete(pat->not,h->thread,1,1,1,1)));
++      { static pattern_t tmp;
++        static short pattern_set = 0;
++        if(! pattern_set) {
++          memset (&tmp, 0, sizeof (tmp));
++          tmp.op = M_TAG;
++          pattern_set = 1;
++        }
++        return (pat->not ^ match_threadcomplete(&tmp, flags, ctx, h->thread, 1, 1, 1, 1));
++      } 
      case M_PERSONAL_RECIP:
        return (pat->not ^ match_user (pat->alladdr, h->env->to, h->env->cc));
      case M_PERSONAL_FROM:
---- PATCHES~    Tue Nov  6 19:59:33 2001
-+++ PATCHES     Tue Nov  6 19:59:42 2001
-@@ -1,0 +1 @@
-+1.3.28.nr.threadcomplete
>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list