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:
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?