Subject: [sup-devel] [PATCH] Sync and update other threads when Maildir sync-back changes location.

From: "Edward Z. Yang" <[email-masked]>
Date: Tue, 21 Aug 2012 15:19:56 -0400

From: "Edward Z. Yang" <[email-masked]>

Signed-off-by: Edward Z. Yang <[email-masked]>
---
 lib/sup/maildir.rb | 2 +-
 lib/sup/message.rb | 6 +++++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/lib/sup/maildir.rb b/lib/sup/maildir.rb
index 0c8c563..050cfaf 100644
--- a/lib/sup/maildir.rb
+++ b/lib/sup/maildir.rb
@@ -226,7 +226,7 @@ private
       new_base = (flags.include?("S")) ? "cur" : "new"
       md_base, md_ver, md_flags = maildir_data orig_path
 
-      return orig_path if md_flags == flags
+      return if md_flags == flags
 
       new_loc = File.join new_base, "#{md_base}:#{md_ver},#{flags}"
       orig_path = File.join @dir, orig_path
diff --git a/lib/sup/message.rb b/lib/sup/message.rb
index 0616f75..cd9226e 100644
--- a/lib/sup/message.rb
+++ b/lib/sup/message.rb
@@ -288,7 +288,11 @@ EOS
   def sync_back
     @locations.each do |l|
       if l.valid?
-        l.sync_back @labels if $config[:sync_back_to_maildir] and l.source.is_a? Maildir
+        r = l.sync_back @labels if $config[:sync_back_to_maildir] and l.source.is_a? Maildir
+        if r
+          Index.sync_message self, true
+          UpdateManager.relay self, :updated, self
+        end
       end
     end
   end
-- 
1.7.11.3

_______________________________________________
Sup-devel mailing list
[email-masked]
http://rubyforge.org/mailman/listinfo/sup-devel

---

From: "Edward Z. Yang" <[email-masked]>
Date: Tue, 21 Aug 2012 15:43:47 -0400

Aaand here's an even prettier version.

commit f7d30410d946418a885929f20a498c10e4058243
Author: Edward Z. Yang <[email-masked]>
Date:   Tue Aug 21 15:19:11 2012 -0400

    Sync and update other threads when Maildir sync-back changes location.

 
 
       new_loc = File.join new_base, "#{md_base}:#{md_ver},#{flags}"
       orig_path = File.join @dir, orig_path
diff --git a/lib/sup/message.rb b/lib/sup/message.rb
index 0616f75..3eeea66 100644
--- a/lib/sup/message.rb
+++ b/lib/sup/message.rb
@@ -286,10 +286,11 @@ EOS
   end
 
   def sync_back
-    @locations.each do |l|
-      if l.valid?
-        l.sync_back @labels if $config[:sync_back_to_maildir] and l.source.is_a? Maildir
-      end
+    if @locations.map { |l|
+      l.sync_back @labels if l.valid? and $config[:sync_back_to_maildir] and l.source.is_a? Maildir
+    }.any?
+      Index.sync_message self, true
+      UpdateManager.relay self, :updated, self
     end
   end

---

From: "Edward Z. Yang" <[email-masked]>
Date: Tue, 21 Aug 2012 15:25:41 -0400

This fixes the "I changed a message from unread to read in one list (e.g. 'U')
and now when I open the message from inbox it can't find it" bug.

Here is a version that is theoretically more efficient, though God
help you if you have more than one location per message.

commit ca5b02b8ff88412f92984d6b9176ff1876886cc6
Author: Edward Z. Yang <[email-masked]>
Date:   Tue Aug 21 15:19:11 2012 -0400

 
 
       new_loc = File.join new_base, "#{md_base}:#{md_ver},#{flags}"
       orig_path = File.join @dir, orig_path
diff --git a/lib/sup/message.rb b/lib/sup/message.rb
index 0616f75..9af847d 100644
--- a/lib/sup/message.rb
+++ b/lib/sup/message.rb
@@ -286,11 +286,16 @@ EOS
   end
 
   def sync_back
+    r = nil
     @locations.each do |l|
       if l.valid?
-        l.sync_back @labels if $config[:sync_back_to_maildir] and l.source.is_a? Maildir
+        r ||= l.sync_back @labels if $config[:sync_back_to_maildir] and l.source.is_a? Maildir
       end
     end
+    if r
+      Index.sync_message self, true
+      UpdateManager.relay self, :updated, self
+    end
   end
 
   def merge_labels_from_locations merge_labels