sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit 0daa8672bfe50b7c469d8f75effe0dfd42ac92e7
parent cdcc2c6287fad41b4d5247d713ceb5ec935ab8a7
Author: Peter Harkins <ph@malaprop.org>
Date:   Fri,  5 Feb 2010 11:13:51 -0600

Recover if a draft message is deleted from the filesystem. (issue 61)

Signed-off-by: Hamish Downer 

Diffstat:
M lib/sup/draft.rb | 3 ++-
M lib/sup/modes/resume-mode.rb | 3 +++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/lib/sup/draft.rb b/lib/sup/draft.rb
@@ -23,7 +23,7 @@ class DraftManager
   def discard m
     raise ArgumentError, "not a draft: source id #{m.source.id.inspect}, should be #{DraftManager.source_id.inspect} for #{m.id.inspect}" unless m.source.id.to_i == DraftManager.source_id
     Index.delete m.id
-    File.delete @source.fn_for_offset(m.source_info)
+    File.delete @source.fn_for_offset(m.source_info) rescue Errono::ENOENT
     UpdateManager.relay self, :single_message_deleted, m
   end
 end
@@ -72,6 +72,7 @@ class DraftLoader < Source
   end
 
   def load_message offset
+    raise SourceError, "Draft not found" unless File.exists? fn_for_offset(offset)
     File.open fn_for_offset(offset) do |f|
       RMail::Mailbox::MBoxReader.new(f).each_message do |input|
         return RMail::Parser.read(input)
diff --git a/lib/sup/modes/resume-mode.rb b/lib/sup/modes/resume-mode.rb
@@ -9,6 +9,9 @@ class ResumeMode < EditMessageMode
     header.delete "Date"
 
     super :header => header, :body => body, :have_signature => true
+  rescue Errno::ENOENT
+    DraftManager.discard @m
+    BufferManager.flash "Draft deleted outside of sup."
   end
 
   def unsaved?; !@safe end