適当な思いつきで書くブログ

UbuntuやPerlやJavaScriptやVimやZshやShellScriptやMySQLと戯れている中で適当な思いつきでやってみたことを書いています。

svn.vimをちょっとだけ便利に

svn-diff.vim - Show diff when commiting changes on a subversion repository : vim online
Subversionによるソース管理を行なっているVimmerの多く(?)の方は、svn.vim(svn-diff.vim)を利用されていると思います。
もれなく私も利用していますが、コミット時にsvn diffの結果を表示してくれる非常に便利なプラグインです。

もうちょっとだけ便利に

コミットするファイルの

  • svn info情報(コミット先URLだけ)
  • 最終コミットログ

も表示するようにしてみました。

以下のように表示されます。

URL: http://svn.com/repos/TestProject/trunk/hoge.pl
------------------------------------------------------------------------
r123 | tekiomo | 2011-01-11 19:43:39 +0900 (火, 11  12011) | 3 lines

refs #10
hogeを1個削除

------------------------------------------------------------------------
URL: http://svn.com/repos/TestProject/trunk/fuga.pl
------------------------------------------------------------------------
r234 | tekiomo | 2011-01-11 19:44:04 +0900 (火, 11  12011) | 3 lines

refs #10
fugaを1個追加

------------------------------------------------------------------------
Index: trunk/hoge.pl
===================================================================
--- trunk/hoge.pl  (リビジョン 123)
+++ trunk/hoge.pl  (作業コピー)
@@ -12,4 +12,3 @@
 hoge
 hoge
 
-hoge
(以下省略)

diff

diffはこんな感じ

$ diff -u svn.vim.org svn.vim
--- svn.vim.org	2011-01-11 20:04:36.175583001 +0900
+++ svn.vim	2011-01-11 20:03:31.455583000 +0900
@@ -22,26 +22,33 @@
 
 function! Svn_diff_windows()
     let i = 0
-    let list_of_files = ''
+    let files = []
 
     while i <= line('$')
         let line = getline(i)
         if line =~ '^M'
 
             let file = substitute(line, '\v^MM?\s*(.*)\s*$', '\1', '')
-            let list_of_files = list_of_files . ' '.file
+            call add(files, file)
         endif
 
         let i = i + 1
     endwhile
 
-    if list_of_files == ""
+    if len(files) == 0
         return 
     endif
+
+    let list_of_files = join(files, ' ')
     
     new
     silent! setlocal ft=diff previewwindow bufhidden=delete nobackup noswf nobuflisted nowrap buftype=nofile
-    exe 'normal :r!LANG=C svn diff ' . list_of_files . "\n"
+    for file in files
+        execute 'normal :r!LANG=ja_JP.UTF8 svn info ' . file . " | grep 'URL:'\n"
+        execute 'normal :r!LANG=ja_JP.UTF8 svn log -r PREV:HEAD --limit=1 ' . file . "\n"
+    endfor
+
+    execute 'normal :r!LANG=ja_JP.UTF8 svn diff ' . list_of_files . "\n"
     setlocal nomodifiable
     goto 1
     redraw!

svn log部分を直しました

ログを持ってこれないときがあって社長が修正してくださいました。差分は↓です。(上記のdiffは修正済み)

-        execute 'normal :r!LANG=ja_JP.UTF8 svn log -r BASE ' . file . "\n"
+        execute 'normal :r!LANG=ja_JP.UTF8 svn log -r PREV:HEAD --limit=1 ' . file . "\n"


コミット時のミスをちょっとだけ防げるようになるかなーと思います。