sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit 9a5c0d1193fa4eefbab4db7c70c422bf653aeaf3
parent 3f70db83086f4e3d3769d24cfe17f9f30c86a6b1
Author: William Morgan <wmorgan-sup@masanjin.net>
Date:   Thu,  1 Oct 2009 13:35:42 -0400

Merge branch 'save-all-attachments' into next

Diffstat:
M lib/sup/buffer.rb | 4 ++--
M lib/sup/mode.rb | 15 +++++++++++----
M lib/sup/modes/thread-view-mode.rb | 27 +++++++++++++++++++++++++++
3 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb
@@ -472,7 +472,7 @@ EOS
     end
   end
 
-  def ask_for_filename domain, question, default=nil
+  def ask_for_filename domain, question, default=nil, allow_directory=false
     answer = ask domain, question, default do |s|
       if s =~ /(~([^\s\/]*))/ # twiddle directory expansion
         full = $1
@@ -497,7 +497,7 @@ EOS
       answer =
         if answer.empty?
           spawn_modal "file browser", FileBrowserMode.new
-        elsif File.directory?(answer)
+        elsif File.directory?(answer) && !allow_directory
           spawn_modal "file browser", FileBrowserMode.new(answer)
         else
           File.expand_path answer
diff --git a/lib/sup/mode.rb b/lib/sup/mode.rb
@@ -74,15 +74,22 @@ EOS
 
 ### helper functions
 
-  def save_to_file fn
+  def save_to_file fn, talk=true
     if File.exists? fn
-      return unless BufferManager.ask_yes_or_no "File exists. Overwrite?"
+      unless BufferManager.ask_yes_or_no "File \"#{fn}\" exists. Overwrite?"
+        info "Not overwriting #{fn}"
+        return
+      end
     end
     begin
       File.open(fn, "w") { |f| yield f }
-      BufferManager.flash "Successfully wrote #{fn}."
+      BufferManager.flash "Successfully wrote #{fn}." if talk
+      true
     rescue SystemCallError, IOError => e
-      BufferManager.flash "Error writing to file: #{e.message}"
+      m = "Error writing file: #{e.message}"
+      info m
+      BufferManager.flash m
+      false
     end
   end
 
diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb
@@ -58,6 +58,7 @@ EOS
     k.add :alias, "Edit alias/nickname for a person", 'i'
     k.add :edit_as_new, "Edit message as new", 'D'
     k.add :save_to_disk, "Save message/attachment to disk", 's'
+    k.add :save_all_to_disk, "Save all attachments to disk", 'A'
     k.add :search, "Search for messages from particular people", 'S'
     k.add :compose, "Compose message to person", 'm'
     k.add :subscribe_to_list, "Subscribe to/unsubscribe from mailing list", "("
@@ -339,6 +340,32 @@ EOS
     end
   end
 
+  def save_all_to_disk
+    m = @message_lines[curpos] or return
+    default_dir = ($config[:default_attachment_save_dir] || ".")
+    folder = BufferManager.ask_for_filename :filename, "Save all attachments to folder: ", default_dir, true
+    return unless folder
+
+    num = 0
+    num_errors = 0
+    m.chunks.each do |chunk|
+      next unless chunk.is_a?(Chunk::Attachment)
+      fn = File.join(folder, chunk.filename)
+      num_errors += 1 unless save_to_file(fn, false) { |f| f.print chunk.raw_content }
+      num += 1
+    end
+
+    if num == 0
+      BufferManager.flash "Didn't find any attachments!"
+    else
+      if num_errors == 0
+        BufferManager.flash "Wrote #{num.pluralize 'attachment'} to #{folder}."
+      else
+        BufferManager.flash "Wrote #{(num - num_errors).pluralize 'attachment'} to #{folder}; couldn't write #{num_errors} of them (see log)."
+      end
+    end
+  end
+
   def edit_draft
     m = @message_lines[curpos] or return
     if m.is_draft?