From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by 10.58.247.3 with SMTP id ya3csp623109vec; Tue, 21 Aug 2012 22:54:26 -0700 (PDT) Received: by 10.50.237.66 with SMTP id va2mr881524igc.65.1345614866402; Tue, 21 Aug 2012 22:54:26 -0700 (PDT) Return-Path: Received: from rubyforge.org (50-56-192-79.static.cloud-ips.com. [50.56.192.79]) by mx.google.com with ESMTP id t10si5842249icw.0.2012.08.21.22.54.26; Tue, 21 Aug 2012 22:54:26 -0700 (PDT) Received-SPF: pass (google.com: domain of sup-devel-bounces@rubyforge.org designates 50.56.192.79 as permitted sender) client-ip=50.56.192.79; Authentication-Results: mx.google.com; spf=pass (google.com: domain of sup-devel-bounces@rubyforge.org designates 50.56.192.79 as permitted sender) smtp.mail=sup-devel-bounces@rubyforge.org Received: from localhost.localdomain (localhost [127.0.0.1]) by rubyforge.org (Postfix) with ESMTP id CCA4C2E07A; Wed, 22 Aug 2012 05:54:25 +0000 (UTC) Received: from dmz-mailsec-scanner-4.mit.edu (DMZ-MAILSEC-SCANNER-4.MIT.EDU [18.9.25.15]) by rubyforge.org (Postfix) with ESMTP id 14DA52E05F for ; Wed, 22 Aug 2012 05:54:17 +0000 (UTC) X-AuditID: 1209190f-b7f306d0000008b4-e8-5034740954dd Received: from mailhub-auth-3.mit.edu ( [18.9.21.43]) by dmz-mailsec-scanner-4.mit.edu (Symantec Messaging Gateway) with SMTP id 23.65.02228.90474305; Wed, 22 Aug 2012 01:54:17 -0400 (EDT) Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) by mailhub-auth-3.mit.edu (8.13.8/8.9.2) with ESMTP id q7M5sHV3004801; Wed, 22 Aug 2012 01:54:17 -0400 Received: from localhost (c-67-186-133-183.hsd1.ma.comcast.net [67.186.133.183]) (authenticated bits=0) (User authenticated as ezyang@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id q7M5sFJ9010713; Wed, 22 Aug 2012 01:54:16 -0400 (EDT) References: <1345559230-sup-5105@javelin> <1345614331-17294-1-git-send-email-ezyang@mit.edu> In-reply-to: <1345614331-17294-1-git-send-email-ezyang@mit.edu> From: "Edward Z. Yang" To: sup-devel , "damien.leone" Date: Wed, 22 Aug 2012 01:54:15 -0400 Message-Id: <1345614564-sup-5523@javelin> User-Agent: Sup/git X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrPIsWRmVeSWpSXmKPExsUixCmqrctZYhJg8OSVuMWr831MFo+n72F3 YPKY9mslk8e+fROZA5iiuGxSUnMyy1KL9O0SuDL2NbxmLlikWHHh1032BsYnEl2MnBwSAiYS D2bMYoewxSQu3FvP1sXIxSEksI9R4uuC5SwQzgZGic4395khnB4miQ37zrJ2MXJwMAuoS6yf JwTSLSQQI/Fy7hsmEJtTwF5i9qfpbCA2G1DJo2NPWUFsEYFoiUeLG5hBbGGBUIkD5z6C1bMI qErMaX4IZvMKaEpsuN/FCGKLCghLPDnSDFbPLCAv0bx1NvMERv5ZCJtnIcksYGRaxSibklul m5uYmVOcmqxbnJyYl5dapGuil5tZopeaUrqJERx2kvw7GL8dVDrEKMDBqMTDe9vDJECINbGs uDL3EKMkB5OSKO/7IqAQX1J+SmVGYnFGfFFpTmrxIUYJDmYlEd6KHKAcb0piZVVqUT5MSpqD RUmc92rKTX8hgfTEktTs1NSC1CKYrAwHh5IEb20xUKNgUWp6akVaZk4JQpqJgxNkOA/QcAeQ Gt7igsTc4sx0iPwpRl2Ol7NO3WUUYsnLz0uVEuetAikSACnKKM2DmwNLF68YxYHeEubtAani AaYauEmvgJYwAS1Ru2oMsqQkESEl1cC4wGZlfHeb6qFDBSUqhi9npJ1+kc16+EQ2B4dKbr22 Xd3hkpy4zbkB5VsWsTbrZ9Tu01tYkGF0sNzpaNN191ns7u9CNdt/ZKV9Y/YvfL3/oHGJt9Xa yUsrmPecVZ4gfil6baQfvyUX/64tvWv0dS5sjbiR0352412rPxzb/zWe0WRwZj7yNEKJpTgj 0VCLuag4EQDVEb0D8gIAAA== Subject: Re: [sup-devel] [PATCH] Implement moving message between Maildir sources based on label. X-BeenThere: sup-devel@rubyforge.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: Sup developer discussion List-Id: Sup developer discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: sup-devel-bounces@rubyforge.org Errors-To: sup-devel-bounces@rubyforge.org Usage instructions: In config.yaml, you need to add a new option :maildir_labels: :maildir_labels: :stanford: [[:inbox, 4], [null, 6]] Maildir labels is a dictionary of "accounts" to lists of precedences. Read it as follows: For messages in source 4 or source 6 (consult sources.yaml), if the message has the :inbox tag, move it to source 4, otherwise move it to source 6. So in this case, 6 would be some sort of Archive folder, and 4 would be INBOX. If you want "export-only" folders, just tack them on after the null entry; the labels are checked *in order*. Multiple accounts are supported, but these should be disjoint sets of sources. This will automatically start working for any new mail you change the labels of. In order to apply this to old mail, you need to run sup-sync-back-maildir. OfflineIMAP will shit its pants [1] if you move too much mail, so I recommend holding on until I implement the companion patch for OfflineIMAP if you have a lot of mail. Edward [1] Namely, it will reupload every single article of mail, and if you get unlucky and "Archive" is sorted before "INBOX", it will probably run you out of quota too. If you arrange to delete everything from INBOX first, and then sync Archive, it will probably just spend a lot of time uploading. Excerpts from Edward Z. Yang's message of Wed Aug 22 01:45:31 -0400 2012: > From: "Edward Z. Yang" > > Signed-off-by: Edward Z. Yang > --- > lib/sup/maildir.rb | 28 ++++++++++++++++++++++------ > lib/sup/message.rb | 9 +++++++-- > 2 files changed, 29 insertions(+), 8 deletions(-) > > diff --git a/lib/sup/maildir.rb b/lib/sup/maildir.rb > index 95305c2..ff8da23 100644 > --- a/lib/sup/maildir.rb > +++ b/lib/sup/maildir.rb > @@ -77,8 +77,17 @@ class Maildir < Source > end > > def sync_back id, labels > + new_source = @id > + $config[:maildir_labels].each do |k,v| > + v.each do |lbl,i| > + if lbl.nil? or labels.member? lbl > + new_source = i > + break > + end > + end if v.any? { |lbl,i| i == @id } > + end if $config[:maildir_labels] > flags = maildir_reconcile_flags id, labels > - maildir_mark_file id, flags > + maildir_move_file id, new_source, flags > end > > def raw_header id > @@ -221,24 +230,31 @@ private > new_flags.to_a.sort.join > end > > - def maildir_mark_file orig_path, flags > + def maildir_move_file orig_path, new_source_id, flags > @mutex.synchronize do > new_base = (flags.include?("S")) ? "cur" : "new" > md_base, md_ver, md_flags = maildir_data orig_path > > - return if md_flags == flags > + return if md_flags == flags and new_source_id == @id > + > + new_source = SourceManager[new_source_id] > > new_loc = File.join new_base, "#{md_base}:#{md_ver},#{flags}" > orig_path = File.join @dir, orig_path > - new_path = File.join @dir, new_loc > + new_path = File.join new_source.file_path, new_loc > tmp_path = File.join @dir, "tmp", "#{md_base}:#{md_ver},#{flags}" > > File.link orig_path, tmp_path > File.unlink orig_path > - File.link tmp_path, new_path > + begin > + File.link tmp_path, new_path > + rescue SystemCallError > + File.unlink new_path # XXX kinda unsafe eh > + File.link tmp_path, new_path > + end > File.unlink tmp_path > > - new_loc > + [new_source, new_loc] > end > end > end > diff --git a/lib/sup/message.rb b/lib/sup/message.rb > index 3eeea66..d6016df 100644 > --- a/lib/sup/message.rb > +++ b/lib/sup/message.rb > @@ -726,8 +726,13 @@ class Location > end > > def sync_back labels > - new_info = source.sync_back(@info, labels) if source.respond_to? :sync_back > - @info = new_info if new_info > + pair = source.sync_back(@info, labels) if source.respond_to? :sync_back > + if pair > + new_source, new_info = pair > + @source = new_source if new_source > + @info = new_info if new_info > + end > + pair > end > > ## much faster than raw_message _______________________________________________ Sup-devel mailing list Sup-devel@rubyforge.org http://rubyforge.org/mailman/listinfo/sup-devel