Created
December 23, 2015 21:56
-
-
Save remko/5c8116afac28095db65c to your computer and use it in GitHub Desktop.
Trash folder patch from http://cedricduval.free.fr/mutt/patches/#trash
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -urN mutt-1.5.24/PATCHES mutt-1.5.24.new/PATCHES | |
--- mutt-1.5.24/PATCHES 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/PATCHES 2015-12-23 22:50:08.000000000 +0100 | |
@@ -0,0 +1 @@ | |
+patch-1.5.16hg.cd.trash_folder.vl.1 | |
diff -urN mutt-1.5.24/commands.c mutt-1.5.24.new/commands.c | |
--- mutt-1.5.24/commands.c 2015-08-30 19:18:28.000000000 +0200 | |
+++ mutt-1.5.24.new/commands.c 2015-12-23 22:50:08.000000000 +0100 | |
@@ -720,6 +720,7 @@ | |
if (option (OPTDELETEUNTAG)) | |
mutt_set_flag (Context, h, M_TAG, 0); | |
} | |
+ mutt_set_flag (Context, h, M_APPENDED, 1); | |
return 0; | |
} | |
diff -urN mutt-1.5.24/flags.c mutt-1.5.24.new/flags.c | |
--- mutt-1.5.24/flags.c 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/flags.c 2015-12-23 22:50:08.000000000 +0100 | |
@@ -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)) | |
diff -urN mutt-1.5.24/globals.h mutt-1.5.24.new/globals.h | |
--- mutt-1.5.24/globals.h 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/globals.h 2015-12-23 22:50:26.000000000 +0100 | |
@@ -141,6 +141,7 @@ | |
WHERE char *Status; | |
WHERE char *Tempdir; | |
WHERE char *Tochars; | |
+WHERE char *TrashPath; | |
WHERE char *TSStatusFormat; | |
WHERE char *TSIconFormat; | |
WHERE short TSSupported; | |
diff -urN mutt-1.5.24/imap/message.c mutt-1.5.24.new/imap/message.c | |
--- mutt-1.5.24/imap/message.c 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/imap/message.c 2015-12-23 22:50:08.000000000 +0100 | |
@@ -884,6 +884,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); | |
} | |
@@ -891,6 +892,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); | |
} | |
diff -urN mutt-1.5.24/init.h mutt-1.5.24.new/init.h | |
--- mutt-1.5.24/init.h 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/init.h 2015-12-23 22:50:08.000000000 +0100 | |
@@ -3341,6 +3341,16 @@ | |
** provided that ``$$ts_enabled'' has been set. This string is identical in | |
** formatting to the one used by ``$$status_format''. | |
*/ | |
+ { "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 }, | |
/* | |
diff -urN mutt-1.5.24/mutt.h mutt-1.5.24.new/mutt.h | |
--- mutt-1.5.24/mutt.h 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/mutt.h 2015-12-23 22:50:08.000000000 +0100 | |
@@ -185,6 +185,7 @@ | |
M_DELETE, | |
M_UNDELETE, | |
M_DELETED, | |
+ M_APPENDED, | |
M_FLAG, | |
M_TAG, | |
M_UNTAG, | |
@@ -713,6 +714,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 */ | |
@@ -885,6 +887,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 */ | |
diff -urN mutt-1.5.24/muttlib.c mutt-1.5.24.new/muttlib.c | |
--- mutt-1.5.24/muttlib.c 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/muttlib.c 2015-12-23 22:50:08.000000000 +0100 | |
@@ -1505,7 +1505,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) | |
diff -urN mutt-1.5.24/mx.c mutt-1.5.24.new/mx.c | |
--- mutt-1.5.24/mx.c 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/mx.c 2015-12-23 22:50:08.000000000 +0100 | |
@@ -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) | |
+ 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) | |
+ { | |
+ if (trash_append (ctx) == -1) | |
+ return -1; | |
+ } | |
+ | |
#ifdef USE_IMAP | |
if (ctx->magic == M_IMAP) | |
rc = imap_sync_mailbox (ctx, purge, index_hint); | |
diff -urN mutt-1.5.24/postpone.c mutt-1.5.24.new/postpone.c | |
--- mutt-1.5.24/postpone.c 2015-08-30 19:06:38.000000000 +0200 | |
+++ mutt-1.5.24.new/postpone.c 2015-12-23 22:50:08.000000000 +0100 | |
@@ -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; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment