[PATCH v2] VIM: Make patch saving in vim a little better.

Subject: [PATCH v2] VIM: Make patch saving in vim a little better.

Date: Mon, 20 Oct 2014 12:44:34 -0700

To: notmuch@notmuchmail.org

Cc:

From: Ian Main


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


Thread: