Subject: [sup-devel] [PATCH] make the undo hooks also save the threads

From: Anthony Martinez <[email-masked]>
Date: Tue, 5 Jan 2010 15:45:39 -0700

Since there is no explicit sync any longer, any action that has an
Index.save_thread must also repeat the save when the action is undone.
Failure to do this will result in an exception upon quit when the index
notices that there are still dirty messages.
---
 lib/sup/modes/inbox-mode.rb        |    4 ++++
 lib/sup/modes/thread-index-mode.rb |   18 ++++++++++++------
 lib/sup/modes/thread-view-mode.rb  |    4 ++++
 3 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/lib/sup/modes/inbox-mode.rb b/lib/sup/modes/inbox-mode.rb
index 9220925..e2452e5 100644
--- a/lib/sup/modes/inbox-mode.rb
+++ b/lib/sup/modes/inbox-mode.rb
@@ -29,6 +29,7 @@ class InboxMode < ThreadIndexMode
     UndoManager.register "archiving thread" do
       thread.apply_label :inbox
       add_or_unhide thread.first
+      Index.save_thread thread
     end
 
     cursor_thread.remove_label :inbox
@@ -42,6 +43,7 @@ class InboxMode < ThreadIndexMode
       threads.map do |t|
         t.apply_label :inbox
         add_or_unhide t.first
+        Index.save_thread t
       end
       regen_text
     end
@@ -62,6 +64,7 @@ class InboxMode < ThreadIndexMode
       thread.apply_label :inbox
       thread.apply_label :unread
       add_or_unhide thread.first
+      Index.save_thread thread
     end
 
     cursor_thread.remove_label :unread
@@ -85,6 +88,7 @@ class InboxMode < ThreadIndexMode
       threads.zip(old_labels).each do |t, l|
         t.labels = l
         add_or_unhide t.first
+        Index.save_thread t
       end
       regen_text
     end
diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index bbc9044..7808190 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -265,7 +265,7 @@ EOS
   def toggle_starred 
     t = cursor_thread or return
     undo = actually_toggle_starred t
-    UndoManager.register "toggling thread starred status", undo
+    UndoManager.register "toggling thread starred status", undo, lambda { Index.save_thread t }
     update_text_for_line curpos
     cursor_down
     Index.save_thread t
@@ -273,7 +273,8 @@ EOS
 
   def multi_toggle_starred threads
     UndoManager.register "toggling #{threads.size.pluralize 'thread'} starred status",
-      threads.map { |t| actually_toggle_starred t }
+      threads.map { |t| actually_toggle_starred t },
+      lambda { threads.each { |t| Index.save_thread t } }
     regen_text
     threads.each { |t| Index.save_thread t }
   end
@@ -351,14 +352,16 @@ EOS
   def toggle_archived 
     t = cursor_thread or return
     undo = actually_toggle_archived t
-    UndoManager.register "deleting/undeleting thread #{t.first.id}", undo, lambda { update_text_for_line curpos }
+    UndoManager.register "deleting/undeleting thread #{t.first.id}", undo, lambda { update_text_for_line curpos },
+                         lambda { Index.save_thread t }
     update_text_for_line curpos
     Index.save_thread t
   end
 
   def multi_toggle_archived threads
     undos = threads.map { |t| actually_toggle_archived t }
-    UndoManager.register "deleting/undeleting #{threads.size.pluralize 'thread'}", undos, lambda { regen_text }
+    UndoManager.register "deleting/undeleting #{threads.size.pluralize 'thread'}", undos, lambda { regen_text },
+                         lambda { threads.each { |t| Index.save_thread t } }
     regen_text
     threads.each { |t| Index.save_thread t }
   end
@@ -425,7 +428,7 @@ EOS
   def multi_toggle_spam threads
     undos = threads.map { |t| actually_toggle_spammed t }
     UndoManager.register "marking/unmarking  #{threads.size.pluralize 'thread'} as spam",
-                         undos, lambda { regen_text }
+                         undos, lambda { regen_text }, lambda { threads.each { |t| Index.save_thread t } }
     regen_text
     threads.each { |t| Index.save_thread t }
   end
@@ -439,7 +442,7 @@ EOS
   def multi_toggle_deleted threads
     undos = threads.map { |t| actually_toggle_deleted t }
     UndoManager.register "deleting/undeleting #{threads.size.pluralize 'thread'}",
-                         undos, lambda { regen_text }
+                         undos, lambda { regen_text }, lambda { threads.each { |t| Index.save_thread t } }
     regen_text
     threads.each { |t| Index.save_thread t }
   end
@@ -455,6 +458,7 @@ EOS
       threads.each do |t|
         t.remove_label :killed
         add_or_unhide t.first
+        Index.save_thread t
       end
       regen_text
     end
@@ -530,6 +534,7 @@ EOS
       thread.labels = old_labels
       update_text_for_line pos
       UpdateManager.relay self, :labeled, thread.first
+      Index.save_thread thread
     end
 
     UpdateManager.relay self, :labeled, thread.first
@@ -567,6 +572,7 @@ EOS
       threads.zip(old_labels).map do |t, old_labels|
         t.labels = old_labels
         UpdateManager.relay self, :labeled, t.first
+        Index.save_thread t
       end
       regen_text
     end
diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb
index 99abb04..ddac113 100644
--- a/lib/sup/modes/thread-view-mode.rb
+++ b/lib/sup/modes/thread-view-mode.rb
@@ -262,6 +262,7 @@ EOS
     Index.save_thread @thread
     UndoManager.register "labeling thread" do
       @thread.labels = old_labels
+      Index.save_thread @thread
       UpdateManager.relay self, :labeled, @thread.first
     end
   end
@@ -484,6 +485,7 @@ EOS
       Index.save_thread @thread
       UndoManager.register "archiving 1 thread" do
         @thread.apply_label :inbox
+        Index.save_thread @thread
         UpdateManager.relay self, :unarchived, @thread.first
       end
     end
@@ -496,6 +498,7 @@ EOS
       Index.save_thread @thread
       UndoManager.register "marking 1 thread as spam" do
         @thread.remove_label :spam
+        Index.save_thread @thread
         UpdateManager.relay self, :unspammed, @thread.first
       end
     end
@@ -508,6 +511,7 @@ EOS
       Index.save_thread @thread
       UndoManager.register "deleting 1 thread" do
         @thread.remove_label :deleted
+        Index.save_thread @thread
         UpdateManager.relay self, :undeleted, @thread.first
       end
     end
-- 
1.6.5

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

---

From: Anthony Martinez <[email-masked]>
Date: Sun, 3 Jan 2010 23:06:34 -0700

---
 lib/sup/modes/thread-index-mode.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb
index eaed0cb..a5bd344 100644
--- a/lib/sup/modes/thread-index-mode.rb
+++ b/lib/sup/modes/thread-index-mode.rb
@@ -405,7 +405,7 @@ EOS
       jump_to_line n unless n >= topline && n < botline
       set_cursor_pos n
     else
-      BufferManager.flash "No new messages"
+      BufferManager.flash "No new messages."
     end
   end
 
-- 
1.6.5

---

From: William Morgan <[email-masked]>
Date: Tue, 05 Jan 2010 13:26:42 -0800

Sorry to be a pain. Can you resend this patch against the insta-save
branch? (It looks like I don't have the necessary blobs for a 3-way
merge, so I suspect you generated this against an unpublished commit?)
-- 
William <[email-masked]>
_______________________________________________
Sup-devel mailing list
[email-masked]
http://rubyforge.org/mailman/listinfo/sup-devel

---

From: Anthony Martinez <[email-masked]>
Date: Tue, 5 Jan 2010 15:45:38 -0700

As requested, a patch against insta-save. Hopefully this works out better.

I generated this by rebasing my local next onto origin/next, then checked out
a local insta-save and cherry-picked next. There shouldn't be any dependences
on unpublished commits, though, git says my next is only head by this one
patch.
_______________________________________________
Sup-devel mailing list
[email-masked]
http://rubyforge.org/mailman/listinfo/sup-devel

---

From: William Morgan <[email-masked]>
Date: Tue, 05 Jan 2010 13:25:18 -0800

Applied directly to master. Thanks!
-- 
William <[email-masked]>
_______________________________________________
Sup-devel mailing list
[email-masked]
http://rubyforge.org/mailman/listinfo/sup-devel

---

From: William Morgan <[email-masked]>
Date: Tue, 05 Jan 2010 13:25:29 -0800

---

From: William Morgan <[email-masked]>
Date: Tue, 05 Jan 2010 15:47:08 -0800

> As requested, a patch against insta-save. Hopefully this works out better.

Applied to insta-save and remerged into next. Thanks!

> I generated this by rebasing my local next onto origin/next, then
> checked out a local insta-save and cherry-picked next. There shouldn't
> be any dependences on unpublished commits, though, git says my next is
> only head by this one patch.

Ah, the magic of git!

Thanks for all your recent patches, btw. Top notch stuff.
-- 
William <[email-masked]>
_______________________________________________
Sup-devel mailing list
[email-masked]
http://rubyforge.org/mailman/listinfo/sup-devel

---

From: Anthony Martinez <[email-masked]>
Date: Sun, 3 Jan 2010 23:06:35 -0700

---
 lib/sup/modes/inbox-mode.rb |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/lib/sup/modes/inbox-mode.rb b/lib/sup/modes/inbox-mode.rb
index ad3a864..852ddb7 100644
--- a/lib/sup/modes/inbox-mode.rb
+++ b/lib/sup/modes/inbox-mode.rb
@@ -66,9 +66,10 @@ class InboxMode < ThreadIndexMode
     return unless cursor_thread
     thread = cursor_thread # to make sure lambda only knows about 'old' cursor_thread
 
+    was_unread = thread.labels.member? :unread
     UndoManager.register "reading and archiving thread" do
       thread.apply_label :inbox
-      thread.apply_label :unread
+      thread.apply_label :unread if was_unread
       add_or_unhide thread.first
     end
 
-- 
1.6.5

---

From: Anthony Martinez <[email-masked]>
Date: Sun, 3 Jan 2010 23:06:36 -0700

diff --git a/lib/sup/modes/inbox-mode.rb b/lib/sup/modes/inbox-mode.rb
index 852ddb7..1b8eaed 100644
--- a/lib/sup/modes/inbox-mode.rb
+++ b/lib/sup/modes/inbox-mode.rb
@@ -37,6 +37,7 @@ class InboxMode < ThreadIndexMode
     UndoManager.register "archiving thread" do
       thread.apply_label :inbox
       add_or_unhide thread.first
+      Index.save_thread thread
     end
 
     cursor_thread.remove_label :inbox
@@ -50,6 +51,7 @@ class InboxMode < ThreadIndexMode
       threads.map do |t|
         t.apply_label :inbox
         add_or_unhide t.first
+        Index.save_thread t
       end
       regen_text
     end
@@ -71,6 +73,7 @@ class InboxMode < ThreadIndexMode
       thread.apply_label :inbox
       thread.apply_label :unread if was_unread
       add_or_unhide thread.first
+      Index.save_thread thread
     end
 
@@ -94,6 +97,7 @@ class InboxMode < ThreadIndexMode
index a5bd344..28cb858 100644

     threads.each { |t| HookManager.run("mark-as-spam", :thread => t) }
 
index 7c0b869..b08c819 100644
@@ -279,6 +279,7 @@ EOS
@@ -527,6 +528,7 @@ EOS
@@ -539,6 +541,7 @@ EOS
@@ -551,6 +554,7 @@ EOS