This reads fine to me. It turns out I can't currently compile mutt to give it a run because fink's gpgme is too old for the mail-key patch, but it reads as worth pushing.
Thanks! On Thursday, 15 January 2015 at 14:44, Kevin J. McCarthy wrote: > Kevin J. McCarthy wrote: > > Someone trying to use mutt with FastMail was having a problem where a > > postponed message was not editable in the web ui. It turns out it was > > because the message, when saved, did not include the IMAP \Draft flag. > > Attached is a slightly revised version of this patch. The main > difference with this version is a refactoring of the IMAP flag > generation code. The previous patch added one flag too many to set > using ternary operators. > > I'd appreciate any feedback or people willing to test the patch and > report back. > > Thanks, > > -Kevin > # HG changeset patch > # User Kevin McCarthy <[email protected]> > # Date 1421360333 28800 > # Thu Jan 15 14:18:53 2015 -0800 > # Node ID b1b72da0e849739e829ea0a1ec565df585c5d7b5 > # Parent d732298789f254b738701893c84446a02c181725 > Send the IMAP \Draft flag when postponing a message. > > This patch adds a mx_open_new_message() flag, M_SET_DRAFT. It also adds > a MESSAGE->flags.draft flag. > > mutt_write_fcc() passes the M_SET_DRAFT flag to mx_open_new_message(), > which then sets MESSAGE->flags.draft. Then, imap_append_message() is > able to see this flag and so adds the \Draft flag. > > The imap_append_message() function started to have a bit too many flags, > so this version of the patch separates out the flag generating code into > a simpler version. > > diff --git a/imap/message.c b/imap/message.c > --- a/imap/message.c > +++ b/imap/message.c > @@ -596,16 +596,17 @@ > int imap_append_message (CONTEXT *ctx, MESSAGE *msg) > { > IMAP_DATA* idata; > FILE *fp; > char buf[LONG_STRING]; > char mbox[LONG_STRING]; > char mailbox[LONG_STRING]; > char internaldate[IMAP_DATELEN]; > + char imap_flags[SHORT_STRING]; > size_t len; > progress_t progressbar; > size_t sent; > int c, last; > IMAP_MBOX mx; > int rc; > > idata = (IMAP_DATA*) ctx->data; > @@ -638,22 +639,29 @@ > } > rewind (fp); > > mutt_progress_init (&progressbar, _("Uploading message..."), > M_PROGRESS_SIZE, NetInc, len); > > imap_munge_mbox_name (mbox, sizeof (mbox), mailbox); > imap_make_date (internaldate, msg->received); > - snprintf (buf, sizeof (buf), "APPEND %s (%s%s%s%s%s) \"%s\" {%lu}", mbox, > - msg->flags.read ? "\\Seen" : "", > - msg->flags.read && (msg->flags.replied || msg->flags.flagged) ? " " > : "", > - msg->flags.replied ? "\\Answered" : "", > - msg->flags.replied && msg->flags.flagged ? " " : "", > - msg->flags.flagged ? "\\Flagged" : "", > + > + imap_flags[0] = imap_flags[1] = 0; > + if (msg->flags.read) > + safe_strcat (imap_flags, sizeof (imap_flags), " \\Seen"); > + if (msg->flags.replied) > + safe_strcat (imap_flags, sizeof (imap_flags), " \\Answered"); > + if (msg->flags.flagged) > + safe_strcat (imap_flags, sizeof (imap_flags), " \\Flagged"); > + if (msg->flags.draft) > + safe_strcat (imap_flags, sizeof (imap_flags), " \\Draft"); > + > + snprintf (buf, sizeof (buf), "APPEND %s (%s) \"%s\" {%lu}", mbox, > + imap_flags + 1, > internaldate, > (unsigned long) len); > > imap_cmd_start (idata, buf); > > do > rc = imap_cmd_step (idata); > while (rc == IMAP_CMD_CONTINUE); > diff --git a/mailbox.h b/mailbox.h > --- a/mailbox.h > +++ b/mailbox.h > @@ -24,17 +24,18 @@ > #define M_APPEND (1<<1) /* open mailbox for appending messages */ > #define M_READONLY (1<<2) /* open in read-only mode */ > #define M_QUIET (1<<3) /* do not print any messages */ > #define M_NEWFOLDER (1<<4) /* create a new folder - same as M_APPEND, but > uses > * safe_fopen() for mbox-style folders. > */ > > /* mx_open_new_message() */ > -#define M_ADD_FROM 1 /* add a From_ line */ > +#define M_ADD_FROM (1<<0) /* add a From_ line */ > +#define M_SET_DRAFT (1<<1) /* set the message draft flag */ > > /* return values from mx_check_mailbox() */ > enum > { > M_NEW_MAIL = 1, /* new mail received in mailbox */ > M_LOCKED, /* couldn't lock the mailbox */ > M_REOPENED, /* mailbox was reopened */ > M_FLAGS /* nondestructive flags change (IMAP) */ > @@ -45,16 +46,17 @@ > FILE *fp; /* pointer to the message data */ > char *path; /* path to temp file */ > short magic; /* type of mailbox this message belongs to */ > short write; /* nonzero if message is open for writing */ > struct { > unsigned read : 1; > unsigned flagged : 1; > unsigned replied : 1; > + unsigned draft : 1; > } flags; > time_t received; /* the time at which this message was received */ > } MESSAGE; > > CONTEXT *mx_open_mailbox (const char *, int, CONTEXT *); > > MESSAGE *mx_open_message (CONTEXT *, int); > MESSAGE *mx_open_new_message (CONTEXT *, HEADER *, int); > diff --git a/mx.c b/mx.c > --- a/mx.c > +++ b/mx.c > @@ -1250,16 +1250,17 @@ > msg->magic = dest->magic; > msg->write = 1; > > if (hdr) > { > msg->flags.flagged = hdr->flagged; > msg->flags.replied = hdr->replied; > msg->flags.read = hdr->read; > + msg->flags.draft = (flags & M_SET_DRAFT) ? 1 : 0; > msg->received = hdr->received; > } > > if(msg->received == 0) > time(&msg->received); > > if (func (msg, dest, hdr) == 0) > { > diff --git a/sendlib.c b/sendlib.c > --- a/sendlib.c > +++ b/sendlib.c > @@ -2691,16 +2691,17 @@ > { > CONTEXT f; > MESSAGE *msg; > char tempfile[_POSIX_PATH_MAX]; > FILE *tempfp = NULL; > int r, need_buffy_cleanup = 0; > struct stat st; > char buf[SHORT_STRING]; > + int onm_flags; > > if (post) > set_noconv_flags (hdr->content, 1); > > if (mx_open_mailbox (path, M_APPEND | M_QUIET, &f) == NULL) > { > dprint (1, (debugfile, "mutt_write_fcc(): unable to open mailbox %s in > append-mode, aborting.\n", > path)); > @@ -2720,17 +2721,20 @@ > return (-1); > } > /* remember new mail status before appending message */ > need_buffy_cleanup = 1; > stat (path, &st); > } > > hdr->read = !post; /* make sure to put it in the `cur' directory (maildir) > */ > - if ((msg = mx_open_new_message (&f, hdr, M_ADD_FROM)) == NULL) > + onm_flags = M_ADD_FROM; > + if (post) > + onm_flags |= M_SET_DRAFT; > + if ((msg = mx_open_new_message (&f, hdr, onm_flags)) == NULL) > { > mx_close_mailbox (&f, NULL); > return (-1); > } > > /* post == 1 => postpone message. Set mode = -1 in > mutt_write_rfc822_header() > * post == 0 => Normal mode. Set mode = 0 in mutt_write_rfc822_header() > * */
