It seems like there was some bitrot on the previous version of this
which made it not work correctly.  This fixes the bitrot and also
updates how it works.

- Sometimes [PATCH.*] isn't at the beginning of the message (often on
  lists I'm on).
- It now goes through all the messages in the thread.  for some reason
  the toplevel messages didn't usually contain all the patches in my
  testing.
- Check for 'Re:' at the beginning and skip if it's there.
- Save patches to filesystem-safe filename containing the subject
  (unfortunately we use system()...)

    Ian
---

We now prompt for directory name to save to.  Also save in the format
closer to git with numbers first.

 vim/notmuch.vim | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/vim/notmuch.vim b/vim/notmuch.vim
index 331e930..8c46bb0 100644
--- a/vim/notmuch.vim
+++ b/vim/notmuch.vim
@@ -178,16 +178,32 @@ EOF
 endfunction

 function! s:show_save_patches()
+       let dir = input('Save to directory: ', getcwd(), 'dir')
 ruby << EOF
-       q = $curbuf.query($cur_thread)
-       t = q.search_threads.first
-       n = 0
-       t.toplevel_messages.first.replies.each do |m|
-               next if not m['subject'] =~ /^\[PATCH.*\]/
-               file = "%04d.patch" % [n += 1]
-               system "notmuch show --format=mbox id:#{m.message_id} > #{file}"
-       end
-       vim_puts "Saved #{n} patches"
+       dir = VIM::evaluate('dir')
+       if File.exists?(dir)
+               q = $curbuf.query($cur_thread)
+               t = q.search_threads.first
+               n = 0
+               m = get_message
+               t.messages.each do |m|
+                       next if not m['subject'] =~ /\[PATCH.*\]/
+                       next if m['subject'] =~ /^Re:/
+                       subject = m['subject']
+                       # Sanitize for the filesystem
+                       subject.gsub!(/[^0-9A-Za-z.\-]/, '_')
+                       # Remove leading underscores.
+                       subject.gsub!(/^_+/, '')
+                       # git style numbered patchset format.
+                       file = "#{dir}/%04d-#{subject}.patch" % [n += 1]
+                       vim_puts "Saving patch to #{file}"
+                       system "notmuch show --format=mbox id:#{m.message_id} > 
#{file}"
+               end
+               vim_puts "Saved #{n} patch(es)"
+       else
+               VIM::command('redraw')
+               vim_puts "ERROR: Invalid directory: #{dir}"
+       end
 EOF
 endfunction

-- 
1.9.3

Reply via email to