From: Adam Gołębiowski Date: Tue, 27 Nov 2018 16:59:17 +0000 (+0100) Subject: - cd.purge_message, cd.trash_folder, gpgme, imap_fast_trash, X-Git-Tag: auto/th/mutt-1.11.0-1~4 X-Git-Url: https://git.pld-linux.org/?p=packages%2Fmutt.git;a=commitdiff_plain;h=4e8003daf56ecfa78d8eedfa268e806603189bfe - cd.purge_message, cd.trash_folder, gpgme, imap_fast_trash, rr.compressed, sidebar, openssl patches applied upstream --- diff --git a/mutt-cd.purge_message.patch b/mutt-cd.purge_message.patch deleted file mode 100644 index 9d20e35..0000000 --- a/mutt-cd.purge_message.patch +++ /dev/null @@ -1,212 +0,0 @@ -# vim:ft=diff: -This is the purge message patch by Cedric Duval . - -(requires trash folder patch) - -This patch adds the purge-message function, which, unlike delete-message, will -bypass the trash folder and really delete the mail. - -You can bind this function to D, for instance, by adding the following -lines to your muttrc: - -bind index \eD purge-message -bind pager \eD purge-message - -Please be very careful with this function, and try to use it as less as -possible. The risk resides in getting into the habit of always using -purge-message instead of delete-message, which would really defeat the purpose -of having a trash folder feature. - -* Patch last synced with upstream: - - Date: 2007-02-15 - - File: http://cedricduval.free.fr/mutt/patches/download/patch-1.5.5.1.cd.purge_message.3.4 - -* Changes made: - - Updated to 1.5.13 - - Fixed indentation of "purged" in mutt.h. - -== END PATCH ---- a/OPS -+++ b/OPS -@@ -142,6 +142,7 @@ - OP_PREV_LINE "scroll up one line" - OP_PREV_PAGE "move to the previous page" - OP_PRINT "print the current entry" -+OP_PURGE_MESSAGE "really delete the current entry, bypassing the trash folder" - OP_QUERY "query external program for addresses" - OP_QUERY_APPEND "append new query results to current results" - OP_QUIT "save changes to mailbox and quit" ---- a/curs_main.c -+++ b/curs_main.c -@@ -1843,6 +1843,7 @@ - MAYBE_REDRAW (menu->redraw); - break; - -+ case OP_PURGE_MESSAGE: - case OP_DELETE: - - CHECK_MSGCOUNT; -@@ -1853,6 +1854,7 @@ - if (tag) - { - mutt_tag_set_flag (M_DELETE, 1); -+ mutt_tag_set_flag (M_PURGED, (op != OP_PURGE_MESSAGE) ? 0 : 1); - if (option (OPTDELETEUNTAG)) - mutt_tag_set_flag (M_TAG, 0); - menu->redraw = REDRAW_INDEX; -@@ -1860,6 +1862,8 @@ - else - { - mutt_set_flag (Context, CURHDR, M_DELETE, 1); -+ mutt_set_flag (Context, CURHDR, M_PURGED, -+ (op != OP_PURGE_MESSAGE) ? 0 : 1); - if (option (OPTDELETEUNTAG)) - mutt_set_flag (Context, CURHDR, M_TAG, 0); - if (option (OPTRESOLVE)) -@@ -2161,11 +2165,13 @@ - if (tag) - { - mutt_tag_set_flag (M_DELETE, 0); -+ mutt_tag_set_flag (M_PURGED, 0); - menu->redraw = REDRAW_INDEX; - } - else - { - mutt_set_flag (Context, CURHDR, M_DELETE, 0); -+ mutt_set_flag (Context, CURHDR, M_PURGED, 0); - if (option (OPTRESOLVE) && menu->current < Context->vcount - 1) - { - menu->current++; -@@ -2186,9 +2192,11 @@ - CHECK_ACL(M_ACL_DELETE, _("undelete message(s)")); - - rc = mutt_thread_set_flag (CURHDR, M_DELETE, 0, -- op == OP_UNDELETE_THREAD ? 0 : 1); -+ op == OP_UNDELETE_THREAD ? 0 : 1) -+ + mutt_thread_set_flag (CURHDR, M_PURGED, 0, -+ op == OP_UNDELETE_THREAD ? 0 : 1); - -- if (rc != -1) -+ if (rc > -1) - { - if (option (OPTRESOLVE)) - { ---- a/flags.c -+++ b/flags.c -@@ -104,6 +104,16 @@ - } - break; - -+ case M_PURGED: -+ if (bf) -+ { -+ if (!h->purged) -+ h->purged = 1; -+ } -+ else if (h->purged) -+ h->purged = 0; -+ break; -+ - case M_NEW: - - if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN)) ---- a/functions.h -+++ b/functions.h -@@ -121,6 +121,7 @@ - { "toggle-write", OP_TOGGLE_WRITE, "%" }, - { "next-thread", OP_MAIN_NEXT_THREAD, "\016" }, - { "next-subthread", OP_MAIN_NEXT_SUBTHREAD, "\033n" }, -+ { "purge-message", OP_PURGE_MESSAGE, NULL }, - { "query", OP_QUERY, "Q" }, - { "quit", OP_QUIT, "q" }, - { "reply", OP_REPLY, "r" }, -@@ -213,6 +214,7 @@ - { "print-message", OP_PRINT, "p" }, - { "previous-thread", OP_MAIN_PREV_THREAD, "\020" }, - { "previous-subthread",OP_MAIN_PREV_SUBTHREAD, "\033p" }, -+ { "purge-message", OP_PURGE_MESSAGE, NULL }, - { "quit", OP_QUIT, "Q" }, - { "exit", OP_EXIT, "q" }, - { "reply", OP_REPLY, "r" }, ---- a/mutt.h -+++ b/mutt.h -@@ -188,6 +188,7 @@ - M_UNDELETE, - M_DELETED, - M_APPENDED, -+ M_PURGED, - M_FLAG, - M_TAG, - M_UNTAG, -@@ -709,6 +710,7 @@ - unsigned int flagged : 1; /* marked important? */ - unsigned int tagged : 1; - unsigned int appended : 1; /* has been saved */ -+ unsigned int purged : 1; /* bypassing the trash folder */ - unsigned int deleted : 1; - unsigned int changed : 1; - unsigned int attach_del : 1; /* has an attachment marked for deletion */ ---- a/mx.c -+++ b/mx.c -@@ -806,6 +806,7 @@ - { - for (i = 0 ; i < ctx->msgcount ; i++) - if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->appended -+ && !ctx->hdrs[i]->purged - && mutt_append_message (ctx_trash, ctx, ctx->hdrs[i], 0, 0) == -1) - { - mx_close_mailbox (ctx_trash, NULL); ---- a/pager.c -+++ b/pager.c -@@ -2351,6 +2351,7 @@ - MAYBE_REDRAW (redraw); - break; - -+ case OP_PURGE_MESSAGE: - case OP_DELETE: - CHECK_MODE(IsHeader (extra)); - CHECK_READONLY; -@@ -2358,6 +2359,8 @@ - CHECK_ACL(M_ACL_DELETE, _("Cannot delete message")); - - mutt_set_flag (Context, extra->hdr, M_DELETE, 1); -+ mutt_set_flag (Context, extra->hdr, M_PURGED, -+ ch != OP_PURGE_MESSAGE ? 0 : 1); - if (option (OPTDELETEUNTAG)) - mutt_set_flag (Context, extra->hdr, M_TAG, 0); - redraw = REDRAW_STATUS | REDRAW_INDEX; -@@ -2675,6 +2678,7 @@ - CHECK_ACL(M_ACL_DELETE, _("undelete message")); - - mutt_set_flag (Context, extra->hdr, M_DELETE, 0); -+ mutt_set_flag (Context, extra->hdr, M_PURGED, 0); - redraw = REDRAW_STATUS | REDRAW_INDEX; - if (option (OPTRESOLVE)) - { -@@ -2690,9 +2694,11 @@ - CHECK_ACL(M_ACL_DELETE, _("undelete message(s)")); - - r = mutt_thread_set_flag (extra->hdr, M_DELETE, 0, -+ ch == OP_UNDELETE_THREAD ? 0 : 1) -+ + mutt_thread_set_flag (extra->hdr, M_PURGED, 0, - ch == OP_UNDELETE_THREAD ? 0 : 1); - -- if (r != -1) -+ if (r > -1) - { - if (option (OPTRESOLVE)) - { ---- a/pattern.c -+++ b/pattern.c -@@ -1357,8 +1357,10 @@ - { - switch (op) - { -- case M_DELETE: - case M_UNDELETE: -+ mutt_set_flag (Context, Context->hdrs[Context->v2r[i]], M_PURGED, -+ 0); -+ case M_DELETE: - mutt_set_flag (Context, Context->hdrs[Context->v2r[i]], M_DELETE, - (op == M_DELETE)); - break; diff --git a/mutt-cd.trash_folder.patch b/mutt-cd.trash_folder.patch deleted file mode 100644 index 2317dd5..0000000 --- a/mutt-cd.trash_folder.patch +++ /dev/null @@ -1,283 +0,0 @@ -# vim:ft=diff: -This is the trash folder patch by Cedric Duval . - -With this patch, if the trash variable is set to a path (unset by default), the -deleted mails will be moved to a trash folder instead of being irremediably -purged when syncing the mailbox. - -For instance, set trash="~/Mail/trash" will cause every deleted mail to go to -this folder. - -Note that the append to the trash folder doesn't occur until the resync is -done. This allows you to change your mind and undo deletes, and thus the moves -to the trash folder are unnecessary. - -Notes - - * You might also want to have a look at the purge message feature below - which is related to this patch. - * IMAP is now supported. To retain the previous behavior, add this to your - muttrc: - folder-hook ^imap:// 'unset trash' - -FAQ - -Every once in a while, someone asks what are the advantages of this patch over -a macro based solution. Here's an attempt to answer this question: - - * The folder history doesn't clutter up with unwanted trash entries. - * Delayed move to the trash allows to change one's mind. - * No need to treat the case of "normal folders" and trash folders - separately with folder-hooks, and to create two sets of macros (one for - the index, one for the pager). - * Works not only with delete-message, but also with every deletion - functions like delete-pattern, delete-thread or delete-subthread. - -To sum up, it's more integrated and transparent to the user. - -* Patch last synced with upstream: - - Date: 2007-02-15 - - File: http://cedricduval.free.fr/mutt/patches/download/patch-1.5.5.1.cd.trash_folder.3.4 - -* Changes made: - - Updated to 1.5.13: - - structure of _mutt_save_message changed (commands.c) - - context of option (OPTCONFIRMAPPEND) changed (muttlib.c) - - Fixed indentation of "appended" in mutt.h. - -== END PATCH ---- a/commands.c -+++ b/commands.c -@@ -717,6 +717,7 @@ - if (option (OPTDELETEUNTAG)) - mutt_set_flag (Context, h, M_TAG, 0); - } -+ mutt_set_flag (Context, h, M_APPENDED, 1); - - return 0; - } ---- a/flags.c -+++ b/flags.c -@@ -65,7 +65,13 @@ - { - h->deleted = 0; - update = 1; -- if (upd_ctx) ctx->deleted--; -+ if (upd_ctx) -+ { -+ ctx->deleted--; -+ if (h->appended) -+ ctx->appended--; -+ } -+ h->appended = 0; /* when undeleting, also reset the appended flag */ - #ifdef USE_IMAP - /* see my comment above */ - if (ctx->magic == M_IMAP) -@@ -87,6 +93,17 @@ - } - break; - -+ case M_APPENDED: -+ if (bf) -+ { -+ if (!h->appended) -+ { -+ h->appended = 1; -+ if (upd_ctx) ctx->appended++; -+ } -+ } -+ break; -+ - case M_NEW: - - if (!mutt_bit_isset(ctx->rights,M_ACL_SEEN)) ---- a/globals.h -+++ b/globals.h -@@ -139,6 +139,7 @@ - WHERE char *Status; - WHERE char *Tempdir; - WHERE char *Tochars; -+WHERE char *TrashPath; - WHERE char *TSStatusFormat; - WHERE char *TSIconFormat; - WHERE short TSSupported; ---- a/imap/message.c -+++ b/imap/message.c -@@ -876,6 +876,7 @@ - if (ctx->hdrs[n]->tagged) - { - mutt_set_flag (ctx, ctx->hdrs[n], M_DELETE, 1); -+ mutt_set_flag (ctx, ctx->hdrs[n], M_APPENDED, 1); - if (option (OPTDELETEUNTAG)) - mutt_set_flag (ctx, ctx->hdrs[n], M_TAG, 0); - } -@@ -883,6 +884,7 @@ - else - { - mutt_set_flag (ctx, h, M_DELETE, 1); -+ mutt_set_flag (ctx, h, M_APPENDED, 1); - if (option (OPTDELETEUNTAG)) - mutt_set_flag (ctx, h, M_TAG, 0); - } ---- a/init.h -+++ b/init.h -@@ -3195,6 +3195,16 @@ - ** by \fIyou\fP. The sixth character is used to indicate when a mail - ** was sent to a mailing-list you subscribe to. - */ -+ { "trash", DT_PATH, R_NONE, UL &TrashPath, 0 }, -+ /* -+ ** .pp -+ ** If set, this variable specifies the path of the trash folder where the -+ ** mails marked for deletion will be moved, instead of being irremediably -+ ** purged. -+ ** .pp -+ ** NOTE: When you delete a message in the trash folder, it is really -+ ** deleted, so that you have a way to clean the trash. -+ */ - #ifdef USE_SOCKET - { "tunnel", DT_STR, R_NONE, UL &Tunnel, UL 0 }, - /* ---- a/mutt.h -+++ b/mutt.h -@@ -187,6 +187,7 @@ - M_DELETE, - M_UNDELETE, - M_DELETED, -+ M_APPENDED, - M_FLAG, - M_TAG, - M_UNTAG, -@@ -707,6 +708,7 @@ - unsigned int mime : 1; /* has a MIME-Version header? */ - unsigned int flagged : 1; /* marked important? */ - unsigned int tagged : 1; -+ unsigned int appended : 1; /* has been saved */ - unsigned int deleted : 1; - unsigned int changed : 1; - unsigned int attach_del : 1; /* has an attachment marked for deletion */ -@@ -879,6 +881,7 @@ - int new; /* how many new messages? */ - int unread; /* how many unread messages? */ - int deleted; /* how many deleted messages */ -+ int appended; /* how many saved messages? */ - int flagged; /* how many flagged messages */ - int msgnotreadyet; /* which msg "new" in pager, -1 if none */ - ---- a/muttlib.c -+++ b/muttlib.c -@@ -1515,7 +1515,9 @@ - - if (magic > 0 && !mx_access (s, W_OK)) - { -- if (option (OPTCONFIRMAPPEND)) -+ if (option (OPTCONFIRMAPPEND) && -+ (!TrashPath || (mutt_strcmp (s, TrashPath) != 0))) -+ /* if we're appending to the trash, there's no point in asking */ - { - snprintf (tmp, sizeof (tmp), _("Append messages to %s?"), s); - if ((rc = mutt_yesorno (tmp, M_YES)) == M_NO) ---- a/mx.c -+++ b/mx.c -@@ -776,6 +776,53 @@ - return rc; - } - -+/* move deleted mails to the trash folder */ -+static int trash_append (CONTEXT *ctx) -+{ -+ CONTEXT *ctx_trash; -+ int i = 0; -+ struct stat st, stc; -+ -+ if (!TrashPath || !ctx->deleted || -+ (ctx->magic == M_MAILDIR && option (OPTMAILDIRTRASH))) -+ return 0; -+ -+ for (;i < ctx->msgcount && (!ctx->hdrs[i]->deleted || -+ ctx->hdrs[i]->appended); i++); -+ if (i == ctx->msgcount) -+ return 0; /* nothing to be done */ -+ -+ if (mutt_save_confirm (TrashPath, &st) != 0) -+ { -+ mutt_error _("message(s) not deleted"); -+ return -1; -+ } -+ -+ if (lstat (ctx->path, &stc) == 0 && stc.st_ino == st.st_ino -+ && stc.st_dev == st.st_dev && stc.st_rdev == st.st_rdev) -+ return 0; /* we are in the trash folder: simple sync */ -+ -+ if ((ctx_trash = mx_open_mailbox (TrashPath, M_APPEND, NULL)) != NULL) -+ { -+ for (i = 0 ; i < ctx->msgcount ; i++) -+ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->appended -+ && mutt_append_message (ctx_trash, ctx, ctx->hdrs[i], 0, 0) == -1) -+ { -+ mx_close_mailbox (ctx_trash, NULL); -+ return -1; -+ } -+ -+ mx_close_mailbox (ctx_trash, NULL); -+ } -+ else -+ { -+ mutt_error _("Can't open trash folder"); -+ return -1; -+ } -+ -+ return 0; -+} -+ - /* save changes and close mailbox */ - int mx_close_mailbox (CONTEXT *ctx, int *index_hint) - { -@@ -912,6 +959,7 @@ - if (mutt_append_message (&f, ctx, ctx->hdrs[i], 0, CH_UPDATE_LEN) == 0) - { - mutt_set_flag (ctx, ctx->hdrs[i], M_DELETE, 1); -+ mutt_set_flag (ctx, ctx->hdrs[i], M_APPENDED, 1); - } - else - { -@@ -936,6 +984,14 @@ - return 0; - } - -+ /* copy mails to the trash before expunging */ -+ if (purge && ctx->deleted && mutt_strcmp(ctx->path, TrashPath)) -+ if (trash_append (ctx) != 0) -+ { -+ ctx->closing = 0; -+ return -1; -+ } -+ - #ifdef USE_IMAP - /* allow IMAP to preserve the deleted flag across sessions */ - if (ctx->magic == M_IMAP) -@@ -1133,6 +1189,12 @@ - msgcount = ctx->msgcount; - deleted = ctx->deleted; - -+ if (purge && ctx->deleted && mutt_strcmp(ctx->path, TrashPath)) -+ { -+ if (trash_append (ctx) == -1) -+ return -1; -+ } -+ - #ifdef USE_IMAP - if (ctx->magic == M_IMAP) - rc = imap_sync_mailbox (ctx, purge, index_hint); ---- a/postpone.c -+++ b/postpone.c -@@ -277,6 +277,9 @@ - /* finished with this message, so delete it. */ - mutt_set_flag (PostContext, h, M_DELETE, 1); - -+ /* and consider it saved, so that it won't be moved to the trash folder */ -+ mutt_set_flag (PostContext, h, M_APPENDED, 1); -+ - /* update the count for the status display */ - PostCount = PostContext->msgcount - PostContext->deleted; - diff --git a/mutt-gpgme.patch b/mutt-gpgme.patch deleted file mode 100644 index 9635c1f..0000000 --- a/mutt-gpgme.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 7d69f2a2822621ca3018ed7296bdb165a356c71a Mon Sep 17 00:00:00 2001 -From: Vincent Lefevre -Date: Sat, 26 Nov 2016 00:57:42 +0100 -Subject: [PATCH] Fix build failure with GPGME 1.8: do not steal the gpgme_ - prefix. - -Upstream commit. - -Fixes: #257 ---- - crypt-gpgme.c | 2 +- - crypt-gpgme.h | 2 +- - crypt-mod-pgp-gpgme.c | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/crypt-gpgme.c b/crypt-gpgme.c -index b5a0990d5..2a325e6d7 100644 ---- a/crypt-gpgme.c -+++ b/crypt-gpgme.c -@@ -4959,7 +4959,7 @@ int smime_gpgme_verify_sender (HEADER *h) - return verify_sender (h, GPGME_PROTOCOL_CMS); - } - --void gpgme_set_sender (const char *sender) -+void mutt_gpgme_set_sender (const char *sender) - { - mutt_error ("[setting sender] mailbox: %s\n", sender); - FREE (¤t_sender); -diff --git a/crypt-gpgme.h b/crypt-gpgme.h -index 11ca6a60f..7f5ecda37 100644 ---- a/crypt-gpgme.h -+++ b/crypt-gpgme.h -@@ -53,6 +53,6 @@ int smime_gpgme_send_menu (HEADER *msg, int *redraw); - - int smime_gpgme_verify_sender (HEADER *h); - --void gpgme_set_sender (const char *sender); -+void mutt_gpgme_set_sender (const char *sender); - - #endif -diff --git a/crypt-mod-pgp-gpgme.c b/crypt-mod-pgp-gpgme.c -index 948585c45..183f4eeec 100644 ---- a/crypt-mod-pgp-gpgme.c -+++ b/crypt-mod-pgp-gpgme.c -@@ -104,7 +104,7 @@ static BODY *crypt_mod_pgp_make_key_attachment (char *tempf) - - static void crypt_mod_pgp_set_sender (const char *sender) - { -- gpgme_set_sender (sender); -+ mutt_gpgme_set_sender (sender); - } - - struct crypt_module_specs crypt_mod_pgp_gpgme = diff --git a/mutt-imap_fast_trash.patch b/mutt-imap_fast_trash.patch deleted file mode 100644 index ba60a2a..0000000 --- a/mutt-imap_fast_trash.patch +++ /dev/null @@ -1,100 +0,0 @@ -http://marc.info/?l=mutt-dev&m=128045511126422 - -Make "move to trash folder" use IMAP COPY. - -by Paul Miller (jettero) - ---- a/imap/imap.c -+++ b/imap/imap.c -@@ -893,6 +893,12 @@ static int imap_make_msg_set (IMAP_DATA* - if (hdrs[n]->deleted != HEADER_DATA(hdrs[n])->deleted) - match = invert ^ hdrs[n]->deleted; - break; -+ case M_EXPIRED: /* imap_fast_trash version of M_DELETED */ -+ if (hdrs[n]->purged) -+ break; -+ if (hdrs[n]->deleted != HEADER_DATA(hdrs[n])->deleted) -+ match = invert ^ hdrs[n]->deleted; -+ break; - case M_FLAG: - if (hdrs[n]->flagged != HEADER_DATA(hdrs[n])->flagged) - match = invert ^ hdrs[n]->flagged; -@@ -2028,3 +2034,54 @@ int imap_complete(char* dest, size_t dle - - return -1; - } -+ -+int imap_fast_trash() { -+ -+ if( Context->magic == M_IMAP && mx_is_imap(TrashPath) ) { -+ IMAP_MBOX mx; -+ IMAP_DATA *idata = (IMAP_DATA *) Context->data; -+ char mbox[LONG_STRING]; -+ char mmbox[LONG_STRING]; -+ int rc; -+ dprint(1, (debugfile, "[itf] trashcan seems to be on imap.\n")); -+ -+ if ( imap_parse_path(TrashPath, &mx) == 0 ) { -+ if( mutt_account_match(&(idata->conn->account), &(mx.account)) ) { -+ dprint(1, (debugfile, "[itf] trashcan seems to be on the same account.\n")); -+ -+ imap_fix_path (idata, mx.mbox, mbox, sizeof (mbox)); -+ if (!*mbox) -+ strfcpy (mbox, "INBOX", sizeof (mbox)); -+ imap_munge_mbox_name (idata, mmbox, sizeof (mmbox), mbox); -+ -+ rc = imap_exec_msgset (idata, "UID COPY", mmbox, M_EXPIRED, 0, 0); -+ if (!rc) { -+ dprint (1, (debugfile, "imap_copy_messages: No messages del-tagged\n")); -+ rc = -1; -+ goto old_way; -+ -+ } else if (rc < 0) { -+ dprint (1, (debugfile, "could not queue copy\n")); -+ goto old_way; -+ -+ } else { -+ mutt_message (_("Copying %d messages to %s..."), rc, mbox); -+ return 0; -+ } -+ -+ } else { -+ dprint(1, (debugfile, "[itf] trashcan seems to be on a different account.\n")); -+ } -+ -+ old_way: -+ FREE (&mx.mbox); /* we probably only need to free this when the parse works */ -+ -+ } else { -+ dprint(1, (debugfile, "[itf] failed to parse TrashPath.\n" )); -+ } -+ -+ dprint(1, (debugfile, "[itf] giving up and trying old fasioned way.\n" )); -+ } -+ -+ return 1; -+} ---- a/imap/imap.h -+++ b/imap/imap.h -@@ -72,4 +72,7 @@ void imap_keepalive (void); - - int imap_account_match (const ACCOUNT* a1, const ACCOUNT* a2); - -+/* trash */ -+int imap_fast_trash(); -+ - #endif ---- a/mx.c -+++ b/mx.c -@@ -802,6 +802,11 @@ static int trash_append (CONTEXT *ctx) - && stc.st_dev == st.st_dev && stc.st_rdev == st.st_rdev) - return 0; /* we are in the trash folder: simple sync */ - -+ #ifdef USE_IMAP -+ if( !imap_fast_trash() ) -+ return 0; -+ #endif -+ - if ((ctx_trash = mx_open_mailbox (TrashPath, M_APPEND, NULL)) != NULL) - { - for (i = 0 ; i < ctx->msgcount ; i++) diff --git a/mutt-rr.compressed.patch b/mutt-rr.compressed.patch deleted file mode 100644 index 46ba156..0000000 --- a/mutt-rr.compressed.patch +++ /dev/null @@ -1,1307 +0,0 @@ -diff -udprP mutt-1.5.19.orig/compress.c mutt-1.5.19/compress.c ---- mutt-1.5.19.orig/compress.c 1970-01-01 03:00:00.000000000 +0300 -+++ mutt-1.5.19/compress.c 2009-01-06 19:16:04.000000000 +0200 -@@ -0,0 +1,490 @@ -+/* -+ * Copyright (C) 1997 Alain Penders -+ * -+ * 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; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * 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. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ */ -+ -+#if HAVE_CONFIG_H -+# include "config.h" -+#endif -+ -+#include "mutt.h" -+ -+#ifdef USE_COMPRESSED -+ -+#include "mx.h" -+#include "mailbox.h" -+#include "mutt_curses.h" -+ -+#include -+#include -+#include -+#include -+ -+typedef struct -+{ -+ const char *close; /* close-hook command */ -+ const char *open; /* open-hook command */ -+ const char *append; /* append-hook command */ -+ off_t size; /* size of real folder */ -+} COMPRESS_INFO; -+ -+char echo_cmd[HUGE_STRING]; -+ -+/* parameters: -+ * ctx - context to lock -+ * excl - exclusive lock? -+ * retry - should retry if unable to lock? -+ */ -+int mbox_lock_compressed (CONTEXT *ctx, FILE *fp, int excl, int retry) -+{ -+ int r; -+ -+ if ((r = mx_lock_file (ctx->realpath, fileno (fp), excl, 1, retry)) == 0) -+ ctx->locked = 1; -+ else if (retry && !excl) -+ { -+ ctx->readonly = 1; -+ return 0; -+ } -+ -+ return (r); -+} -+ -+void mbox_unlock_compressed (CONTEXT *ctx, FILE *fp) -+{ -+ if (ctx->locked) -+ { -+ fflush (fp); -+ -+ mx_unlock_file (ctx->realpath, fileno (fp), 1); -+ ctx->locked = 0; -+ } -+} -+ -+static int is_new (const char *path) -+{ -+ return (access (path, W_OK) != 0 && errno == ENOENT) ? 1 : 0; -+} -+ -+static const char* find_compress_hook (int type, const char *path) -+{ -+ const char* c = mutt_find_hook (type, path); -+ return (!c || !*c) ? NULL : c; -+} -+ -+int mutt_can_read_compressed (const char *path) -+{ -+ return find_compress_hook (M_OPENHOOK, path) ? 1 : 0; -+} -+ -+/* if the file is new, we really do not append, but create, and so use -+ * close-hook, and not append-hook -+ */ -+static const char* get_append_command (const char *path, const CONTEXT* ctx) -+{ -+ COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; -+ return (is_new (path)) ? ci->close : ci->append; -+} -+ -+int mutt_can_append_compressed (const char *path) -+{ -+ int magic; -+ -+ if (is_new (path)) -+ return (find_compress_hook (M_CLOSEHOOK, path) ? 1 : 0); -+ -+ magic = mx_get_magic (path); -+ -+ if (magic != 0 && magic != M_COMPRESSED) -+ return 0; -+ -+ return (find_compress_hook (M_APPENDHOOK, path) -+ || (find_compress_hook (M_OPENHOOK, path) -+ && find_compress_hook (M_CLOSEHOOK, path))) ? 1 : 0; -+} -+ -+/* open a compressed mailbox */ -+static COMPRESS_INFO *set_compress_info (CONTEXT *ctx) -+{ -+ COMPRESS_INFO *ci; -+ -+ /* Now lets uncompress this thing */ -+ ci = safe_malloc (sizeof (COMPRESS_INFO)); -+ ctx->compressinfo = (void*) ci; -+ ci->append = find_compress_hook (M_APPENDHOOK, ctx->path); -+ ci->open = find_compress_hook (M_OPENHOOK, ctx->path); -+ ci->close = find_compress_hook (M_CLOSEHOOK, ctx->path); -+ return ci; -+} -+ -+static void set_path (CONTEXT* ctx) -+{ -+ char tmppath[_POSIX_PATH_MAX]; -+ -+ /* Setup the right paths */ -+ ctx->realpath = ctx->path; -+ -+ /* Uncompress to /tmp */ -+ mutt_mktemp (tmppath, sizeof(tmppath)); -+ ctx->path = safe_malloc (strlen (tmppath) + 1); -+ strcpy (ctx->path, tmppath); -+} -+ -+static int get_size (const char* path) -+{ -+ struct stat sb; -+ if (stat (path, &sb) != 0) -+ return 0; -+ return (sb.st_size); -+} -+ -+static void store_size (CONTEXT* ctx) -+{ -+ COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; -+ ci->size = get_size (ctx->realpath); -+} -+ -+static const char * -+compresshook_format_str (char *dest, size_t destlen, size_t col, char op, -+ const char *src, const char *fmt, const char *ifstring, -+ const char *elsestring, unsigned long data, -+ format_flag flags) -+{ -+ char tmp[SHORT_STRING]; -+ -+ CONTEXT *ctx = (CONTEXT *) data; -+ switch (op) -+ { -+ case 'f': -+ snprintf (tmp, sizeof (tmp), "%%%ss", fmt); -+ snprintf (dest, destlen, tmp, ctx->realpath); -+ break; -+ case 't': -+ snprintf (tmp, sizeof (tmp), "%%%ss", fmt); -+ snprintf (dest, destlen, tmp, ctx->path); -+ break; -+ } -+ return (src); -+} -+ -+/* check that the command has both %f and %t -+ * 0 means OK, -1 means error -+ */ -+int mutt_test_compress_command (const char* cmd) -+{ -+ return (strstr (cmd, "%f") && strstr (cmd, "%t")) ? 0 : -1; -+} -+ -+static char *get_compression_cmd (const char* cmd, const CONTEXT* ctx) -+{ -+ char expanded[_POSIX_PATH_MAX]; -+ mutt_FormatString (expanded, sizeof (expanded), 0, cmd, compresshook_format_str, -+ (unsigned long) ctx, 0); -+ return safe_strdup (expanded); -+} -+ -+int mutt_check_mailbox_compressed (CONTEXT* ctx) -+{ -+ COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; -+ if (ci->size != get_size (ctx->realpath)) -+ { -+ FREE (&ctx->compressinfo); -+ FREE (&ctx->realpath); -+ mutt_error _("Mailbox was corrupted!"); -+ return (-1); -+ } -+ return (0); -+} -+ -+int mutt_open_read_compressed (CONTEXT *ctx) -+{ -+ char *cmd; -+ FILE *fp; -+ int rc; -+ -+ COMPRESS_INFO *ci = set_compress_info (ctx); -+ if (!ci->open) { -+ ctx->magic = 0; -+ FREE (ctx->compressinfo); -+ return (-1); -+ } -+ if (!ci->close || access (ctx->path, W_OK) != 0) -+ ctx->readonly = 1; -+ -+ set_path (ctx); -+ store_size (ctx); -+ -+ if (!ctx->quiet) -+ mutt_message (_("Decompressing %s..."), ctx->realpath); -+ -+ cmd = get_compression_cmd (ci->open, ctx); -+ if (cmd == NULL) -+ return (-1); -+ dprint (2, (debugfile, "DecompressCmd: '%s'\n", cmd)); -+ -+ if ((fp = fopen (ctx->realpath, "r")) == NULL) -+ { -+ mutt_perror (ctx->realpath); -+ FREE (&cmd); -+ return (-1); -+ } -+ mutt_block_signals (); -+ if (mbox_lock_compressed (ctx, fp, 0, 1) == -1) -+ { -+ fclose (fp); -+ mutt_unblock_signals (); -+ mutt_error _("Unable to lock mailbox!"); -+ FREE (&cmd); -+ return (-1); -+ } -+ -+ endwin (); -+ fflush (stdout); -+ sprintf(echo_cmd,_("echo Decompressing %s..."),ctx->realpath); -+ mutt_system(echo_cmd); -+ rc = mutt_system (cmd); -+ mbox_unlock_compressed (ctx, fp); -+ mutt_unblock_signals (); -+ fclose (fp); -+ -+ if (rc) -+ { -+ mutt_any_key_to_continue (NULL); -+ ctx->magic = 0; -+ FREE (ctx->compressinfo); -+ mutt_error (_("Error executing: %s : unable to open the mailbox!\n"), cmd); -+ } -+ FREE (&cmd); -+ if (rc) -+ return (-1); -+ -+ if (mutt_check_mailbox_compressed (ctx)) -+ return (-1); -+ -+ ctx->magic = mx_get_magic (ctx->path); -+ -+ return (0); -+} -+ -+void restore_path (CONTEXT* ctx) -+{ -+ FREE (&ctx->path); -+ ctx->path = ctx->realpath; -+} -+ -+/* remove the temporary mailbox */ -+void remove_file (CONTEXT* ctx) -+{ -+ if (ctx->magic == M_MBOX || ctx->magic == M_MMDF) -+ remove (ctx->path); -+} -+ -+int mutt_open_append_compressed (CONTEXT *ctx) -+{ -+ FILE *fh; -+ COMPRESS_INFO *ci = set_compress_info (ctx); -+ -+ if (!get_append_command (ctx->path, ctx)) -+ { -+ if (ci->open && ci->close) -+ return (mutt_open_read_compressed (ctx)); -+ -+ ctx->magic = 0; -+ FREE (&ctx->compressinfo); -+ return (-1); -+ } -+ -+ set_path (ctx); -+ -+ ctx->magic = DefaultMagic; -+ -+ if (!is_new (ctx->realpath)) -+ if (ctx->magic == M_MBOX || ctx->magic == M_MMDF) -+ if ((fh = fopen (ctx->path, "w"))) -+ fclose (fh); -+ /* No error checking - the parent function will catch it */ -+ -+ return (0); -+} -+ -+/* close a compressed mailbox */ -+void mutt_fast_close_compressed (CONTEXT *ctx) -+{ -+ dprint (2, (debugfile, "mutt_fast_close_compressed called on '%s'\n", -+ ctx->path)); -+ -+ if (ctx->compressinfo) -+ { -+ if (ctx->fp) -+ fclose (ctx->fp); -+ ctx->fp = NULL; -+ /* if the folder was removed, remove the gzipped folder too */ -+ if (access (ctx->path, F_OK) != 0 && ! option (OPTSAVEEMPTY)) -+ remove (ctx->realpath); -+ else -+ remove_file (ctx); -+ -+ restore_path (ctx); -+ FREE (&ctx->compressinfo); -+ } -+} -+ -+/* return 0 on success, -1 on failure */ -+int mutt_sync_compressed (CONTEXT* ctx) -+{ -+ char *cmd; -+ int rc = 0; -+ FILE *fp; -+ COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; -+ -+ if (!ctx->quiet) -+ mutt_message (_("Compressing %s..."), ctx->realpath); -+ -+ cmd = get_compression_cmd (ci->close, ctx); -+ if (cmd == NULL) -+ return (-1); -+ -+ if ((fp = fopen (ctx->realpath, "a")) == NULL) -+ { -+ mutt_perror (ctx->realpath); -+ FREE (&cmd); -+ return (-1); -+ } -+ mutt_block_signals (); -+ if (mbox_lock_compressed (ctx, fp, 1, 1) == -1) -+ { -+ fclose (fp); -+ mutt_unblock_signals (); -+ mutt_error _("Unable to lock mailbox!"); -+ -+ store_size (ctx); -+ -+ FREE (&cmd); -+ return (-1); -+ } -+ -+ dprint (2, (debugfile, "CompressCommand: '%s'\n", cmd)); -+ -+ endwin (); -+ fflush (stdout); -+ sprintf(echo_cmd,_("echo Compressing %s..."), ctx->realpath); -+ mutt_system(echo_cmd); -+ if (mutt_system (cmd)) -+ { -+ mutt_any_key_to_continue (NULL); -+ mutt_error (_("%s: Error compressing mailbox! Original mailbox deleted, uncompressed one kept!\n"), ctx->path); -+ rc = -1; -+ } -+ -+ mbox_unlock_compressed (ctx, fp); -+ mutt_unblock_signals (); -+ fclose (fp); -+ -+ FREE (&cmd); -+ -+ store_size (ctx); -+ -+ return (rc); -+} -+ -+int mutt_slow_close_compressed (CONTEXT *ctx) -+{ -+ FILE *fp; -+ const char *append; -+ char *cmd; -+ COMPRESS_INFO *ci = (COMPRESS_INFO *) ctx->compressinfo; -+ -+ dprint (2, (debugfile, "mutt_slow_close_compressed called on '%s'\n", -+ ctx->path)); -+ -+ if (! (ctx->append -+ && ((append = get_append_command (ctx->realpath, ctx)) -+ || (append = ci->close)))) -+ { /* if we can not or should not append, -+ * we only have to remove the compressed info, because sync was already -+ * called -+ */ -+ mutt_fast_close_compressed (ctx); -+ return (0); -+ } -+ -+ if (ctx->fp) -+ fclose (ctx->fp); -+ ctx->fp = NULL; -+ -+ if (!ctx->quiet) -+ { -+ if (append == ci->close) -+ mutt_message (_("Compressing %s..."), ctx->realpath); -+ else -+ mutt_message (_("Compressed-appending to %s..."), ctx->realpath); -+ } -+ -+ cmd = get_compression_cmd (append, ctx); -+ if (cmd == NULL) -+ return (-1); -+ -+ if ((fp = fopen (ctx->realpath, "a")) == NULL) -+ { -+ mutt_perror (ctx->realpath); -+ FREE (&cmd); -+ return (-1); -+ } -+ mutt_block_signals (); -+ if (mbox_lock_compressed (ctx, fp, 1, 1) == -1) -+ { -+ fclose (fp); -+ mutt_unblock_signals (); -+ mutt_error _("Unable to lock mailbox!"); -+ FREE (&cmd); -+ return (-1); -+ } -+ -+ dprint (2, (debugfile, "CompressCmd: '%s'\n", cmd)); -+ -+ endwin (); -+ fflush (stdout); -+ -+ if (append == ci->close) -+ sprintf(echo_cmd,_("echo Compressing %s..."), ctx->realpath); -+ else -+ sprintf(echo_cmd,_("echo Compressed-appending to %s..."), ctx->realpath); -+ mutt_system(echo_cmd); -+ -+ if (mutt_system (cmd)) -+ { -+ mutt_any_key_to_continue (NULL); -+ mutt_error (_(" %s: Error compressing mailbox! Uncompressed one kept!\n"), -+ ctx->path); -+ FREE (&cmd); -+ mbox_unlock_compressed (ctx, fp); -+ mutt_unblock_signals (); -+ fclose (fp); -+ return (-1); -+ } -+ -+ mbox_unlock_compressed (ctx, fp); -+ mutt_unblock_signals (); -+ fclose (fp); -+ remove_file (ctx); -+ restore_path (ctx); -+ FREE (&cmd); -+ FREE (&ctx->compressinfo); -+ -+ return (0); -+} -+ -+#endif /* USE_COMPRESSED */ -diff -udprP mutt-1.5.19.orig/compress.h mutt-1.5.19/compress.h ---- mutt-1.5.19.orig/compress.h 1970-01-01 03:00:00.000000000 +0300 -+++ mutt-1.5.19/compress.h 2009-01-06 19:16:04.000000000 +0200 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (C) 1997 Alain Penders -+ * -+ * 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; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * 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. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ */ -+ -+int mutt_can_read_compressed (const char *); -+int mutt_can_append_compressed (const char *); -+int mutt_open_read_compressed (CONTEXT *); -+int mutt_open_append_compressed (CONTEXT *); -+int mutt_slow_close_compressed (CONTEXT *); -+int mutt_sync_compressed (CONTEXT *); -+int mutt_test_compress_command (const char *); -+int mutt_check_mailbox_compressed (CONTEXT *); -+void mutt_fast_close_compressed (CONTEXT *); -diff -udprP mutt-1.5.19.orig/config.h.in mutt-1.5.19/config.h.in ---- mutt-1.5.19.orig/config.h.in 2008-11-18 01:54:00.000000000 +0200 -+++ mutt-1.5.19/config.h.in 2009-01-06 19:16:04.000000000 +0200 -@@ -521,6 +521,9 @@ - - /* Define to enable Sun mailtool attachments support. */ - #undef SUN_ATTACHMENT -+ -+/* The compressed mailboxes support */ -+#undef USE_COMPRESSED - - /* Define to use dotlocking for mailboxes. */ - #undef USE_DOTLOCK -diff -udprP mutt-1.5.19.orig/configure mutt-1.5.19/configure ---- mutt-1.5.19.orig/configure 2008-11-18 01:53:41.000000000 +0200 -+++ mutt-1.5.19/configure 2009-01-06 19:16:04.000000000 +0200 -@@ -1366,6 +1366,7 @@ Optional Features: - --disable-warnings Turn off compiler warnings (not recommended) - --enable-nfs-fix Work around an NFS with broken attributes caching - --enable-mailtool Enable Sun mailtool attachments support -+ --enable-compressed Enable compressed folders support - --enable-locales-fix The result of isprint() is unreliable - --enable-exact-address Enable regeneration of email addresses - --enable-hcache Enable header caching -@@ -12978,6 +12979,18 @@ echo "${ECHO_T}$mutt_cv_regex_broken" >& - fi - fi - -+ -+# Check whether --enable-compressed or --disable-compressed was given. -+if test "${enable_compressed+set}" = set; then -+ enableval="$enable_compressed" -+ if test x$enableval = xyes; then -+ cat >> confdefs.h <<\EOF -+#define USE_COMPRESSED 1 -+EOF -+ -+ fi -+fi -+ - if test $mutt_cv_regex = yes; then - - cat >>confdefs.h <<\_ACEOF -diff -udprP mutt-1.5.19.orig/configure.ac mutt-1.5.19/configure.ac ---- mutt-1.5.19.orig/configure.ac 2008-11-17 22:15:26.000000000 +0200 -+++ mutt-1.5.19/configure.ac 2009-01-06 19:16:04.000000000 +0200 -@@ -807,6 +807,11 @@ AC_ARG_ENABLE(mailtool, AC_HELP_STRING([ - AC_DEFINE(SUN_ATTACHMENT,1,[ Define to enable Sun mailtool attachments support. ]) - fi]) - -+AC_ARG_ENABLE(compressed, AC_HELP_STRING([--enable-compressed], [Enable compressed folders support]), -+ [if test x$enableval = xyes; then -+ AC_DEFINE(USE_COMPRESSED,1,[ Define to enable compressed folders support. ]) -+ fi]) -+ - AC_ARG_ENABLE(locales-fix, AS_HELP_STRING([--enable-locales-fix],[The result of isprint() is unreliable]), - [if test x$enableval = xyes; then - AC_DEFINE(LOCALES_HACK,1,[ Define if the result of isprint() is unreliable. ]) -diff -udprP mutt-1.5.19.orig/curs_main.c mutt-1.5.19/curs_main.c ---- mutt-1.5.19.orig/curs_main.c 2009-01-05 21:20:53.000000000 +0200 -+++ mutt-1.5.19/curs_main.c 2009-01-06 19:16:04.000000000 +0200 -@@ -1108,6 +1108,11 @@ int mutt_index_menu (void) - { - int check; - -+#ifdef USE_COMPRESSED -+ if (Context->compressinfo && Context->realpath) -+ mutt_str_replace (&LastFolder, Context->realpath); -+ else -+#endif - mutt_str_replace (&LastFolder, Context->path); - oldcount = Context ? Context->msgcount : 0; - ---- mutt-1.5.20.b/doc/Makefile.am 2009-06-01 04:23:14.000000000 +0200 -+++ mutt-1.5.20/doc/Makefile.am 2009-07-14 12:36:06.000000000 +0200 -@@ -31,7 +31,8 @@ - - CHUNKED_DOCFILES = index.html intro.html gettingstarted.html \ - configuration.html mimesupport.html advancedusage.html \ -- optionalfeatures.html security.html tuning.html reference.html miscellany.html -+ optionalfeatures.html security.html tuning.html reference.html miscellany.html \ -+ compressed-folders.html - - HTML_DOCFILES = manual.html $(CHUNKED_DOCFILES) - ---- mutt-1.5.20.b/doc/Makefile.in 2009-06-09 08:50:43.000000000 +0200 -+++ mutt-1.5.20/doc/Makefile.in 2009-07-14 12:36:53.000000000 +0200 -@@ -235,7 +235,8 @@ - - CHUNKED_DOCFILES = index.html intro.html gettingstarted.html \ - configuration.html mimesupport.html advancedusage.html \ -- optionalfeatures.html security.html tuning.html reference.html miscellany.html -+ optionalfeatures.html security.html tuning.html reference.html miscellany.html \ -+ compressed-folders.html - - HTML_DOCFILES = manual.html $(CHUNKED_DOCFILES) - BUILT_DISTFILES = stamp-doc-xml stamp-doc-chunked manual.txt $(HTML_DOCFILES) -diff -udprP mutt-1.5.19.orig/doc/manual.xml.head mutt-1.5.19/doc/manual.xml.head ---- mutt-1.5.19.orig/doc/manual.xml.head 2009-01-05 21:20:53.000000000 +0200 -+++ mutt-1.5.19/doc/manual.xml.head 2009-01-06 19:35:41.000000000 +0200 -@@ -4639,6 +4639,24 @@ configuration option/command. See - fcc-save-hook - - -+ -+ -+ -+open-hook -+ -+ -+ -+ -+ -+close-hook -+ -+ -+ -+ -+ -+append-hook -+ -+ - - - -@@ -5138,6 +5156,254 @@ macro pager \cb |urlview\n - - - -+ -+Compressed folders Support (OPTIONAL) -+ -+ -+If Mutt was compiled with compressed folders support (by running the -+configure script with the -+--enable-compressed flag), Mutt can open folders -+stored in an arbitrary format, provided that the user has a script to -+convert from/to this format to one of the accepted. -+ -+ -+ -+The most common use is to open compressed archived folders e.g. with -+gzip. -+ -+ -+ -+In addition, the user can provide a script that gets a folder in an -+accepted format and appends its context to the folder in the -+user-defined format, which may be faster than converting the entire -+folder to the accepted format, appending to it and converting back to -+the user-defined format. -+ -+ -+ -+There are three hooks defined -+(open-hook, -+close-hook and -+append-hook) which define commands -+to uncompress and compress a folder and to append messages to an -+existing compressed folder respectively. -+ -+ -+ -+For example: -+ -+ -+open-hook \\.gz$ "gzip -cd %f > %t" -+close-hook \\.gz$ "gzip -c %t > %f" -+append-hook \\.gz$ "gzip -c %t >> %f" -+ -+ -+ -+ -+You do not have to specify all of the commands. If you omit -+append-hook, the folder will be open -+and closed again each time you will add to it. If you omit -+close-hook (or give empty command), -+the folder will be open in the mode. If you specify -+append-hook though you'll be able to -+append to the folder. -+ -+ -+ -+Note that Mutt will only try to use hooks if the file is not in one of -+the accepted formats. In particular, if the file is empty, mutt -+supposes it is not compressed. This is important because it allows the -+use of programs that do not have well defined extensions. Just use -+``.'' as a regexp. But this may be surprising if your compressing -+script produces empty files. In this situation, unset -+$save_empty, so that -+the compressed file will be removed if you delete all of the messages. -+ -+ -+ -+Open a compressed mailbox for reading -+ -+ -+Usage: open-hook regexp command -+ -+ -+ -+The command is the command that can be used for -+opening the folders whose names match regexp. -+ -+ -+ -+The command string is the printf-like format -+string, and it should accept two parameters: %f, which is -+replaced with the (compressed) folder name, and %t which is -+replaced with the name of the temporary folder to which to write. -+ -+ -+ -+%f and %t can be repeated any number of times in the -+command string, and all of the entries are replaced with the -+appropriate folder name. In addition, %% is replaced by -+%, as in printf, and any other %anything is left as is. -+ -+ -+ -+The command should not -+remove the original compressed file. The command -+should return non-zero exit status if it fails, so mutt knows -+something's wrong. -+ -+ -+ -+Example: -+ -+ -+open-hook \\.gz$ "gzip -cd %f > %t" -+ -+ -+ -+ -+If the command is empty, this operation is -+disabled for this file type. -+ -+ -+ -+ -+ -+Write a compressed mailbox -+ -+ -+Usage: close-hook regexp command -+ -+ -+ -+This is used to close the folder that was open with the -+open-hook command after some changes -+were made to it. -+ -+ -+ -+The command string is the command that can be -+used for closing the folders whose names match regexp. -+It has the same format as in the open-hook -+command. Temporary folder in this case is the folder previously -+produced by the open-hook command. -+ -+ -+ -+The command should not -+remove the decompressed file. The command should -+return non-zero exit status if it fails, so mutt knows something's -+wrong. -+ -+ -+ -+Example: -+ -+ -+close-hook \\.gz$ "gzip -c %t > %f" -+ -+ -+ -+ -+If the command is empty, this operation is -+disabled for this file type, and the file can only be open in the -+readonly mode. -+ -+ -+ -+close-hook is not called when you -+exit from the folder if the folder was not changed. -+ -+ -+ -+ -+ -+Append a message to a compressed mailbox -+ -+ -+Usage: append-hook regexp command -+ -+ -+ -+This command is used for saving to an existing compressed folder. -+The command is the command that can be used for -+appending to the folders whose names match regexp. -+It has the same format as in the open-hook -+command. The temporary folder in this case contains the messages that -+are being appended. -+ -+ -+ -+The command should not -+remove the decompressed file. The command should -+return non-zero exit status if it fails, so mutt knows something's -+wrong. -+ -+ -+ -+Example: -+ -+ -+append-hook \\.gz$ "gzip -c %t >> %f" -+ -+ -+ -+ -+When append-hook is used, the folder -+is not opened, which saves time, but this means that we can not find -+out what the folder type is. Thus the default -+($mbox_type) type is -+always supposed (i.e. this is the format used for the temporary -+folder). -+ -+ -+ -+If the file does not exist when you save to it, -+close-hook is called, and not -+append-hook. -+append-hook is only for appending -+to existing folders. -+ -+ -+ -+If the command is empty, this operation is -+disabled for this file type. In this case, the folder will be open and -+closed again (using open-hook and -+close-hook respectively) each time -+you will add to it. -+ -+ -+ -+ -+ -+Encrypted folders -+ -+ -+The compressed folders support can also be used to handle encrypted -+folders. If you want to encrypt a folder with PGP, you may want to use -+the following hooks: -+ -+ -+open-hook \\.pgp$ "pgp -f < %f > %t" -+close-hook \\.pgp$ "pgp -fe YourPgpUserIdOrKeyId < %t > %f" -+ -+ -+ -+ -+Please note, that PGP does not support appending to an encrypted -+folder, so there is no append-hook defined. -+ -+ -+ -+Note: the folder is temporary stored -+decrypted in the /tmp directory, where it can be read by your system -+administrator. So think about the security aspects of this. -+ -+ -+ -+ -+ -+ - - Mutt's MIME Support - -@@ -6942,6 +7208,18 @@ The following are the commands understoo - - - -+append-hook -+ -+pattern -+ -+ -+command -+ -+ -+ -+ -+ -+ - auto_view - - mimetype -@@ -7007,6 +7285,18 @@ The following are the commands understoo - - - -+close-hook -+ -+pattern -+ -+ -+command -+ -+ -+ -+ -+ -+ - color - - object -@@ -7421,6 +7711,18 @@ The following are the commands understoo - - - -+open-hook -+ -+pattern -+ -+ -+command -+ -+ -+ -+ -+ -+ - crypt-hook - - pattern -diff -udprP mutt-1.5.19.orig/doc/Muttrc.head mutt-1.5.19/doc/Muttrc.head ---- mutt-1.5.19.orig/doc/Muttrc.head 2008-06-14 03:08:43.000000000 +0300 -+++ mutt-1.5.19/doc/Muttrc.head 2009-01-06 19:16:04.000000000 +0200 -@@ -29,6 +29,17 @@ macro generic,pager " - macro index,pager y "?" "show incoming mailboxes list" - bind browser y exit - -+# Use folders which match on \\.gz$ as gzipped folders: -+open-hook \\.gz$ "gzip -cd %f > %t" -+close-hook \\.gz$ "gzip -c %t > %f" -+append-hook \\.gz$ "gzip -c %t >> %f" -+open-hook \\.bz2$ "bzip2 -cd %f > %t" -+close-hook \\.bz2$ "bzip2 -c %t > %f" -+append-hook \\.bz2$ "bzip2 -c %t >> %f" -+open-hook \\.xz$ "xz -cd %f > %t" -+close-hook \\.xz$ "xz -c %t > %f" -+append-hook \\.xz$ "xz -c %t >> %f" -+ - # If Mutt is unable to determine your site's domain name correctly, you can - # set the default here. - # -diff -udprP mutt-1.5.19.orig/doc/muttrc.man.head mutt-1.5.19/doc/muttrc.man.head ---- mutt-1.5.19.orig/doc/muttrc.man.head 2008-11-26 20:48:48.000000000 +0200 -+++ mutt-1.5.19/doc/muttrc.man.head 2009-01-06 19:16:04.000000000 +0200 -@@ -345,6 +345,24 @@ specify the ID of the public key to be u - \fBcrypt-hook\fPs result in the use of multiple \fIkey-id\fPs for - a recipient. - -+.PP -+.nf -+\fBopen-hook\fP \fIregexp\fP "\fIcommand\fP" -+\fBclose-hook\fP \fIregexp\fP "\fIcommand\fP" -+\fBappend-hook\fP \fIregexp\fP "\fIcommand\fP" -+.fi -+.IP -+These commands provide a way to handle compressed folders. The given -+\fBregexp\fP specifies which folders are taken as compressed (e.g. -+"\fI\\\\.gz$\fP"). The commands tell Mutt how to uncompress a folder -+(\fBopen-hook\fP), compress a folder (\fBclose-hook\fP) or append a -+compressed mail to a compressed folder (\fBappend-hook\fP). The -+\fIcommand\fP string is the -+.BR printf (3) -+like format string, and it should accept two parameters: \fB%f\fP, -+which is replaced with the (compressed) folder name, and \fB%t\fP -+which is replaced with the name of the temporary folder to which to -+write. - .TP - \fBpush\fP \fIstring\fP - This command adds the named \fIstring\fP to the keyboard buffer. -diff -udprP mutt-1.5.19.orig/hook.c mutt-1.5.19/hook.c ---- mutt-1.5.19.orig/hook.c 2009-01-05 21:20:53.000000000 +0200 -+++ mutt-1.5.19/hook.c 2009-01-06 19:16:04.000000000 +0200 -@@ -24,6 +24,10 @@ - #include "mailbox.h" - #include "mutt_crypt.h" - -+#ifdef USE_COMPRESSED -+#include "compress.h" -+#endif -+ - #include - #include - #include -@@ -92,6 +96,16 @@ int mutt_parse_hook (BUFFER *buf, BUFFER - memset (&pattern, 0, sizeof (pattern)); - pattern.data = safe_strdup (path); - } -+#ifdef USE_COMPRESSED -+ else if (data & (M_APPENDHOOK | M_OPENHOOK | M_CLOSEHOOK)) -+ { -+ if (mutt_test_compress_command (command.data)) -+ { -+ strfcpy (err->data, _("bad formatted command string"), err->dsize); -+ return (-1); -+ } -+ } -+#endif - else if (DefaultHook && !(data & (M_CHARSETHOOK | M_ICONVHOOK | M_ACCOUNTHOOK)) - && (!WithCrypto || !(data & M_CRYPTHOOK)) - ) -diff -udprP mutt-1.5.19.orig/init.h mutt-1.5.19/init.h ---- mutt-1.5.19.orig/init.h 2009-01-05 21:20:53.000000000 +0200 -+++ mutt-1.5.19/init.h 2009-01-06 19:16:04.000000000 +0200 -@@ -3398,6 +3398,11 @@ struct command_t Commands[] = { - { "fcc-hook", mutt_parse_hook, M_FCCHOOK }, - { "fcc-save-hook", mutt_parse_hook, M_FCCHOOK | M_SAVEHOOK }, - { "folder-hook", mutt_parse_hook, M_FOLDERHOOK }, -+#ifdef USE_COMPRESSED -+ { "open-hook", mutt_parse_hook, M_OPENHOOK }, -+ { "close-hook", mutt_parse_hook, M_CLOSEHOOK }, -+ { "append-hook", mutt_parse_hook, M_APPENDHOOK }, -+#endif - { "group", parse_group, M_GROUP }, - { "ungroup", parse_ungroup, M_UNGROUP }, - { "hdr_order", parse_list, UL &HeaderOrderList }, -diff -udprP mutt-1.5.19.orig/main.c mutt-1.5.19/main.c ---- mutt-1.5.19.orig/main.c 2009-01-04 01:27:10.000000000 +0200 -+++ mutt-1.5.19/main.c 2009-01-06 19:16:04.000000000 +0200 -@@ -311,6 +311,12 @@ static void show_version (void) - "-USE_GNU_REGEX " - #endif - -+#ifdef USE_COMPRESSED -+ "+COMPRESSED " -+#else -+ "-COMPRESSED " -+#endif -+ - "\n" - - #ifdef HAVE_COLOR -diff -udprP mutt-1.5.19.orig/Makefile.am mutt-1.5.19/Makefile.am ---- mutt-1.5.19.orig/Makefile.am 2009-01-05 21:20:53.000000000 +0200 -+++ mutt-1.5.19/Makefile.am 2009-01-06 19:16:04.000000000 +0200 -@@ -18,6 +18,7 @@ BUILT_SOURCES = keymap_defs.h patchlist. - bin_PROGRAMS = mutt @DOTLOCK_TARGET@ @PGPAUX_TARGET@ - mutt_SOURCES = \ - addrbook.c alias.c attach.c base64.c browser.c buffy.c color.c \ -+ compress.c \ - crypt.c cryptglue.c \ - commands.c complete.c compose.c copy.c curs_lib.c curs_main.c date.c \ - edit.c enter.c flags.c init.c filter.c from.c \ -@@ -58,6 +59,7 @@ EXTRA_mutt_SOURCES = account.c bcache.c - - EXTRA_DIST = COPYRIGHT GPL OPS OPS.PGP OPS.CRYPT OPS.SMIME TODO UPDATING \ - configure account.h \ -+ compress.h \ - attach.h buffy.h charset.h copy.h crypthash.h dotlock.h functions.h gen_defs \ - globals.h hash.h history.h init.h keymap.h mutt_crypt.h \ - mailbox.h mapping.h md5.h mime.h mutt.h mutt_curses.h mutt_menu.h \ -diff -udprP mutt-1.5.19.orig/Makefile.in mutt-1.5.19/Makefile.in ---- mutt-1.5.19.orig/Makefile.in 2009-01-05 21:24:13.000000000 +0200 -+++ mutt-1.5.19/Makefile.in 2009-01-06 19:16:04.000000000 +0200 -@@ -14,6 +14,10 @@ - - @SET_MAKE@ - -+mutt_SOURCES += compress.c -+EXTRA_DIST += compress.h -+mutt_OBJECTS += compress.o -+ - - VPATH = @srcdir@ - pkgdatadir = $(datadir)/@PACKAGE@ -diff -udprP mutt-1.5.19.orig/mbox.c mutt-1.5.19/mbox.c ---- mutt-1.5.19.orig/mbox.c 2008-08-15 21:30:12.000000000 +0300 -+++ mutt-1.5.19/mbox.c 2009-01-06 19:16:04.000000000 +0200 -@@ -29,6 +29,10 @@ - #include "copy.h" - #include "mutt_curses.h" - -+#ifdef USE_COMPRESSED -+#include "compress.h" -+#endif -+ - #include - #include - #include -@@ -1038,6 +1042,12 @@ bail: /* Come here in case of disaster - int mbox_close_mailbox (CONTEXT *ctx) - { - mx_unlock_file (ctx->path, fileno (ctx->fp), 1); -+ -+#ifdef USE_COMPRESSED -+ if (ctx->compressinfo) -+ mutt_slow_close_compressed (ctx); -+#endif -+ - mutt_unblock_signals (); - mx_fastclose_mailbox (ctx); - return 0; -diff -udprP mutt-1.5.19.orig/mutt.h mutt-1.5.19/mutt.h ---- mutt-1.5.19.orig/mutt.h 2008-09-26 01:00:03.000000000 +0300 -+++ mutt-1.5.19/mutt.h 2009-01-06 19:16:04.000000000 +0200 -@@ -140,6 +140,11 @@ typedef enum - #define M_ACCOUNTHOOK (1<<9) - #define M_REPLYHOOK (1<<10) - #define M_SEND2HOOK (1<<11) -+#ifdef USE_COMPRESSED -+#define M_OPENHOOK (1<<12) -+#define M_APPENDHOOK (1<<13) -+#define M_CLOSEHOOK (1<<14) -+#endif - - /* tree characters for linearize_tree and print_enriched_string */ - #define M_TREE_LLCORNER 1 -@@ -869,6 +874,11 @@ typedef struct _context - - unsigned char rights[(RIGHTSMAX + 7)/8]; /* ACL bits */ - -+#ifdef USE_COMPRESSED -+ void *compressinfo; /* compressed mbox module private data */ -+ char *realpath; /* path to compressed mailbox */ -+#endif /* USE_COMPRESSED */ -+ - unsigned int locked : 1; /* is the mailbox locked? */ - unsigned int changed : 1; /* mailbox has been modified */ - unsigned int readonly : 1; /* don't allow changes to the mailbox */ -diff -udprP mutt-1.5.19.orig/mx.c mutt-1.5.19/mx.c ---- mutt-1.5.19.orig/mx.c 2009-01-05 21:20:53.000000000 +0200 -+++ mutt-1.5.19/mx.c 2009-01-06 19:16:04.000000000 +0200 -@@ -30,6 +30,10 @@ - #include "keymap.h" - #include "url.h" - -+#ifdef USE_COMPRESSED -+#include "compress.h" -+#endif -+ - #ifdef USE_IMAP - #include "imap.h" - #endif -@@ -445,6 +449,11 @@ int mx_get_magic (const char *path) - return (-1); - } - -+#ifdef USE_COMPRESSED -+ if (magic == 0 && mutt_can_read_compressed (path)) -+ return M_COMPRESSED; -+#endif -+ - return (magic); - } - -@@ -484,6 +493,13 @@ static int mx_open_mailbox_append (CONTE - { - struct stat sb; - -+#ifdef USE_COMPRESSED -+ /* special case for appending to compressed folders - -+ * even if we can not open them for reading */ -+ if (mutt_can_append_compressed (ctx->path)) -+ mutt_open_append_compressed (ctx); -+#endif -+ - ctx->append = 1; - - #ifdef USE_IMAP -@@ -648,6 +664,11 @@ CONTEXT *mx_open_mailbox (const char *pa - - ctx->magic = mx_get_magic (path); - -+#ifdef USE_COMPRESSED -+ if (ctx->magic == M_COMPRESSED) -+ mutt_open_read_compressed (ctx); -+#endif -+ - if(ctx->magic == 0) - mutt_error (_("%s is not a mailbox."), path); - -@@ -748,6 +769,10 @@ void mx_fastclose_mailbox (CONTEXT *ctx) - mutt_free_header (&ctx->hdrs[i]); - FREE (&ctx->hdrs); - FREE (&ctx->v2r); -+#ifdef USE_COMPRESSED -+ if (ctx->compressinfo) -+ mutt_fast_close_compressed (ctx); -+#endif - FREE (&ctx->path); - FREE (&ctx->pattern); - if (ctx->limit_pattern) -@@ -800,6 +825,12 @@ static int sync_mailbox (CONTEXT *ctx, i - - if (tmp && tmp->new == 0) - mutt_update_mailbox (tmp); -+ -+#ifdef USE_COMPRESSED -+ if (rc == 0 && ctx->compressinfo) -+ return mutt_sync_compressed (ctx); -+#endif -+ - return rc; - } - -@@ -1001,6 +1032,11 @@ int mx_close_mailbox (CONTEXT *ctx, int - !mutt_is_spool(ctx->path) && !option (OPTSAVEEMPTY)) - mx_unlink_empty (ctx->path); - -+#ifdef USE_COMPRESSED -+ if (ctx->compressinfo && mutt_slow_close_compressed (ctx)) -+ return (-1); -+#endif -+ - mx_fastclose_mailbox (ctx); - - return 0; -@@ -1310,6 +1346,11 @@ int mx_check_mailbox (CONTEXT *ctx, int - { - int rc; - -+#ifdef USE_COMPRESSED -+ if (ctx->compressinfo) -+ return mutt_check_mailbox_compressed (ctx); -+#endif -+ - if (ctx) - { - if (ctx->locked) lock = 0; -diff -udprP mutt-1.5.19.orig/mx.h mutt-1.5.19/mx.h ---- mutt-1.5.19.orig/mx.h 2008-03-19 22:07:06.000000000 +0200 -+++ mutt-1.5.19/mx.h 2009-01-06 19:16:04.000000000 +0200 -@@ -40,6 +40,9 @@ enum - M_MAILDIR, - M_IMAP, - M_POP -+#ifdef USE_COMPRESSED -+ , M_COMPRESSED -+#endif - }; - - WHERE short DefaultMagic INITVAL (M_MBOX); -diff -udprP mutt-1.5.19.orig/PATCHES mutt-1.5.19/PATCHES ---- mutt-1.5.19.orig/PATCHES 2008-03-19 22:07:06.000000000 +0200 -+++ mutt-1.5.19/PATCHES 2009-01-06 19:16:04.000000000 +0200 -@@ -0,0 +1 @@ -+rr.compressed -diff -udprP mutt-1.5.19.orig/po/POTFILES.in mutt-1.5.19/po/POTFILES.in ---- mutt-1.5.19.orig/po/POTFILES.in 2008-03-19 22:07:57.000000000 +0200 -+++ mutt-1.5.19/po/POTFILES.in 2009-01-06 19:16:04.000000000 +0200 -@@ -8,6 +8,7 @@ charset.c - color.c - commands.c - compose.c -+compress.c - crypt-gpgme.c - crypt.c - cryptglue.c -diff -udprP mutt-1.5.19.orig/status.c mutt-1.5.19/status.c ---- mutt-1.5.19.orig/status.c 2009-01-05 21:20:53.000000000 +0200 -+++ mutt-1.5.19/status.c 2009-01-06 19:16:04.000000000 +0200 -@@ -96,6 +96,14 @@ status_format_str (char *buf, size_t buf - - case 'f': - snprintf (fmt, sizeof(fmt), "%%%ss", prefix); -+#ifdef USE_COMPRESSED -+ if (Context && Context->compressinfo && Context->realpath) -+ { -+ strfcpy (tmp, Context->realpath, sizeof (tmp)); -+ mutt_pretty_mailbox (tmp, sizeof (tmp)); -+ } -+ else -+#endif - if (Context && Context->path) - { - strfcpy (tmp, Context->path, sizeof (tmp)); diff --git a/mutt-sidebar.patch b/mutt-sidebar.patch deleted file mode 100644 index 3d64557..0000000 --- a/mutt-sidebar.patch +++ /dev/null @@ -1,2334 +0,0 @@ -*** mutt-1.5.24-orig/buffy.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/buffy.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 161,166 **** ---- 161,209 ---- - } - } - -+ static int buffy_compare_name(const void *a, const void *b) { -+ const BUFFY *b1 = * (BUFFY * const *) a; -+ const BUFFY *b2 = * (BUFFY * const *) b; -+ -+ return mutt_strcoll(b1->path, b2->path); -+ } -+ -+ static BUFFY *buffy_sort(BUFFY *b) -+ { -+ BUFFY *tmp = b; -+ int buffycount = 0; -+ BUFFY **ary; -+ int i; -+ -+ if (!option(OPTSIDEBARSORT)) -+ return b; -+ -+ for (; tmp != NULL; tmp = tmp->next) -+ buffycount++; -+ -+ ary = (BUFFY **) safe_calloc(buffycount, sizeof (*ary)); -+ -+ tmp = b; -+ for (i = 0; tmp != NULL; tmp = tmp->next, i++) { -+ ary[i] = tmp; -+ } -+ -+ qsort(ary, buffycount, sizeof(*ary), buffy_compare_name); -+ -+ for (i = 0; i < buffycount - 1; i++) { -+ ary[i]->next = ary[i+1]; -+ } -+ ary[buffycount - 1]->next = NULL; -+ for (i = 1; i < buffycount; i++) { -+ ary[i]->prev = ary[i-1]; -+ } -+ ary[0]->prev = NULL; -+ -+ tmp = ary[0]; -+ free(ary); -+ return tmp; -+ } -+ - BUFFY *mutt_find_mailbox (const char *path) - { - BUFFY *tmp = NULL; -*************** -*** 196,204 **** ---- 239,251 ---- - static BUFFY *buffy_new (const char *path) - { - BUFFY* buffy; -+ char rp[PATH_MAX]; -+ char *r; - - buffy = (BUFFY *) safe_calloc (1, sizeof (BUFFY)); - strfcpy (buffy->path, path, sizeof (buffy->path)); -+ r = realpath(path, rp); -+ strfcpy (buffy->realpath, r ? rp : path, sizeof (buffy->realpath)); - buffy->next = NULL; - buffy->magic = 0; - -*************** -*** 243,250 **** - p = realpath (buf, f1); - for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) - { -! q = realpath ((*tmp)->path, f2); -! if (mutt_strcmp (p ? p : buf, q ? q : (*tmp)->path) == 0) - { - dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path)); - break; ---- 290,297 ---- - p = realpath (buf, f1); - for (tmp = &Incoming; *tmp; tmp = &((*tmp)->next)) - { -! q = (*tmp)->realpath; -! if (mutt_strcmp (p ? p : buf, q) == 0) - { - dprint(3,(debugfile,"mailbox '%s' already registered as '%s'\n", buf, (*tmp)->path)); - break; -*************** -*** 282,287 **** ---- 329,335 ---- - else - (*tmp)->size = 0; - } -+ Incoming = buffy_sort(Incoming); - return 0; - } - -*************** -*** 306,311 **** ---- 354,364 ---- - return 0; - } - -+ if (option(OPTSIDEBAR) && mailbox->msg_unread > 0) { -+ mailbox->new = 1; -+ return 1; -+ } -+ - if ((dirp = opendir (path)) == NULL) - { - mailbox->magic = 0; -*************** -*** 357,362 **** ---- 410,482 ---- - - return 0; - } -+ -+ /* update message counts for the sidebar */ -+ void buffy_maildir_update (BUFFY* mailbox) -+ { -+ char path[_POSIX_PATH_MAX]; -+ DIR *dirp; -+ struct dirent *de; -+ char *p; -+ -+ if(!option(OPTSIDEBAR)) -+ return; -+ -+ mailbox->msgcount = 0; -+ mailbox->msg_unread = 0; -+ mailbox->msg_flagged = 0; -+ -+ snprintf (path, sizeof (path), "%s/new", mailbox->path); -+ -+ if ((dirp = opendir (path)) == NULL) -+ { -+ mailbox->magic = 0; -+ return; -+ } -+ -+ while ((de = readdir (dirp)) != NULL) -+ { -+ if (*de->d_name == '.') -+ continue; -+ -+ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { -+ mailbox->new = 1; -+ mailbox->msgcount++; -+ mailbox->msg_unread++; -+ } -+ } -+ -+ closedir (dirp); -+ snprintf (path, sizeof (path), "%s/cur", mailbox->path); -+ -+ if ((dirp = opendir (path)) == NULL) -+ { -+ mailbox->magic = 0; -+ return; -+ } -+ -+ while ((de = readdir (dirp)) != NULL) -+ { -+ if (*de->d_name == '.') -+ continue; -+ -+ if (!(p = strstr (de->d_name, ":2,")) || !strchr (p + 3, 'T')) { -+ mailbox->msgcount++; -+ if ((p = strstr (de->d_name, ":2,"))) { -+ if (!strchr (p + 3, 'T')) { -+ if (!strchr (p + 3, 'S')) -+ mailbox->msg_unread++; -+ if (strchr(p + 3, 'F')) -+ mailbox->msg_flagged++; -+ } -+ } -+ } -+ } -+ -+ mailbox->sb_last_checked = time(NULL); -+ closedir (dirp); -+ } -+ - /* returns 1 if mailbox has new mail */ - static int buffy_mbox_hasnew (BUFFY* mailbox, struct stat *sb) - { -*************** -*** 368,374 **** - else - statcheck = sb->st_mtime > sb->st_atime - || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); -! if (statcheck) - { - if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) - { ---- 488,494 ---- - else - statcheck = sb->st_mtime > sb->st_atime - || (mailbox->newly_created && sb->st_ctime == sb->st_mtime && sb->st_ctime == sb->st_atime); -! if ((!option(OPTSIDEBAR) && statcheck) || (option(OPTSIDEBAR) && mailbox->msg_unread > 0)) - { - if (!option(OPTMAILCHECKRECENT) || sb->st_mtime > mailbox->last_visited) - { -*************** -*** 388,393 **** ---- 508,534 ---- - return rc; - } - -+ /* update message counts for the sidebar */ -+ void buffy_mbox_update (BUFFY* mailbox, struct stat *sb) -+ { -+ CONTEXT *ctx = NULL; -+ -+ if(!option(OPTSIDEBAR)) -+ return; -+ if(mailbox->sb_last_checked > sb->st_mtime && mailbox->msgcount != 0) -+ return; /* no check necessary */ -+ -+ ctx = mx_open_mailbox(mailbox->path, M_READONLY | M_QUIET | M_NOSORT | M_PEEK, NULL); -+ if(ctx) -+ { -+ mailbox->msgcount = ctx->msgcount; -+ mailbox->msg_unread = ctx->unread; -+ mailbox->msg_flagged = ctx->flagged; -+ mailbox->sb_last_checked = time(NULL); -+ mx_close_mailbox(ctx, 0); -+ } -+ } -+ - int mutt_buffy_check (int force) - { - BUFFY *tmp; -*************** -*** 461,477 **** - { - case M_MBOX: - case M_MMDF: - if (buffy_mbox_hasnew (tmp, &sb) > 0) - BuffyCount++; - break; - - case M_MAILDIR: - if (buffy_maildir_hasnew (tmp) > 0) - BuffyCount++; - break; - - case M_MH: -! mh_buffy(tmp); - if (tmp->new) - BuffyCount++; - break; ---- 602,621 ---- - { - case M_MBOX: - case M_MMDF: -+ buffy_mbox_update (tmp, &sb); - if (buffy_mbox_hasnew (tmp, &sb) > 0) - BuffyCount++; - break; - - case M_MAILDIR: -+ buffy_maildir_update (tmp); - if (buffy_maildir_hasnew (tmp) > 0) - BuffyCount++; - break; - - case M_MH: -! mh_buffy_update (tmp->path, &tmp->msgcount, &tmp->msg_unread, &tmp->msg_flagged, &tmp->sb_last_checked); -! mh_buffy(tmp); - if (tmp->new) - BuffyCount++; - break; -*** mutt-1.5.24-orig/buffy.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/buffy.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 23,35 **** ---- 23,41 ---- - typedef struct buffy_t - { - char path[_POSIX_PATH_MAX]; -+ char realpath[_POSIX_PATH_MAX]; - off_t size; - struct buffy_t *next; -+ struct buffy_t *prev; - short new; /* mailbox has new mail */ -+ int msgcount; /* total number of messages */ -+ int msg_unread; /* number of unread messages */ -+ int msg_flagged; /* number of flagged messages */ - short notified; /* user has been notified */ - short magic; /* mailbox type */ - short newly_created; /* mbox or mmdf just popped into existence */ - time_t last_visited; /* time of last exit from this mailbox */ -+ time_t sb_last_checked; /* time of last buffy check from sidebar */ - } - BUFFY; - -*** mutt-1.5.24-orig/color.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/color.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 94,99 **** ---- 94,101 ---- - { "underline", MT_COLOR_UNDERLINE }, - { "index", MT_COLOR_INDEX }, - { "prompt", MT_COLOR_PROMPT }, -+ { "sidebar_new", MT_COLOR_NEW }, -+ { "sidebar_flagged", MT_COLOR_FLAGGED }, - { NULL, 0 } - }; - -*** mutt-1.5.24-orig/compose.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/compose.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 72,78 **** - - #define HDR_XOFFSET 10 - #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ -! #define W (COLS - HDR_XOFFSET) - - static const char * const Prompts[] = - { ---- 72,78 ---- - - #define HDR_XOFFSET 10 - #define TITLE_FMT "%10s" /* Used for Prompts, which are ASCII */ -! #define W (COLS - HDR_XOFFSET - SidebarWidth) - - static const char * const Prompts[] = - { -*************** -*** 110,116 **** - - static void redraw_crypt_lines (HEADER *msg) - { -! mvaddstr (HDR_CRYPT, 0, "Security: "); - - if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) - { ---- 110,116 ---- - - static void redraw_crypt_lines (HEADER *msg) - { -! mvaddstr (HDR_CRYPT, SidebarWidth, "Security: "); - - if ((WithCrypto & (APPLICATION_PGP | APPLICATION_SMIME)) == 0) - { -*************** -*** 145,151 **** - addstr (_(" (OppEnc mode)")); - - clrtoeol (); -! move (HDR_CRYPTINFO, 0); - clrtoeol (); - - if ((WithCrypto & APPLICATION_PGP) ---- 145,151 ---- - addstr (_(" (OppEnc mode)")); - - clrtoeol (); -! move (HDR_CRYPTINFO, SidebarWidth); - clrtoeol (); - - if ((WithCrypto & APPLICATION_PGP) -*************** -*** 162,168 **** - && (msg->security & ENCRYPT) - && SmimeCryptAlg - && *SmimeCryptAlg) { -! mvprintw (HDR_CRYPTINFO, 40, "%s%s", _("Encrypt with: "), - NONULL(SmimeCryptAlg)); - } - } ---- 162,168 ---- - && (msg->security & ENCRYPT) - && SmimeCryptAlg - && *SmimeCryptAlg) { -! mvprintw (HDR_CRYPTINFO, SidebarWidth + 40, "%s%s", _("Encrypt with: "), - NONULL(SmimeCryptAlg)); - } - } -*************** -*** 175,181 **** - int c; - char *t; - -! mvaddstr (HDR_MIX, 0, " Mix: "); - - if (!chain) - { ---- 175,181 ---- - int c; - char *t; - -! mvaddstr (HDR_MIX, SidebarWidth, " Mix: "); - - if (!chain) - { -*************** -*** 190,196 **** - if (t && t[0] == '0' && t[1] == '\0') - t = ""; - -! if (c + mutt_strlen (t) + 2 >= COLS) - break; - - addstr (NONULL(t)); ---- 190,196 ---- - if (t && t[0] == '0' && t[1] == '\0') - t = ""; - -! if (c + mutt_strlen (t) + 2 >= COLS - SidebarWidth) - break; - - addstr (NONULL(t)); -*************** -*** 242,248 **** - - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), addr, 1); -! mvprintw (line, 0, TITLE_FMT, Prompts[line - 1]); - mutt_paddstr (W, buf); - } - ---- 242,248 ---- - - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), addr, 1); -! mvprintw (line, SidebarWidth, TITLE_FMT, Prompts[line - 1]); - mutt_paddstr (W, buf); - } - -*************** -*** 252,261 **** - draw_envelope_addr (HDR_TO, msg->env->to); - draw_envelope_addr (HDR_CC, msg->env->cc); - draw_envelope_addr (HDR_BCC, msg->env->bcc); -! mvprintw (HDR_SUBJECT, 0, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); - mutt_paddstr (W, NONULL (msg->env->subject)); - draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); -! mvprintw (HDR_FCC, 0, TITLE_FMT, Prompts[HDR_FCC - 1]); - mutt_paddstr (W, fcc); - - if (WithCrypto) ---- 252,261 ---- - draw_envelope_addr (HDR_TO, msg->env->to); - draw_envelope_addr (HDR_CC, msg->env->cc); - draw_envelope_addr (HDR_BCC, msg->env->bcc); -! mvprintw (HDR_SUBJECT, SidebarWidth, TITLE_FMT, Prompts[HDR_SUBJECT - 1]); - mutt_paddstr (W, NONULL (msg->env->subject)); - draw_envelope_addr (HDR_REPLYTO, msg->env->reply_to); -! mvprintw (HDR_FCC, SidebarWidth, TITLE_FMT, Prompts[HDR_FCC - 1]); - mutt_paddstr (W, fcc); - - if (WithCrypto) -*************** -*** 266,272 **** - #endif - - SETCOLOR (MT_COLOR_STATUS); -! mvaddstr (HDR_ATTACH - 1, 0, _("-- Attachments")); - clrtoeol (); - - NORMAL_COLOR; ---- 266,272 ---- - #endif - - SETCOLOR (MT_COLOR_STATUS); -! mvaddstr (HDR_ATTACH - 1, SidebarWidth, _("-- Attachments")); - clrtoeol (); - - NORMAL_COLOR; -*************** -*** 302,308 **** - /* redraw the expanded list so the user can see the result */ - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), *addr, 1); -! move (line, HDR_XOFFSET); - mutt_paddstr (W, buf); - - return 0; ---- 302,308 ---- - /* redraw the expanded list so the user can see the result */ - buf[0] = 0; - rfc822_write_address (buf, sizeof (buf), *addr, 1); -! move (line, HDR_XOFFSET+SidebarWidth); - mutt_paddstr (W, buf); - - return 0; -*************** -*** 562,568 **** - if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) - { - mutt_str_replace (&msg->env->subject, buf); -! move (HDR_SUBJECT, HDR_XOFFSET); - if (msg->env->subject) - mutt_paddstr (W, msg->env->subject); - else ---- 562,568 ---- - if (mutt_get_field ("Subject: ", buf, sizeof (buf), 0) == 0) - { - mutt_str_replace (&msg->env->subject, buf); -! move (HDR_SUBJECT, HDR_XOFFSET + SidebarWidth); - if (msg->env->subject) - mutt_paddstr (W, msg->env->subject); - else -*************** -*** 580,586 **** - { - strfcpy (fcc, buf, fcclen); - mutt_pretty_mailbox (fcc, fcclen); -! move (HDR_FCC, HDR_XOFFSET); - mutt_paddstr (W, fcc); - fccSet = 1; - } ---- 580,586 ---- - { - strfcpy (fcc, buf, fcclen); - mutt_pretty_mailbox (fcc, fcclen); -! move (HDR_FCC, HDR_XOFFSET + SidebarWidth); - mutt_paddstr (W, fcc); - fccSet = 1; - } -*** mutt-1.5.24-orig/configure.ac 2015-08-30 12:24:20.000000000 -0500 ---- mutt-1.5.24/configure.ac 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 1302,1307 **** ---- 1302,1309 ---- - AC_DEFINE(HAVE_LANGINFO_YESEXPR,1,[ Define if you have and nl_langinfo(YESEXPR). ]) - fi - -+ AC_CHECK_FUNCS(fmemopen open_memstream) -+ - dnl Documentation tools - have_openjade="no" - AC_PATH_PROG([OSPCAT], [ospcat], [none]) -*** mutt-1.5.24-orig/curs_main.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/curs_main.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 26,32 **** ---- 26,34 ---- - #include "mailbox.h" - #include "mapping.h" - #include "sort.h" -+ #include "buffy.h" - #include "mx.h" -+ #include "sidebar.h" - - #ifdef USE_POP - #include "pop.h" -*************** -*** 596,615 **** - menu->redraw |= REDRAW_STATUS; - if (do_buffy_notify) - { -! if (mutt_buffy_notify () && option (OPTBEEPNEW)) -! beep (); - } - else - do_buffy_notify = 1; - } - - if (op != -1) - mutt_curs_set (0); - - if (menu->redraw & REDRAW_FULL) - { - menu_redraw_full (menu); - mutt_show_error (); - } - - if (menu->menu == MENU_MAIN) ---- 598,628 ---- - menu->redraw |= REDRAW_STATUS; - if (do_buffy_notify) - { -! if (mutt_buffy_notify ()) -! { -! menu->redraw |= REDRAW_STATUS; -! if (option (OPTBEEPNEW)) -! beep (); -! } - } - else - do_buffy_notify = 1; - } - -+ if(option(OPTSIDEBAR)) -+ menu->redraw |= REDRAW_SIDEBAR; -+ - if (op != -1) - mutt_curs_set (0); - - if (menu->redraw & REDRAW_FULL) - { - menu_redraw_full (menu); -+ draw_sidebar(menu->menu); - mutt_show_error (); -+ } else if(menu->redraw & REDRAW_SIDEBAR) { -+ draw_sidebar(menu->menu); -+ menu->redraw &= ~REDRAW_SIDEBAR; - } - - if (menu->menu == MENU_MAIN) -*************** -*** 631,639 **** ---- 644,655 ---- - - if (menu->redraw & REDRAW_STATUS) - { -+ DrawFullLine = 1; - menu_status_line (buf, sizeof (buf), menu, NONULL (Status)); -+ DrawFullLine = 0; - move (option (OPTSTATUSONTOP) ? 0 : LINES-2, 0); - SETCOLOR (MT_COLOR_STATUS); -+ set_buffystats(Context); - mutt_paddstr (COLS, buf); - NORMAL_COLOR; - menu->redraw &= ~REDRAW_STATUS; -*************** -*** 653,659 **** - menu->oldcurrent = -1; - - if (option (OPTARROWCURSOR)) -! move (menu->current - menu->top + menu->offset, 2); - else if (option (OPTBRAILLEFRIENDLY)) - move (menu->current - menu->top + menu->offset, 0); - else ---- 669,675 ---- - menu->oldcurrent = -1; - - if (option (OPTARROWCURSOR)) -! move (menu->current - menu->top + menu->offset, SidebarWidth + 2); - else if (option (OPTBRAILLEFRIENDLY)) - move (menu->current - menu->top + menu->offset, 0); - else -*************** -*** 1095,1100 **** ---- 1111,1117 ---- - break; - - CHECK_MSGCOUNT; -+ CHECK_VISIBLE; - CHECK_READONLY; - { - int oldvcount = Context->vcount; -*************** -*** 1154,1159 **** ---- 1171,1177 ---- - menu->redraw = REDRAW_FULL; - break; - -+ case OP_SIDEBAR_OPEN: - case OP_MAIN_CHANGE_FOLDER: - case OP_MAIN_NEXT_UNREAD_MAILBOX: - -*************** -*** 1185,1191 **** - { - mutt_buffy (buf, sizeof (buf)); - -! if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) - { - if (menu->menu == MENU_PAGER) - { ---- 1203,1213 ---- - { - mutt_buffy (buf, sizeof (buf)); - -! if ( op == OP_SIDEBAR_OPEN ) { -! if(!CurBuffy) -! break; -! strncpy( buf, CurBuffy->path, sizeof(buf) ); -! } else if (mutt_enter_fname (cp, buf, sizeof (buf), &menu->redraw, 1) == -1) - { - if (menu->menu == MENU_PAGER) - { -*************** -*** 1203,1208 **** ---- 1225,1231 ---- - } - - mutt_expand_path (buf, sizeof (buf)); -+ set_curbuffy(buf); - if (mx_get_magic (buf) <= 0) - { - mutt_error (_("%s is not a mailbox."), buf); -*************** -*** 2293,2298 **** ---- 2316,2327 ---- - mutt_what_key(); - break; - -+ case OP_SIDEBAR_SCROLL_UP: -+ case OP_SIDEBAR_SCROLL_DOWN: -+ case OP_SIDEBAR_NEXT: -+ case OP_SIDEBAR_PREV: -+ scroll_sidebar(op, menu->menu); -+ break; - default: - if (menu->menu == MENU_MAIN) - km_error_key (MENU_MAIN); -*** mutt-1.5.24-orig/flags.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/flags.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 22,29 **** ---- 22,31 ---- - - #include "mutt.h" - #include "mutt_curses.h" -+ #include "mutt_menu.h" - #include "sort.h" - #include "mx.h" -+ #include "sidebar.h" - - void _mutt_set_flag (CONTEXT *ctx, HEADER *h, int flag, int bf, int upd_ctx) - { -*************** -*** 263,268 **** ---- 265,271 ---- - */ - if (h->searched && (changed != h->changed || deleted != ctx->deleted || tagged != ctx->tagged || flagged != ctx->flagged)) - h->searched = 0; -+ draw_sidebar(0); - } - - void mutt_tag_set_flag (int flag, int bf) -*** mutt-1.5.24-orig/functions.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/functions.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 169,174 **** ---- 169,179 ---- - { "decrypt-save", OP_DECRYPT_SAVE, NULL }, - - -+ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, -+ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, -+ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, -+ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, -+ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, - { NULL, 0, NULL } - }; - -*************** -*** 272,277 **** ---- 277,287 ---- - - { "what-key", OP_WHAT_KEY, NULL }, - -+ { "sidebar-scroll-up", OP_SIDEBAR_SCROLL_UP, NULL }, -+ { "sidebar-scroll-down", OP_SIDEBAR_SCROLL_DOWN, NULL }, -+ { "sidebar-next", OP_SIDEBAR_NEXT, NULL }, -+ { "sidebar-prev", OP_SIDEBAR_PREV, NULL }, -+ { "sidebar-open", OP_SIDEBAR_OPEN, NULL }, - { NULL, 0, NULL } - }; - -*** mutt-1.5.24-orig/globals.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/globals.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 118,123 **** ---- 118,126 ---- - WHERE char *SendCharset; - WHERE char *Sendmail; - WHERE char *Shell; -+ WHERE char *SidebarDelim; -+ WHERE char *SidebarFormat; -+ WHERE char *SidebarIndentStr; - WHERE char *Signature; - WHERE char *SimpleSearch; - #if USE_SMTP -*************** -*** 213,218 **** ---- 216,224 ---- - WHERE short ScoreThresholdRead; - WHERE short ScoreThresholdFlag; - -+ WHERE struct buffy_t *CurBuffy INITVAL(0); -+ WHERE short DrawFullLine INITVAL(0); -+ WHERE short SidebarWidth; - #ifdef USE_IMAP - WHERE short ImapKeepalive; - WHERE short ImapPipelineDepth; -*** mutt-1.5.24-orig/handler.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/handler.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 1603,1608 **** ---- 1603,1613 ---- - - fseeko (s->fpin, b->offset, 0); - -+ #ifdef HAVE_FMEMOPEN -+ char *temp; -+ size_t tempsize; -+ #endif -+ - /* see if we need to decode this part before processing it */ - if (b->encoding == ENCBASE64 || b->encoding == ENCQUOTEDPRINTABLE || - b->encoding == ENCUUENCODED || plaintext || -*************** -*** 1618,1623 **** ---- 1623,1636 ---- - { - /* decode to a tempfile, saving the original destination */ - fp = s->fpout; -+ #ifdef HAVE_FMEMOPEN -+ if ((s->fpout = open_memstream(&temp, &tempsize)) == NULL) -+ { -+ mutt_error _("Unable to open memory stream!"); -+ dprint (1, (debugfile, "Can't open memory stream.\n")); -+ return -1; -+ } -+ #else - mutt_mktemp (tempfile, sizeof (tempfile)); - if ((s->fpout = safe_fopen (tempfile, "w")) == NULL) - { -*************** -*** 1625,1630 **** ---- 1638,1644 ---- - dprint (1, (debugfile, "Can't open %s.\n", tempfile)); - return -1; - } -+ #endif - /* decoding the attachment changes the size and offset, so save a copy - * of the "real" values now, and restore them after processing - */ -*************** -*** 1653,1661 **** - /* restore final destination and substitute the tempfile for input */ - s->fpout = fp; - fp = s->fpin; - s->fpin = fopen (tempfile, "r"); - unlink (tempfile); -! - /* restore the prefix */ - s->prefix = savePrefix; - } ---- 1667,1685 ---- - /* restore final destination and substitute the tempfile for input */ - s->fpout = fp; - fp = s->fpin; -+ #ifdef HAVE_FMEMOPEN -+ if(tempsize) -+ s->fpin = fmemopen(temp, tempsize, "r"); -+ else /* fmemopen cannot handle zero-length buffers */ -+ s->fpin = safe_fopen ("/dev/null", "r"); -+ if(s->fpin == NULL) { -+ mutt_perror("failed to re-open memstream!"); -+ return (-1); -+ } -+ #else - s->fpin = fopen (tempfile, "r"); - unlink (tempfile); -! #endif - /* restore the prefix */ - s->prefix = savePrefix; - } -*************** -*** 1680,1685 **** ---- 1704,1713 ---- - - /* restore the original source stream */ - safe_fclose (&s->fpin); -+ #ifdef HAVE_FMEMOPEN -+ if(tempsize) -+ FREE(&temp); -+ #endif - s->fpin = fp; - } - } -*** mutt-1.5.24-orig/init.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/init.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 2016,2021 **** ---- 2016,2069 ---- - ** not used. - ** (PGP only) - */ -+ {"sidebar_delim", DT_STR, R_BOTH, UL &SidebarDelim, UL "|"}, -+ /* -+ ** .pp -+ ** This specifies the delimiter between the sidebar (if visible) and -+ ** other screens. -+ */ -+ {"sidebar_indentstr", DT_STR, R_BOTH, UL &SidebarIndentStr, UL " "}, -+ /* -+ ** .pp -+ ** This specifies the string that is used to indent items -+ ** with sidebar_folderindent= yes -+ */ -+ { "sidebar_visible", DT_BOOL, R_BOTH, OPTSIDEBAR, 0 }, -+ /* -+ ** .pp -+ ** This specifies whether or not to show sidebar (left-side list of folders). -+ */ -+ { "sidebar_sort", DT_BOOL, R_BOTH, OPTSIDEBARSORT, 0 }, -+ /* -+ ** .pp -+ ** This specifies whether or not to sort the sidebar alphabetically. -+ */ -+ { "sidebar_width", DT_NUM, R_BOTH, UL &SidebarWidth, 0 }, -+ /* -+ ** .pp -+ ** The width of the sidebar. -+ */ -+ { "sidebar_shortpath", DT_BOOL, R_BOTH, OPTSIDEBARSHORTPATH, 0 }, -+ /* -+ ** .pp -+ ** Should the sidebar shorten the path showed. -+ */ -+ {"sidebar_format", DT_STR, R_NONE, UL &SidebarFormat, UL "%B%?F? [%F]?%* %?N?%N/?%4S"}, -+ /* -+ ** .pp -+ ** Format string for the sidebar. The sequences `%N', `%F' and `%S' -+ ** will be replaced by the number of new or flagged messages or the total -+ ** size of them mailbox. `%B' will be replaced with the name of the mailbox. -+ ** The `%!' sequence will be expanded to `!' if there is one flagged message; -+ ** to `!!' if there are two flagged messages; and to `n!' for n flagged -+ ** messages, n>2. -+ */ -+ { "sidebar_folderindent", DT_BOOL, R_BOTH, OPTSIDEBARFOLDERINDENT, 0 }, -+ /* -+ ** .pp -+ ** Should folders be indented in the sidebar. -+ */ -+ - { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0}, - /* - ** .pp -*** mutt-1.5.24-orig/mailbox.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/mailbox.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 27,32 **** ---- 27,33 ---- - #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but uses - * safe_fopen() for mbox-style folders. - */ -+ #define M_PEEK (1<<5) /* revert atime back after taking a look (if applicable) */ - - /* mx_open_new_message() */ - #define M_ADD_FROM (1<<0) /* add a From_ line */ -*** mutt-1.5.24-orig/main.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/main.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 50,55 **** ---- 50,56 ---- - #include - #include - #include -+ #include - #include - - #ifdef HAVE_GETOPT_H -*************** -*** 555,561 **** - - int main (int argc, char **argv) - { -! char folder[_POSIX_PATH_MAX] = ""; - char *subject = NULL; - char *includeFile = NULL; - char *draftFile = NULL; ---- 556,562 ---- - - int main (int argc, char **argv) - { -! char folder[PATH_MAX] = ""; - char *subject = NULL; - char *includeFile = NULL; - char *draftFile = NULL; -*************** -*** 1036,1041 **** ---- 1037,1049 ---- - strfcpy (folder, NONULL(Spoolfile), sizeof (folder)); - mutt_expand_path (folder, sizeof (folder)); - -+ { -+ char tmpfolder[PATH_MAX]; -+ strfcpy (tmpfolder, folder, sizeof (tmpfolder)); -+ if(!realpath(tmpfolder, folder)) -+ strfcpy (folder, tmpfolder, sizeof (tmpfolder)); -+ } -+ - mutt_str_replace (&CurrentFolder, folder); - mutt_str_replace (&LastFolder, folder); - -*************** -*** 1058,1063 **** ---- 1066,1072 ---- - if((Context = mx_open_mailbox (folder, ((flags & M_RO) || option (OPTREADONLY)) ? M_READONLY : 0, NULL)) - || !explicit_folder) - { -+ set_curbuffy(folder); - mutt_index_menu (); - if (Context) - FREE (&Context); -*** mutt-1.5.24-orig/Makefile.am 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/Makefile.am 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 33,38 **** ---- 33,39 ---- - rfc822.c rfc1524.c rfc2047.c rfc2231.c rfc3676.c \ - score.c send.c sendlib.c signal.c signature.c sort.c \ - status.c system.c thread.c charset.c history.c lib.c \ -+ sidebar.c \ - muttlib.c editmsg.c mbyte.c \ - url.c ascii.c crypt-mod.c crypt-mod.h safe_asprintf.c - -*** mutt-1.5.24-orig/mbox.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/mbox.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 100,105 **** ---- 100,106 ---- - mutt_perror (ctx->path); - return (-1); - } -+ ctx->atime = sb.st_atime; - ctx->mtime = sb.st_mtime; - ctx->size = sb.st_size; - -*************** -*** 251,256 **** ---- 252,258 ---- - - ctx->size = sb.st_size; - ctx->mtime = sb.st_mtime; -+ ctx->atime = sb.st_atime; - - #ifdef NFS_ATTRIBUTE_HACK - if (sb.st_mtime > sb.st_atime) -*** mutt-1.5.24-orig/menu.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/menu.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 24,29 **** ---- 24,30 ---- - #include "mutt_curses.h" - #include "mutt_menu.h" - #include "mbyte.h" -+ #include "sidebar.h" - - extern size_t UngetCount; - -*************** -*** 186,192 **** - { - char *scratch = safe_strdup (s); - int shift = option (OPTARROWCURSOR) ? 3 : 0; -! int cols = COLS - shift; - - mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); - s[n - 1] = 0; ---- 187,193 ---- - { - char *scratch = safe_strdup (s); - int shift = option (OPTARROWCURSOR) ? 3 : 0; -! int cols = COLS - shift - SidebarWidth; - - mutt_format_string (s, n, cols, cols, FMT_LEFT, ' ', scratch, mutt_strlen (scratch), 1); - s[n - 1] = 0; -*************** -*** 239,244 **** ---- 240,246 ---- - int do_color; - int attr; - -+ draw_sidebar(1); - for (i = menu->top; i < menu->top + menu->pagelen; i++) - { - if (i < menu->max) -*************** -*** 249,255 **** - menu_pad_string (buf, sizeof (buf)); - - ATTRSET(attr); -! move(i - menu->top + menu->offset, 0); - do_color = 1; - - if (i == menu->current) ---- 251,257 ---- - menu_pad_string (buf, sizeof (buf)); - - ATTRSET(attr); -! move(i - menu->top + menu->offset, SidebarWidth); - do_color = 1; - - if (i == menu->current) -*************** -*** 272,278 **** - else - { - NORMAL_COLOR; -! CLEARLINE(i - menu->top + menu->offset); - } - } - NORMAL_COLOR; ---- 274,280 ---- - else - { - NORMAL_COLOR; -! CLEARLINE_WIN (i - menu->top + menu->offset); - } - } - NORMAL_COLOR; -*************** -*** 289,295 **** - return; - } - -! move (menu->oldcurrent + menu->offset - menu->top, 0); - ATTRSET(menu->color (menu->oldcurrent)); - - if (option (OPTARROWCURSOR)) ---- 291,297 ---- - return; - } - -! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth); - ATTRSET(menu->color (menu->oldcurrent)); - - if (option (OPTARROWCURSOR)) -*************** -*** 301,313 **** - { - menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); - menu_pad_string (buf, sizeof (buf)); -! move (menu->oldcurrent + menu->offset - menu->top, 3); - print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); - } - - /* now draw it in the new location */ - SETCOLOR(MT_COLOR_INDICATOR); -! mvaddstr(menu->current + menu->offset - menu->top, 0, "->"); - } - else - { ---- 303,315 ---- - { - menu_make_entry (buf, sizeof (buf), menu, menu->oldcurrent); - menu_pad_string (buf, sizeof (buf)); -! move (menu->oldcurrent + menu->offset - menu->top, SidebarWidth + 3); - print_enriched_string (menu->color(menu->oldcurrent), (unsigned char *) buf, 1); - } - - /* now draw it in the new location */ - SETCOLOR(MT_COLOR_INDICATOR); -! mvaddstr(menu->current + menu->offset - menu->top, SidebarWidth, "->"); - } - else - { -*************** -*** 320,326 **** - menu_make_entry (buf, sizeof (buf), menu, menu->current); - menu_pad_string (buf, sizeof (buf)); - SETCOLOR(MT_COLOR_INDICATOR); -! move(menu->current - menu->top + menu->offset, 0); - print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); - } - menu->redraw &= REDRAW_STATUS; ---- 322,328 ---- - menu_make_entry (buf, sizeof (buf), menu, menu->current); - menu_pad_string (buf, sizeof (buf)); - SETCOLOR(MT_COLOR_INDICATOR); -! move(menu->current - menu->top + menu->offset, SidebarWidth); - print_enriched_string (menu->color(menu->current), (unsigned char *) buf, 0); - } - menu->redraw &= REDRAW_STATUS; -*************** -*** 332,338 **** - char buf[LONG_STRING]; - int attr = menu->color (menu->current); - -! move (menu->current + menu->offset - menu->top, 0); - menu_make_entry (buf, sizeof (buf), menu, menu->current); - menu_pad_string (buf, sizeof (buf)); - ---- 334,340 ---- - char buf[LONG_STRING]; - int attr = menu->color (menu->current); - -! move (menu->current + menu->offset - menu->top, SidebarWidth); - menu_make_entry (buf, sizeof (buf), menu, menu->current); - menu_pad_string (buf, sizeof (buf)); - -*************** -*** 872,878 **** - - - if (option (OPTARROWCURSOR)) -! move (menu->current - menu->top + menu->offset, 2); - else if (option (OPTBRAILLEFRIENDLY)) - move (menu->current - menu->top + menu->offset, 0); - else ---- 874,880 ---- - - - if (option (OPTARROWCURSOR)) -! move (menu->current - menu->top + menu->offset, SidebarWidth + 2); - else if (option (OPTBRAILLEFRIENDLY)) - move (menu->current - menu->top + menu->offset, 0); - else -*** mutt-1.5.24-orig/mh.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/mh.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 295,300 **** ---- 295,326 ---- - mhs_free_sequences (&mhs); - } - -+ void mh_buffy_update (const char *path, int *msgcount, int *msg_unread, int *msg_flagged, time_t *sb_last_checked) -+ { -+ int i; -+ struct mh_sequences mhs; -+ memset (&mhs, 0, sizeof (mhs)); -+ -+ if(!option(OPTSIDEBAR)) -+ return; -+ -+ if (mh_read_sequences (&mhs, path) < 0) -+ return; -+ -+ msgcount = 0; -+ msg_unread = 0; -+ msg_flagged = 0; -+ for (i = 0; i <= mhs.max; i++) -+ msgcount++; -+ if (mhs_check (&mhs, i) & MH_SEQ_UNSEEN) { -+ msg_unread++; -+ } -+ if (mhs_check (&mhs, i) & MH_SEQ_FLAGGED) -+ msg_flagged++; -+ mhs_free_sequences (&mhs); -+ *sb_last_checked = time(NULL); -+ } -+ - static int mh_mkstemp (CONTEXT * dest, FILE ** fp, char **tgt) - { - int fd; -*** mutt-1.5.24-orig/mutt_curses.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/mutt_curses.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 64,69 **** ---- 64,70 ---- - #undef lines - #endif /* lines */ - -+ #define CLEARLINE_WIN(x) move(x,SidebarWidth), clrtoeol() - #define CLEARLINE(x) move(x,0), clrtoeol() - #define CENTERLINE(x,y) move(y, (COLS-strlen(x))/2), addstr(x) - #define BEEP() do { if (option (OPTBEEP)) beep(); } while (0) -*************** -*** 121,126 **** ---- 122,129 ---- - MT_COLOR_UNDERLINE, - MT_COLOR_INDEX, - MT_COLOR_PROMPT, -+ MT_COLOR_NEW, -+ MT_COLOR_FLAGGED, - MT_COLOR_MAX - }; - -*** mutt-1.5.24-orig/mutt_menu.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/mutt_menu.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 34,39 **** ---- 34,40 ---- - #define REDRAW_FULL (1<<5) - #define REDRAW_BODY (1<<6) - #define REDRAW_SIGWINCH (1<<7) -+ #define REDRAW_SIDEBAR (1<<8) - - #define M_MODEFMT "-- Mutt: %s" - -*** mutt-1.5.24-orig/mutt.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/mutt.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 423,428 **** ---- 423,432 ---- - OPTSAVEEMPTY, - OPTSAVENAME, - OPTSCORE, -+ OPTSIDEBAR, -+ OPTSIDEBARSHORTPATH, -+ OPTSIDEBARSORT, -+ OPTSIDEBARFOLDERINDENT, - OPTSIGDASHES, - OPTSIGONTOP, - OPTSORTRE, -*************** -*** 866,871 **** ---- 870,876 ---- - { - char *path; - FILE *fp; -+ time_t atime; - time_t mtime; - off_t size; - off_t vsize; -*************** -*** 900,905 **** ---- 905,911 ---- - unsigned int quiet : 1; /* inhibit status messages? */ - unsigned int collapsed : 1; /* are all threads collapsed? */ - unsigned int closing : 1; /* mailbox is being closed */ -+ unsigned int peekonly : 1; /* just taking a glance, revert atime */ - - /* driver hooks */ - void *data; /* driver specific data */ -*** mutt-1.5.24-orig/muttlib.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/muttlib.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 1276,1281 **** ---- 1276,1283 ---- - pl = pw = 1; - - /* see if there's room to add content, else ignore */ -+ if ( DrawFullLine ) -+ { - if ((col < COLS && wlen < destlen) || soft) - { - int pad; -*************** -*** 1319,1324 **** ---- 1321,1372 ---- - col += wid; - src += pl; - } -+ } -+ else -+ { -+ if ((col < COLS-SidebarWidth && wlen < destlen) || soft) -+ { -+ int pad; -+ -+ /* get contents after padding */ -+ mutt_FormatString (buf, sizeof (buf), 0, src + pl, callback, data, flags); -+ len = mutt_strlen (buf); -+ wid = mutt_strwidth (buf); -+ -+ /* try to consume as many columns as we can, if we don't have -+ * memory for that, use as much memory as possible */ -+ pad = (COLS - SidebarWidth - col - wid) / pw; -+ if (pad > 0 && wlen + (pad * pl) + len > destlen) -+ pad = ((signed)(destlen - wlen - len)) / pl; -+ if (pad > 0) -+ { -+ while (pad--) -+ { -+ memcpy (wptr, src, pl); -+ wptr += pl; -+ wlen += pl; -+ col += pw; -+ } -+ } -+ else if (soft && pad < 0) -+ { -+ /* \0-terminate dest for length computation in mutt_wstr_trunc() */ -+ *wptr = 0; -+ /* make sure right part is at most as wide as display */ -+ len = mutt_wstr_trunc (buf, destlen, COLS, &wid); -+ /* truncate left so that right part fits completely in */ -+ wlen = mutt_wstr_trunc (dest, destlen - len, col + pad, &col); -+ wptr = dest + wlen; -+ } -+ if (len + wlen > destlen) -+ len = mutt_wstr_trunc (buf, destlen - wlen, COLS - SidebarWidth - col, NULL); -+ memcpy (wptr, buf, len); -+ wptr += len; -+ wlen += len; -+ col += wid; -+ src += pl; -+ } -+ } - break; /* skip rest of input */ - } - else if (ch == '|') -*** mutt-1.5.24-orig/mx.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/mx.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 580,585 **** ---- 580,586 ---- - * M_APPEND open mailbox for appending - * M_READONLY open mailbox in read-only mode - * M_QUIET only print error messages -+ * M_PEEK revert atime where applicable - * ctx if non-null, context struct to use - */ - CONTEXT *mx_open_mailbox (const char *path, int flags, CONTEXT *pctx) -*************** -*** 602,607 **** ---- 603,610 ---- - ctx->quiet = 1; - if (flags & M_READONLY) - ctx->readonly = 1; -+ if (flags & M_PEEK) -+ ctx->peekonly = 1; - - if (flags & (M_APPEND|M_NEWFOLDER)) - { -*************** -*** 701,713 **** - void mx_fastclose_mailbox (CONTEXT *ctx) - { - int i; - - if(!ctx) - return; - - /* never announce that a mailbox we've just left has new mail. #3290 - * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ -! mutt_buffy_setnotified(ctx->path); - - if (ctx->mx_close) - ctx->mx_close (ctx); ---- 704,729 ---- - void mx_fastclose_mailbox (CONTEXT *ctx) - { - int i; -+ #ifndef BUFFY_SIZE -+ struct utimbuf ut; -+ #endif - - if(!ctx) - return; -+ #ifndef BUFFY_SIZE -+ /* fix up the times so buffy won't get confused */ -+ if (ctx->peekonly && ctx->path && ctx->mtime > ctx->atime) -+ { -+ ut.actime = ctx->atime; -+ ut.modtime = ctx->mtime; -+ utime (ctx->path, &ut); -+ } -+ #endif - - /* never announce that a mailbox we've just left has new mail. #3290 - * XXX: really belongs in mx_close_mailbox, but this is a nice hook point */ -! if(!ctx->peekonly) -! mutt_buffy_setnotified(ctx->path); - - if (ctx->mx_close) - ctx->mx_close (ctx); -*************** -*** 719,724 **** ---- 735,742 ---- - mutt_clear_threads (ctx); - for (i = 0; i < ctx->msgcount; i++) - mutt_free_header (&ctx->hdrs[i]); -+ ctx->msgcount -= ctx->deleted; -+ set_buffystats(ctx); - FREE (&ctx->hdrs); - FREE (&ctx->v2r); - FREE (&ctx->path); -*************** -*** 812,817 **** ---- 830,839 ---- - if (!ctx->hdrs[i]->deleted && ctx->hdrs[i]->read - && !(ctx->hdrs[i]->flagged && option (OPTKEEPFLAGGED))) - read_msgs++; -+ if (ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read) -+ ctx->unread--; -+ if (ctx->hdrs[i]->deleted && ctx->hdrs[i]->flagged) -+ ctx->flagged--; - } - - if (read_msgs && quadoption (OPT_MOVE) != M_NO) -*** mutt-1.5.24-orig/mx.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/mx.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 57,62 **** ---- 57,63 ---- - int mh_read_dir (CONTEXT *, const char *); - int mh_sync_mailbox (CONTEXT *, int *); - int mh_check_mailbox (CONTEXT *, int *); -+ void mh_buffy_update (const char *, int *, int *, int *, time_t *); - int mh_check_empty (const char *); - - int maildir_read_dir (CONTEXT *); -*** mutt-1.5.24-orig/OPS 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/OPS 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 179,181 **** ---- 179,186 ---- - OP_MAIN_SHOW_LIMIT "show currently active limit pattern" - OP_MAIN_COLLAPSE_THREAD "collapse/uncollapse current thread" - OP_MAIN_COLLAPSE_ALL "collapse/uncollapse all threads" -+ OP_SIDEBAR_SCROLL_UP "scroll the mailbox pane up 1 page" -+ OP_SIDEBAR_SCROLL_DOWN "scroll the mailbox pane down 1 page" -+ OP_SIDEBAR_NEXT "go down to next mailbox" -+ OP_SIDEBAR_PREV "go to previous mailbox" -+ OP_SIDEBAR_OPEN "open hilighted mailbox" -*** mutt-1.5.24-orig/pager.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/pager.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 29,34 **** ---- 29,35 ---- - #include "pager.h" - #include "attach.h" - #include "mbyte.h" -+ #include "sidebar.h" - - #include "mutt_crypt.h" - -*************** -*** 1095,1100 **** ---- 1096,1102 ---- - wchar_t wc; - mbstate_t mbstate; - int wrap_cols = mutt_term_width ((flags & M_PAGER_NOWRAP) ? 0 : Wrap); -+ wrap_cols -= SidebarWidth; - - if (check_attachment_marker ((char *)buf) == 0) - wrap_cols = COLS; -*************** -*** 1572,1577 **** ---- 1574,1580 ---- - - int bodyoffset = 1; /* offset of first line of real text */ - int statusoffset = 0; /* offset for the status bar */ -+ int statuswidth; - int helpoffset = LINES - 2; /* offset for the help bar. */ - int bodylen = LINES - 2 - bodyoffset; /* length of displayable area */ - -*************** -*** 1746,1752 **** - if ((redraw & REDRAW_BODY) || topline != oldtopline) - { - do { -! move (bodyoffset, 0); - curline = oldtopline = topline; - lines = 0; - force_redraw = 0; ---- 1749,1755 ---- - if ((redraw & REDRAW_BODY) || topline != oldtopline) - { - do { -! move (bodyoffset, SidebarWidth); - curline = oldtopline = topline; - lines = 0; - force_redraw = 0; -*************** -*** 1759,1764 **** ---- 1762,1768 ---- - &QuoteList, &q_level, &force_redraw, &SearchRE) > 0) - lines++; - curline++; -+ move(lines + bodyoffset, SidebarWidth); - } - last_offset = lineInfo[curline].offset; - } while (force_redraw); -*************** -*** 1771,1776 **** ---- 1775,1781 ---- - addch ('~'); - addch ('\n'); - lines++; -+ move(lines + bodyoffset, SidebarWidth); - } - NORMAL_COLOR; - -*************** -*** 1788,1816 **** - hfi.ctx = Context; - hfi.pager_progress = pager_progress_str; - - if (last_pos < sb.st_size - 1) - snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size)); - else - strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str)); - - /* print out the pager status bar */ -! move (statusoffset, 0); - SETCOLOR (MT_COLOR_STATUS); - - if (IsHeader (extra) || IsMsgAttach (extra)) - { -! size_t l1 = COLS * MB_LEN_MAX; - size_t l2 = sizeof (buffer); - hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; - mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); -! mutt_paddstr (COLS, buffer); - } - else - { - char bn[STRING]; - snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); -! mutt_paddstr (COLS, bn); - } - NORMAL_COLOR; - if (option(OPTTSENABLED) && TSSupported) - { ---- 1793,1831 ---- - hfi.ctx = Context; - hfi.pager_progress = pager_progress_str; - -+ statuswidth = COLS - (option(OPTSTATUSONTOP) && PagerIndexLines > 0 ? SidebarWidth : 0); -+ - if (last_pos < sb.st_size - 1) - snprintf(pager_progress_str, sizeof(pager_progress_str), OFF_T_FMT "%%", (100 * last_offset / sb.st_size)); - else - strfcpy(pager_progress_str, (topline == 0) ? "all" : "end", sizeof(pager_progress_str)); - - /* print out the pager status bar */ -! move (statusoffset, SidebarWidth); - SETCOLOR (MT_COLOR_STATUS); -+ if(option(OPTSTATUSONTOP) && PagerIndexLines > 0) { -+ CLEARLINE_WIN (statusoffset); -+ } else { -+ CLEARLINE (statusoffset); -+ DrawFullLine = 1; /* for mutt_make_string_info */ -+ } - - if (IsHeader (extra) || IsMsgAttach (extra)) - { -! size_t l1 = statuswidth * MB_LEN_MAX; - size_t l2 = sizeof (buffer); - hfi.hdr = (IsHeader (extra)) ? extra->hdr : extra->bdy->hdr; - mutt_make_string_info (buffer, l1 < l2 ? l1 : l2, NONULL (PagerFmt), &hfi, M_FORMAT_MAKEPRINT); -! mutt_paddstr (statuswidth, buffer); - } - else - { - char bn[STRING]; - snprintf (bn, sizeof (bn), "%s (%s)", banner, pager_progress_str); -! mutt_paddstr (statuswidth, bn); - } -+ if(!option(OPTSTATUSONTOP) || PagerIndexLines == 0) -+ DrawFullLine = 0; /* reset */ - NORMAL_COLOR; - if (option(OPTTSENABLED) && TSSupported) - { -*************** -*** 1826,1841 **** - /* redraw the pager_index indicator, because the - * flags for this message might have changed. */ - menu_redraw_current (index); - - /* print out the index status bar */ - menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); - -! move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), 0); - SETCOLOR (MT_COLOR_STATUS); -! mutt_paddstr (COLS, buffer); - NORMAL_COLOR; - } - - redraw = 0; - - if (option(OPTBRAILLEFRIENDLY)) { ---- 1841,1862 ---- - /* redraw the pager_index indicator, because the - * flags for this message might have changed. */ - menu_redraw_current (index); -+ draw_sidebar(MENU_PAGER); - - /* print out the index status bar */ - menu_status_line (buffer, sizeof (buffer), index, NONULL(Status)); - -! move (indexoffset + (option (OPTSTATUSONTOP) ? 0 : (indexlen - 1)), -! (option(OPTSTATUSONTOP) ? 0: SidebarWidth)); - SETCOLOR (MT_COLOR_STATUS); -! mutt_paddstr (COLS - (option(OPTSTATUSONTOP) ? 0 : SidebarWidth), buffer); - NORMAL_COLOR; - } - -+ /* if we're not using the index, update every time */ -+ if ( index == 0 ) -+ draw_sidebar(MENU_PAGER); -+ - redraw = 0; - - if (option(OPTBRAILLEFRIENDLY)) { -*************** -*** 2770,2775 **** ---- 2791,2803 ---- - mutt_what_key (); - break; - -+ case OP_SIDEBAR_SCROLL_UP: -+ case OP_SIDEBAR_SCROLL_DOWN: -+ case OP_SIDEBAR_NEXT: -+ case OP_SIDEBAR_PREV: -+ scroll_sidebar(ch, MENU_PAGER); -+ break; -+ - default: - ch = -1; - break; -*** mutt-1.5.24-orig/pattern.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/pattern.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 154,159 **** ---- 154,163 ---- - HEADER *h = ctx->hdrs[msgno]; - char *buf; - size_t blen; -+ #ifdef HAVE_FMEMOPEN -+ char *temp; -+ size_t tempsize; -+ #endif - - if ((msg = mx_open_message (ctx, msgno)) != NULL) - { -*************** -*** 163,174 **** ---- 167,186 ---- - memset (&s, 0, sizeof (s)); - s.fpin = msg->fp; - s.flags = M_CHARCONV; -+ #ifdef HAVE_FMEMOPEN -+ if((s.fpout = open_memstream(&temp, &tempsize)) == NULL) -+ { -+ mutt_perror ("Error opening memstream"); -+ return (0); -+ } -+ #else - mutt_mktemp (tempfile, sizeof (tempfile)); - if ((s.fpout = safe_fopen (tempfile, "w+")) == NULL) - { - mutt_perror (tempfile); - return (0); - } -+ #endif - - if (pat->op != M_BODY) - mutt_copy_header (msg->fp, h, s.fpout, CH_FROM | CH_DECODE, NULL); -*************** -*** 184,190 **** ---- 196,206 ---- - if (s.fpout) - { - safe_fclose (&s.fpout); -+ #ifdef HAVE_FMEMOPEN -+ FREE(&temp); -+ #else - unlink (tempfile); -+ #endif - } - return (0); - } -*************** -*** 193,203 **** ---- 209,236 ---- - mutt_body_handler (h->content, &s); - } - -+ #ifdef HAVE_FMEMOPEN -+ fclose(s.fpout); -+ lng = tempsize; -+ -+ if(tempsize) { -+ if ((fp = fmemopen(temp, tempsize, "r")) == NULL) { -+ mutt_perror ("Error re-opening memstream"); -+ return (0); -+ } -+ } else { /* fmemopen cannot handle empty buffers */ -+ if ((fp = safe_fopen ("/dev/null", "r")) == NULL) { -+ mutt_perror ("Error opening /dev/null"); -+ return (0); -+ } -+ } -+ #else - fp = s.fpout; - fflush (fp); - fseek (fp, 0, 0); - fstat (fileno (fp), &st); - lng = (long) st.st_size; -+ #endif - } - else - { -*************** -*** 244,250 **** ---- 277,288 ---- - if (option (OPTTHOROUGHSRC)) - { - safe_fclose (&fp); -+ #ifdef HAVE_FMEMOPEN -+ if(tempsize) -+ FREE (&temp); -+ #else - unlink (tempfile); -+ #endif - } - } - -*** mutt-1.5.24-orig/PATCHES 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/PATCHES 2015-11-11 09:39:02.000000000 -0600 -*************** -*** 0 **** ---- 1 ---- -+ patch-1.5.24.sidebar.20151111.txt -*** mutt-1.5.24-orig/protos.h 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/protos.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 36,41 **** ---- 36,48 ---- - const char *pager_progress; - }; - -+ struct sidebar_entry { -+ char box[SHORT_STRING]; -+ unsigned int size; -+ unsigned int new; -+ unsigned int flagged; -+ }; -+ - void mutt_make_string_info (char *, size_t, const char *, struct hdr_format_info *, format_flag); - - int mutt_extract_token (BUFFER *, BUFFER *, int); -*** mutt-1.5.24-orig/sidebar.c 1969-12-31 18:00:00.000000000 -0600 ---- mutt-1.5.24/sidebar.c 2015-11-11 09:38:45.000000000 -0600 -*************** -*** 0 **** ---- 1,410 ---- -+ /* -+ * Copyright (C) ????-2004 Justin Hibbits -+ * Copyright (C) 2004 Thomer M. Gil -+ * -+ * 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; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * 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. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. -+ */ -+ -+ -+ #if HAVE_CONFIG_H -+ # include "config.h" -+ #endif -+ -+ #include "mutt.h" -+ #include "mutt_menu.h" -+ #include "mutt_curses.h" -+ #include "sidebar.h" -+ #include "buffy.h" -+ #include -+ #include "keymap.h" -+ #include -+ -+ /*BUFFY *CurBuffy = 0;*/ -+ static BUFFY *TopBuffy = 0; -+ static BUFFY *BottomBuffy = 0; -+ static int known_lines = 0; -+ -+ void calc_boundaries() { -+ -+ BUFFY *tmp = Incoming; -+ -+ int count = LINES - 2 - (option(OPTHELP) ? 1 : 0); -+ -+ if ( known_lines != LINES ) { -+ TopBuffy = BottomBuffy = 0; -+ known_lines = LINES; -+ } -+ for ( ; tmp->next != 0; tmp = tmp->next ) -+ tmp->next->prev = tmp; -+ -+ if ( TopBuffy == 0 && BottomBuffy == 0 ) -+ TopBuffy = Incoming; -+ if ( BottomBuffy == 0 ) { -+ BottomBuffy = TopBuffy; -+ while ( --count && BottomBuffy->next ) -+ BottomBuffy = BottomBuffy->next; -+ } -+ else if ( TopBuffy == CurBuffy->next ) { -+ BottomBuffy = CurBuffy; -+ tmp = BottomBuffy; -+ while ( --count && tmp->prev) -+ tmp = tmp->prev; -+ TopBuffy = tmp; -+ } -+ else if ( BottomBuffy == CurBuffy->prev ) { -+ TopBuffy = CurBuffy; -+ tmp = TopBuffy; -+ while ( --count && tmp->next ) -+ tmp = tmp->next; -+ BottomBuffy = tmp; -+ } -+ } -+ -+ static const char * -+ sidebar_format_str (char *dest, -+ size_t destlen, -+ size_t col, -+ char op, -+ const char *src, -+ const char *prefix, -+ const char *ifstring, -+ const char *elsestring, -+ unsigned long data, -+ format_flag flags) -+ { -+ /* casting from unsigned long - srsly?! */ -+ struct sidebar_entry *sbe = (struct sidebar_entry *) data; -+ unsigned int optional; -+ char fmt[SHORT_STRING], buf[SHORT_STRING]; -+ -+ optional = flags & M_FORMAT_OPTIONAL; -+ -+ switch(op) { -+ case 'F': -+ if(!optional) { -+ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); -+ snprintf (dest, destlen, fmt, sbe->flagged); -+ } else if(sbe->flagged == 0) { -+ optional = 0; -+ } -+ break; -+ -+ case '!': -+ if(sbe->flagged == 0) -+ mutt_format_s(dest, destlen, prefix, ""); -+ if(sbe->flagged == 1) -+ mutt_format_s(dest, destlen, prefix, "!"); -+ if(sbe->flagged == 2) -+ mutt_format_s(dest, destlen, prefix, "!!"); -+ if(sbe->flagged > 2) { -+ snprintf (buf, sizeof (buf), "%d!", sbe->flagged); -+ mutt_format_s(dest, destlen, prefix, buf); -+ } -+ break; -+ -+ case 'S': -+ if(!optional) { -+ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); -+ snprintf (dest, destlen, fmt, sbe->size); -+ } else if (sbe->size == 0) { -+ optional = 0; -+ } -+ break; -+ -+ case 'N': -+ if(!optional) { -+ snprintf (fmt, sizeof (fmt), "%%%sd", prefix); -+ snprintf (dest, destlen, fmt, sbe->new); -+ } else if(sbe->new == 0) { -+ optional = 0; -+ } -+ break; -+ -+ case 'B': -+ mutt_format_s(dest, destlen, prefix, sbe->box); -+ break; -+ } -+ -+ if(optional) -+ mutt_FormatString (dest, destlen, col, ifstring, sidebar_format_str, (unsigned long) sbe, flags); -+ else if (flags & M_FORMAT_OPTIONAL) -+ mutt_FormatString (dest, destlen, col, elsestring, sidebar_format_str, (unsigned long) sbe, flags); -+ -+ return (src); -+ } -+ -+ char *make_sidebar_entry(char *box, unsigned int size, unsigned int new, unsigned int flagged) { -+ static char *entry = 0; -+ struct sidebar_entry sbe; -+ int SBvisual; -+ -+ SBvisual = SidebarWidth - strlen(SidebarDelim); -+ if (SBvisual < 1) -+ return NULL; -+ -+ sbe.new = new; -+ sbe.flagged = flagged; -+ sbe.size = size; -+ strncpy(sbe.box, box, 31); -+ -+ safe_realloc(&entry, SBvisual + 2); -+ entry[SBvisual + 1] = '\0'; -+ -+ mutt_FormatString (entry, SBvisual+1, 0, SidebarFormat, sidebar_format_str, (unsigned long) &sbe, 0); -+ -+ return entry; -+ } -+ -+ void set_curbuffy(char buf[LONG_STRING]) -+ { -+ BUFFY* tmp = CurBuffy = Incoming; -+ -+ if (!Incoming) -+ return; -+ -+ while(1) { -+ if(!strcmp(tmp->path, buf) || !strcmp(tmp->realpath, buf)) { -+ CurBuffy = tmp; -+ break; -+ } -+ -+ if(tmp->next) -+ tmp = tmp->next; -+ else -+ break; -+ } -+ } -+ -+ int draw_sidebar(int menu) { -+ -+ BUFFY *tmp; -+ #ifndef USE_SLANG_CURSES -+ attr_t attrs; -+ #endif -+ short delim_len = strlen(SidebarDelim); -+ short color_pair; -+ -+ static bool initialized = false; -+ static int prev_show_value; -+ static short saveSidebarWidth; -+ int lines = 0; -+ int SidebarHeight; -+ -+ if(option(OPTSTATUSONTOP) || option(OPTHELP)) -+ lines++; /* either one will occupy the first line */ -+ -+ /* initialize first time */ -+ if(!initialized) { -+ prev_show_value = option(OPTSIDEBAR); -+ saveSidebarWidth = SidebarWidth; -+ if(!option(OPTSIDEBAR)) SidebarWidth = 0; -+ initialized = true; -+ } -+ -+ /* save or restore the value SidebarWidth */ -+ if(prev_show_value != option(OPTSIDEBAR)) { -+ if(prev_show_value && !option(OPTSIDEBAR)) { -+ saveSidebarWidth = SidebarWidth; -+ SidebarWidth = 0; -+ } else if(!prev_show_value && option(OPTSIDEBAR)) { -+ mutt_buffy_check(1); /* we probably have bad or no numbers */ -+ SidebarWidth = saveSidebarWidth; -+ } -+ prev_show_value = option(OPTSIDEBAR); -+ } -+ -+ -+ /* if ( SidebarWidth == 0 ) return 0; */ -+ if (SidebarWidth > 0 && option (OPTSIDEBAR) -+ && delim_len >= SidebarWidth) { -+ unset_option (OPTSIDEBAR); -+ /* saveSidebarWidth = SidebarWidth; */ -+ if (saveSidebarWidth > delim_len) { -+ SidebarWidth = saveSidebarWidth; -+ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar.")); -+ sleep (2); -+ } else { -+ SidebarWidth = 0; -+ mutt_error (_("Value for sidebar_delim is too long. Disabling sidebar. Please set your sidebar_width to a sane value.")); -+ sleep (4); /* the advise to set a sane value should be seen long enough */ -+ } -+ saveSidebarWidth = 0; -+ return (0); -+ } -+ -+ if ( SidebarWidth == 0 || !option(OPTSIDEBAR)) { -+ if (SidebarWidth > 0) { -+ saveSidebarWidth = SidebarWidth; -+ SidebarWidth = 0; -+ } -+ unset_option(OPTSIDEBAR); -+ return 0; -+ } -+ -+ /* get attributes for divider */ -+ SETCOLOR(MT_COLOR_STATUS); -+ #ifndef USE_SLANG_CURSES -+ attr_get(&attrs, &color_pair, 0); -+ #else -+ color_pair = attr_get(); -+ #endif -+ SETCOLOR(MT_COLOR_NORMAL); -+ -+ /* draw the divider */ -+ -+ SidebarHeight = LINES - 1; -+ if(option(OPTHELP) || !option(OPTSTATUSONTOP)) -+ SidebarHeight--; -+ -+ for ( ; lines < SidebarHeight; lines++ ) { -+ move(lines, SidebarWidth - delim_len); -+ addstr(NONULL(SidebarDelim)); -+ #ifndef USE_SLANG_CURSES -+ mvchgat(lines, SidebarWidth - delim_len, delim_len, 0, color_pair, NULL); -+ #endif -+ } -+ -+ if ( Incoming == 0 ) return 0; -+ lines = 0; -+ if(option(OPTSTATUSONTOP) || option(OPTHELP)) -+ lines++; /* either one will occupy the first line */ -+ -+ if ( known_lines != LINES || TopBuffy == 0 || BottomBuffy == 0 ) -+ calc_boundaries(menu); -+ if ( CurBuffy == 0 ) CurBuffy = Incoming; -+ -+ tmp = TopBuffy; -+ -+ SETCOLOR(MT_COLOR_NORMAL); -+ -+ for ( ; tmp && lines < SidebarHeight; tmp = tmp->next ) { -+ if ( tmp == CurBuffy ) -+ SETCOLOR(MT_COLOR_INDICATOR); -+ else if ( tmp->msg_unread > 0 ) -+ SETCOLOR(MT_COLOR_NEW); -+ else if ( tmp->msg_flagged > 0 ) -+ SETCOLOR(MT_COLOR_FLAGGED); -+ else -+ SETCOLOR(MT_COLOR_NORMAL); -+ -+ move( lines, 0 ); -+ if ( Context && Context->path && -+ (!strcmp(tmp->path, Context->path)|| -+ !strcmp(tmp->realpath, Context->path)) ) { -+ tmp->msg_unread = Context->unread; -+ tmp->msgcount = Context->msgcount; -+ tmp->msg_flagged = Context->flagged; -+ } -+ /* check whether Maildir is a prefix of the current folder's path */ -+ short maildir_is_prefix = 0; -+ if ( (strlen(tmp->path) > strlen(Maildir)) && -+ (strncmp(Maildir, tmp->path, strlen(Maildir)) == 0) ) -+ maildir_is_prefix = 1; -+ /* calculate depth of current folder and generate its display name with indented spaces */ -+ int sidebar_folder_depth = 0; -+ char *sidebar_folder_name; -+ sidebar_folder_name = option(OPTSIDEBARSHORTPATH) ? mutt_basename(tmp->path) : tmp->path + maildir_is_prefix*(strlen(Maildir) + ((Maildir[strlen(Maildir) - 1] == '/' || Maildir[strlen(Maildir) - 1] == '}') ? 0 : 1)); -+ if ( maildir_is_prefix && option(OPTSIDEBARFOLDERINDENT) ) { -+ char *tmp_folder_name; -+ int i; -+ tmp_folder_name = tmp->path + strlen(Maildir) + 1; -+ for (i = 0; i < strlen(tmp->path) - strlen(Maildir); i++) { -+ if (tmp_folder_name[i] == '/' || tmp_folder_name[i] == '.') sidebar_folder_depth++; -+ } -+ if (sidebar_folder_depth > 0) { -+ if (option(OPTSIDEBARSHORTPATH)) { -+ tmp_folder_name = strrchr(tmp->path, '.'); -+ if (tmp_folder_name == NULL) -+ tmp_folder_name = mutt_basename(tmp->path); -+ else -+ tmp_folder_name++; -+ } -+ else -+ tmp_folder_name = tmp->path + strlen(Maildir) + 1; -+ sidebar_folder_name = malloc(strlen(tmp_folder_name) + sidebar_folder_depth*strlen(NONULL(SidebarIndentStr)) + 1); -+ sidebar_folder_name[0]=0; -+ for (i=0; i < sidebar_folder_depth; i++) -+ strncat(sidebar_folder_name, NONULL(SidebarIndentStr), strlen(NONULL(SidebarIndentStr))); -+ strncat(sidebar_folder_name, tmp_folder_name, strlen(tmp_folder_name)); -+ } -+ } -+ printw( "%.*s", SidebarWidth - delim_len + 1, -+ make_sidebar_entry(sidebar_folder_name, tmp->msgcount, -+ tmp->msg_unread, tmp->msg_flagged)); -+ if (sidebar_folder_depth > 0) -+ free(sidebar_folder_name); -+ lines++; -+ } -+ SETCOLOR(MT_COLOR_NORMAL); -+ for ( ; lines < SidebarHeight; lines++ ) { -+ int i = 0; -+ move( lines, 0 ); -+ for ( ; i < SidebarWidth - delim_len; i++ ) -+ addch(' '); -+ } -+ return 0; -+ } -+ -+ -+ void set_buffystats(CONTEXT* Context) -+ { -+ BUFFY *tmp = Incoming; -+ while(tmp) { -+ if(Context && (!strcmp(tmp->path, Context->path) || -+ !strcmp(tmp->realpath, Context->path))) { -+ tmp->msg_unread = Context->unread; -+ tmp->msgcount = Context->msgcount; -+ tmp->msg_flagged = Context->flagged; -+ break; -+ } -+ tmp = tmp->next; -+ } -+ } -+ -+ void scroll_sidebar(int op, int menu) -+ { -+ if(!SidebarWidth) return; -+ if(!CurBuffy) return; -+ -+ switch (op) { -+ case OP_SIDEBAR_NEXT: -+ if ( CurBuffy->next == NULL ) return; -+ CurBuffy = CurBuffy->next; -+ break; -+ case OP_SIDEBAR_PREV: -+ if ( CurBuffy->prev == NULL ) return; -+ CurBuffy = CurBuffy->prev; -+ break; -+ case OP_SIDEBAR_SCROLL_UP: -+ CurBuffy = TopBuffy; -+ if ( CurBuffy != Incoming ) { -+ calc_boundaries(menu); -+ CurBuffy = CurBuffy->prev; -+ } -+ break; -+ case OP_SIDEBAR_SCROLL_DOWN: -+ CurBuffy = BottomBuffy; -+ if ( CurBuffy->next ) { -+ calc_boundaries(menu); -+ CurBuffy = CurBuffy->next; -+ } -+ break; -+ default: -+ return; -+ } -+ calc_boundaries(menu); -+ draw_sidebar(menu); -+ } -+ -*** mutt-1.5.24-orig/sidebar.h 1969-12-31 18:00:00.000000000 -0600 ---- mutt-1.5.24/sidebar.h 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 0 **** ---- 1,36 ---- -+ /* -+ * Copyright (C) ????-2004 Justin Hibbits -+ * Copyright (C) 2004 Thomer M. Gil -+ * -+ * 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; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * 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. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. -+ */ -+ -+ #ifndef SIDEBAR_H -+ #define SIDEBAR_H -+ -+ struct MBOX_LIST { -+ char *path; -+ int msgcount; -+ int new; -+ } MBLIST; -+ -+ /* parameter is whether or not to go to the status line */ -+ /* used for omitting the last | that covers up the status bar in the index */ -+ int draw_sidebar(int); -+ void scroll_sidebar(int, int); -+ void set_curbuffy(char*); -+ void set_buffystats(CONTEXT*); -+ -+ #endif /* SIDEBAR_H */ -*** mutt-1.5.24-orig/doc/Muttrc 2015-08-30 12:24:53.000000000 -0500 ---- mutt-1.5.24/doc/Muttrc 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 657,662 **** ---- 657,682 ---- - # $crypt_autosign, $crypt_replysign and $smime_is_default. - # - # -+ # set sidebar_visible=no -+ # -+ # Name: sidebar_visible -+ # Type: boolean -+ # Default: no -+ # -+ # -+ # This specifies whether or not to show sidebar (left-side list of folders). -+ # -+ # -+ # set sidebar_width=0 -+ # -+ # Name: sidebar_width -+ # Type: number -+ # Default: 0 -+ # -+ # -+ # The width of the sidebar. -+ # -+ # - # set crypt_autosign=no - # - # Name: crypt_autosign -*** mutt-1.5.24-orig/imap/imap.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/imap/imap.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 1523,1529 **** - - imap_munge_mbox_name (munged, sizeof (munged), name); - snprintf (command, sizeof (command), -! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT)", munged); - - if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) - { ---- 1523,1529 ---- - - imap_munge_mbox_name (munged, sizeof (munged), name); - snprintf (command, sizeof (command), -! "STATUS %s (UIDNEXT UIDVALIDITY UNSEEN RECENT MESSAGES)", munged); - - if (imap_exec (idata, command, IMAP_CMD_QUEUE) < 0) - { -*** mutt-1.5.24-orig/imap/command.c 2015-08-30 12:06:38.000000000 -0500 ---- mutt-1.5.24/imap/command.c 2015-09-16 23:18:13.000000000 -0500 -*************** -*** 1012,1017 **** ---- 1012,1024 ---- - opened */ - status->uidnext = oldun; - -+ /* Added to make the sidebar show the correct numbers */ -+ if (status->messages) -+ { -+ inc->msgcount = status->messages; -+ inc->msg_unread = status->unseen; -+ } -+ - FREE (&value); - return; - } diff --git a/mutt.spec b/mutt.spec index 36747fe..a577aae 100644 --- a/mutt.spec +++ b/mutt.spec @@ -40,14 +40,10 @@ Source1: %{name}.desktop Source2: %{name}.png Source3: %{name}.1.pl Patch0: %{name}-pl.po-update.patch -# http://mutt.org.ua/download/ -Patch2: %{name}-rr.compressed.patch Patch3: %{name}-bj.status-time.patch # http://mutt.org.ua/download/ Patch4: %{name}-vvv.quote.patch Patch5: %{name}-null_name.patch -Patch6: %{name}-cd.trash_folder.patch -Patch7: %{name}-cd.purge_message.patch Patch8: %{name}-cd.signatures_menu.patch # http://www.mutt.ca/patches/ (dw.crypt-autoselectkey) Patch9: %{name}-crypt-autoselectkey.patch @@ -62,15 +58,11 @@ Patch17: %{name}-folder_columns.patch Patch18: %{name}-imap_recent.patch Patch19: %{name}-Muttrc.head.patch Patch20: %{name}-smime.rc.patch -Patch21: %{name}-sidebar.patch -Patch22: %{name}-imap_fast_trash.patch Patch23: %{name}-db.patch # http://mutt.org.ua/download/ Patch24: %{name}-vvv.nntp.patch Patch25: format-security.patch Patch26: %{name}-keep_to.patch -Patch27: mutt-gpgme.patch -Patch28: openssl.patch URL: http://www.mutt.org/ BuildRequires: autoconf >= 2.54 BuildRequires: automake >= 1.6 @@ -156,15 +148,9 @@ Mutt - це невеликий, але потужний повноекранни %setup -q # pl.poupdate #%patch0 -p1 -# compressed patch applied upstream -#%patch2 -p1 %patch3 -p1 %patch4 -p1 %patch5 -p1 -# trash folder patch applied upstream -#%patch6 -p1 -# purge patch applied upstream -#%patch7 -p1 # cd.signatures %patch8 -p1 # crypt-autosolect @@ -189,10 +175,6 @@ Mutt - це невеликий, але потужний повноекранни %patch19 -p1 # smime.rc %patch20 -p1 -# sidebar.patch - applied upstream -# %patch21 -p1 -# imap_fast_trash - applied upstream -# %patch22 -p1 # db %patch23 -p1 # nntp @@ -201,10 +183,6 @@ Mutt - це невеликий, але потужний повноекранни %patch25 -p1 # keep-to %patch26 -p1 -# mutt-gpgme - applied upstream -# %patch27 -p1 -# openssl - applied upstream -# %patch28 -p1 # force regeneration (manual.sgml is modified by some patches) %{__rm} doc/{manual*.html,manual.txt} diff --git a/openssl.patch b/openssl.patch deleted file mode 100644 index d267bd8..0000000 --- a/openssl.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 6ce3be71ed60e4fe41ea255b74119ded47bd4ca2 Mon Sep 17 00:00:00 2001 -From: TAKAHASHI Tamotsu -Date: Wed, 7 Sep 2016 20:00:04 -0700 -Subject: [PATCH] Fix openssl 1.1 compilation issues. (closes #3870) - -With these changes, Mutt will no longer compile for versions less than -0.9.6. ---- - configure.ac | 7 +++++-- - mutt_ssl.c | 24 ++++++++---------------- - 2 files changed, 13 insertions(+), 18 deletions(-) - -diff --git a/configure.ac b/configure.ac -index aff9479c7..b84b531cb 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -689,13 +689,16 @@ AC_ARG_WITH(ssl, AS_HELP_STRING([--with-ssl@<:@=PFX@:>@],[Enable TLS support usi - - crypto_libs="" - AC_CHECK_LIB(z, deflate, [crypto_libs=-lz]) -- AC_CHECK_LIB(crypto, X509_new, -- [crypto_libs="-lcrypto $crypto_libs"],, [$crypto_libs]) -+ AC_CHECK_LIB(crypto, X509_STORE_CTX_new, -+ [crypto_libs="-lcrypto $crypto_libs"], -+ AC_MSG_ERROR([Unable to find SSL library]), [$crypto_libs]) - AC_CHECK_LIB(ssl, SSL_new,, - AC_MSG_ERROR([Unable to find SSL library]), [$crypto_libs]) - - LIBS="$LIBS $crypto_libs" - AC_CHECK_FUNCS(RAND_status RAND_egd) -+ AC_CHECK_DECLS([SSL_set_mode, SSL_MODE_AUTO_RETRY],, -+ AC_MSG_ERROR([Unable to find decent SSL header]), [[#include ]]) - - AC_DEFINE(USE_SSL,1,[ Define if you want support for SSL. ]) - AC_DEFINE(USE_SSL_OPENSSL,1,[ Define if you want support for SSL via OpenSSL. ]) -diff --git a/mutt_ssl.c b/mutt_ssl.c -index 35cb5135c..791b1c631 100644 ---- a/mutt_ssl.c -+++ b/mutt_ssl.c -@@ -37,12 +37,6 @@ - #include "mutt_ssl.h" - #include "mutt_idna.h" - --#if OPENSSL_VERSION_NUMBER >= 0x00904000L --#define READ_X509_KEY(fp, key) PEM_read_X509(fp, key, NULL, NULL) --#else --#define READ_X509_KEY(fp, key) PEM_read_X509(fp, key, NULL) --#endif -- - /* Just in case OpenSSL doesn't define DEVRANDOM */ - #ifndef DEVRANDOM - #define DEVRANDOM "/dev/urandom" -@@ -406,11 +400,7 @@ static int ssl_negotiate (CONNECTION *conn, sslsockdata* ssldata) - int err; - const char* errmsg; - --#if OPENSSL_VERSION_NUMBER >= 0x00906000L -- /* This only exists in 0.9.6 and above. Without it we may get interrupted -- * reads or writes. Bummer. */ - SSL_set_mode (ssldata->ssl, SSL_MODE_AUTO_RETRY); --#endif - - if ((err = SSL_connect (ssldata->ssl)) != 1) - { -@@ -631,7 +621,7 @@ static char *asn1time_to_string (ASN1_UTCTIME *tm) - - static int check_certificate_by_signer (X509 *peercert) - { -- X509_STORE_CTX xsc; -+ X509_STORE_CTX *xsc; - X509_STORE *ctx; - int pass = 0, i; - -@@ -661,23 +651,25 @@ static int check_certificate_by_signer (X509 *peercert) - return 0; - } - -- X509_STORE_CTX_init (&xsc, ctx, peercert, SslSessionCerts); -+ xsc = X509_STORE_CTX_new(); -+ if (xsc == NULL) return 0; -+ X509_STORE_CTX_init (xsc, ctx, peercert, SslSessionCerts); - -- pass = (X509_verify_cert (&xsc) > 0); -+ pass = (X509_verify_cert (xsc) > 0); - #ifdef DEBUG - if (! pass) - { - char buf[SHORT_STRING]; - int err; - -- err = X509_STORE_CTX_get_error (&xsc); -+ err = X509_STORE_CTX_get_error (xsc); - snprintf (buf, sizeof (buf), "%s (%d)", - X509_verify_cert_error_string(err), err); - dprint (2, (debugfile, "X509_verify_cert: %s\n", buf)); - dprint (2, (debugfile, " [%s]\n", peercert->name)); - } - #endif -- X509_STORE_CTX_cleanup (&xsc); -+ X509_STORE_CTX_free (xsc); - X509_STORE_free (ctx); - - return pass; -@@ -766,7 +758,7 @@ static int check_certificate_by_digest (X509 *peercert) - return 0; - } - -- while ((cert = READ_X509_KEY (fp, &cert)) != NULL) -+ while ((cert = PEM_read_X509 (fp, &cert, NULL, NULL)) != NULL) - { - pass = compare_certificates (cert, peercert, peermd, peermdlen) ? 0 : 1; -