sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit a671f97a18ab7656f497872424172f0a370e1364
parent 8cc6dd3e0a942101905faa4f69e5e60f34161ac1
Author: James Taylor <james@jamestaylor.org>
Date:   Wed, 11 Aug 2010 16:59:59 +0000

Preserve unrecognized maildir flags when syncing back.

Diffstat:
M lib/sup/maildir.rb | 33 +++++++++++++++++++++------------
1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/lib/sup/maildir.rb b/lib/sup/maildir.rb
@@ -1,4 +1,5 @@
 require 'uri'
+require 'set'
 
 module Redwood
 
@@ -76,17 +77,7 @@ class Maildir < Source
   end
 
   def sync_back id, labels
-    flags = ""
-
-    ## Flags must be stored in ASCII order according to Maildir
-    ## documentation
-    flags += "D" if labels.member? :draft
-    flags += "F" if labels.member? :starred
-    flags += "P" if labels.member? :forwarded
-    flags += "R" if labels.member? :replied
-    flags += "S" unless labels.member? :unread
-    flags += "T" if labels.member? :deleted
-
+    flags = maildir_reconcile_flags id, labels
     maildir_mark_file id, flags
   end
 
@@ -203,14 +194,32 @@ private
 
   def maildir_data id
     id = File.basename id
-    id =~ %r{^([^:]+):([12]),([DFPRST]*)$}
+    # Flags we recognize are DFPRST
+    id =~ %r{^([^:]+):([12]),([A-Za-z]*)$}
     [($1 || id), ($2 || "2"), ($3 || "")]
   end
 
+  def maildir_reconcile_flags id, labels
+      new_flags = Set.new( maildir_data(id)[2].each_char )
+    
+      # Set flags based on labels for the six flags we recognize 
+      if labels.member? :draft then new_flags.add?( "D" ) else new_flags.delete?( "D" ) end 
+      if labels.member? :starred then new_flags.add?( "F" ) else new_flags.delete?( "F" ) end 
+      if labels.member? :forwarded then new_flags.add?( "P" ) else new_flags.delete?( "P" ) end 
+      if labels.member? :replied then new_flags.add?( "R" ) else new_flags.delete?( "R" ) end 
+      if not labels.member? :unread then new_flags.add?( "S" ) else new_flags.delete?( "S" ) end 
+      if labels.member? :deleted then new_flags.add?( "T" ) else new_flags.delete?( "T" ) end 
+
+      ## Flags must be stored in ASCII order according to Maildir
+      ## documentation
+      new_flags.to_a.sort.join
+  end
+
   def maildir_mark_file orig_path, flags
     @mutex.synchronize do
       new_base = (flags.include?("S")) ? "cur" : "new"
       md_base, md_ver, md_flags = maildir_data orig_path
+
       return orig_path if md_flags == flags
 
       new_loc = File.join new_base, "#{md_base}:#{md_ver},#{flags}"