From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 30237 invoked from network); 9 Jun 2021 21:49:42 -0000 Received: from 1ess.inri.net (216.126.196.35) by inbox.vuxu.org with ESMTPUTF8; 9 Jun 2021 21:49:42 -0000 Received: from mail.9lab.org ([168.119.8.41]) by 1ess; Wed Jun 9 17:42:08 -0400 2021 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=9lab.org; s=20210803; t=1623274917; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to; bh=cJ3lu7D2jjS+v+QaCYkcmmVswkb4COYPuWwkMnNgqVg=; b=mNzW/fjYzL8bF9trsCCfjqfSISGfGph/T83jdUwN+j0/fTLIOcwYxupbpk+4y+m1ByIh23 UcQOMlCEZxF5wiqjuBh8Z5W/IiEmC7oNZBTxdl3FAyIsfCdeRijZ4I4iqEme9HpnlmNAjo mO7fqA1D7NN/cfit0a7gU45V4o9nwPI= Received: from pjw (host-185-64-155-70.ecsnet.at [185.64.155.70]) by mail.9lab.org (OpenSMTPD) with ESMTPSA id c7415057 (TLSv1.2:ECDHE-RSA-CHACHA20-POLY1305:256:NO); Wed, 9 Jun 2021 23:41:57 +0200 (CEST) Message-ID: <489177A742ECA8D25F4387712C32F0DC@9lab.org> To: 9front@9front.org CC: risto.salminen@gmx.com, igor@9lab.org Date: Wed, 09 Jun 2021 23:41:40 +0200 From: igor@9lab.org In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: virtualized singleton rich-client layer Subject: Re: [9front] upas/fs: copy messages between IMAP folders Reply-To: 9front@9front.org Precedence: bulk Thanks for this rsal. Tested the patch on a few accounts with many imap folders and it works well for me. The only nitpick after using this for a while is re: moves to and from the 'Inbox'. Assuming the following mailboxes: term% upas/fs -f /imaps/mail.9lab.org/igor term% echo open /imaps/mail.9lab.org/igor/Hacking Hacking >/mail/fs/ctl Moving two message from 'Hacking' to 'Inbox' looks like this: term% echo move Hacking 677 674 Inbox >/mail/fs/ctl Moving messages from 'Inbox' to 'Hacking' looks like this: term% echo move mbox 4 3 Hacking >/mail/fs/ctl Note that the former move requires the IMAP folder name 'Inbox', the latter move requires the use of 'mbox' (i.e. 'Inbox' does not work). Sorry no patch for this so far, just found some time to test at this stage… Cheers, Igor Quoth Risto Salminen : > Hello, > > another iteration of the patch only but simply > allows one to move, and not copy, messages > inside a IMAP server from a folder to another > folder. This simplifies the MUA's, for example > nedmail's, duties, as it does not have to > separately delete the moved mail anymore. > > Would this be useful for the broader audience? > > Thanks, > rsal > > diff -r 7c895ae504fa sys/man/4/upasfs > --- a/sys/man/4/upasfs Fri May 28 13:02:58 2021 +0200 > +++ b/sys/man/4/upasfs Mon May 31 13:55:01 2021 +0300 > @@ -206,7 +206,7 @@ > .I fs > to open, close, rename, create or remove new mailboxes, > and also to > -delete or flag groups of messages atomically. > +delete, flag, or move groups of messages atomically. > The messages that can be written to this file are: > .TP 2i > .PD 0 > @@ -260,6 +260,13 @@ > .TP > .B "flag \fImboxname flags number ...\fP > flag the given messages. > +.TP > +.B "move \fImboxname number ... target\fP > +Move the given messages from > +.IR mboxname > +to mailbox named > +.IR target. > +At the moment only supported with IMAP mailboxes. > .PD > .PP > The > diff -r 7c895ae504fa sys/src/cmd/upas/fs/dat.h > --- a/sys/src/cmd/upas/fs/dat.h Fri May 28 13:02:58 2021 +0200 > +++ b/sys/src/cmd/upas/fs/dat.h Mon May 31 13:55:01 2021 +0300 > @@ -174,6 +174,7 @@ > void (*decache)(Mailbox*, Message*); > int (*fetch)(Mailbox*, Message*, uvlong, ulong); > void (*delete)(Mailbox*, Message*); > + char *(*move)(Mailbox*, Message*, char*); > char *(*ctl)(Mailbox*, int, char**); > char *(*remove)(Mailbox *, int); > char *(*rename)(Mailbox*, char*, int); > @@ -215,6 +216,7 @@ > void unnewmessage(Mailbox*, Message*, Message*); > char* delmessages(int, char**); > char *flagmessages(int, char**); > +char* movemessages(int, char**); > void digestmessage(Mailbox*, Message*); > > int wraptls(int, char*); > diff -r 7c895ae504fa sys/src/cmd/upas/fs/fs.c > --- a/sys/src/cmd/upas/fs/fs.c Fri May 28 13:02:58 2021 +0200 > +++ b/sys/src/cmd/upas/fs/fs.c Mon May 31 13:55:01 2021 +0300 > @@ -1242,6 +1242,11 @@ > return nil; > return flagmessages(argc - 1, argv + 1); > } > + if(strcmp(argv[0], "move") == 0){ > + if(argc < 4) > + return nil; > + return movemessages(argc - 1, argv + 1); > + } > if(strcmp(argv[0], "remove") == 0){ > v0 = argv0; > flags = 0; > diff -r 7c895ae504fa sys/src/cmd/upas/fs/imap.c > --- a/sys/src/cmd/upas/fs/imap.c Fri May 28 13:02:58 2021 +0200 > +++ b/sys/src/cmd/upas/fs/imap.c Mon May 31 13:55:01 2021 +0300 > @@ -1025,6 +1025,29 @@ > } > > static char* > +imap4move(Mailbox *mb, Message *m, char *dest) > +{ > + char *r; > + Imap *imap; > + > + imap = mb->aux; > + imap4cmd(imap, "uid copy %lud %s", (ulong)m->imapuid, dest); > + r = imap4resp(imap); > + if(!isokay(r)) > + return r; > + imap4cmd(imap, "uid store %lud +flags (\\Deleted)", (ulong)m->imapuid); > + r = imap4resp(imap); > + if(!isokay(r)) > + return r; > + imap4cmd(imap, "expunge"); > + r = imap4resp(imap); > + if(!isokay(r)) > + return r; > + m->inmbox = 0; > + return 0; > +} > + > +static char* > imap4sync(Mailbox *mb) > { > char *err; > @@ -1183,6 +1206,7 @@ > mb->delete = imap4delete; > mb->rename = imap4rename; > mb->modflags = imap4modflags; > + mb->move = imap4move; > mb->addfrom = 1; > return nil; > } > diff -r 7c895ae504fa sys/src/cmd/upas/fs/mbox.c > --- a/sys/src/cmd/upas/fs/mbox.c Fri May 28 13:02:58 2021 +0200 > +++ b/sys/src/cmd/upas/fs/mbox.c Mon May 31 13:55:01 2021 +0300 > @@ -1137,6 +1137,37 @@ > return rerr; > } > > +char* > +movemessages(int argc, char **argv) > +{ > + char *err, *dest, *rerr; > + int i, needwrite; > + Mailbox *mb; > + Message *m; > + > + rerr = 0; > + for(mb = mbl; mb != nil; mb = mb->next) > + if(strcmp(*argv, mb->name) == 0) > + break; > + if(mb == nil) > + return "no such mailbox"; > + if(mb->move == nil) > + return "move not supported"; > + dest = argv[argc - 1]; > + needwrite = 0; > + for(i = 1; i < argc - 1; i++) > + for(m = mb->root->part; m; m = m->next) > + if(strcmp(m->name, argv[i]) == 0){ > + if(err = mb->move(mb, m, dest)) > + rerr = err; > + else > + needwrite = 1; > + } > + if(needwrite) > + syncmbox(mb, 1); > + return rerr; > +} > + > void > msgincref(Mailbox *mb, Message *m) > { > diff -r 7c895ae504fa sys/src/cmd/upas/fs/mdir.c > --- a/sys/src/cmd/upas/fs/mdir.c Fri May 28 13:02:58 2021 +0200 > +++ b/sys/src/cmd/upas/fs/mdir.c Mon May 31 13:55:01 2021 +0300 > @@ -294,5 +294,6 @@ > mb->idxread = idxr; > mb->idxwrite = idxw; > mb->ctl = mdirctl; > + mb->move = nil; > return nil; > } > diff -r 7c895ae504fa sys/src/cmd/upas/fs/plan9.c > --- a/sys/src/cmd/upas/fs/plan9.c Fri May 28 13:02:58 2021 +0200 > +++ b/sys/src/cmd/upas/fs/plan9.c Mon May 31 13:55:01 2021 +0300 > @@ -411,5 +411,6 @@ > mb->remove = localremove; > mb->rename = localrename; > mb->decache = plan9decache; > + mb->move = nil; > return nil; > } > diff -r 7c895ae504fa sys/src/cmd/upas/fs/pop3.c > --- a/sys/src/cmd/upas/fs/pop3.c Fri May 28 13:02:58 2021 +0200 > +++ b/sys/src/cmd/upas/fs/pop3.c Mon May 31 13:55:01 2021 +0300 > @@ -624,6 +624,7 @@ > mb->sync = pop3sync; > mb->close = pop3close; > mb->ctl = pop3ctl; > + mb->move = nil; > mb->addfrom = 1; > return nil; > }