昨日の記事「
Publish::Jaikuをでっちあげた」でご紹介したソースコードは、最終的には
CodeReposにcommitする事にしました。
で、その際CodeReposのトップページで読んだコミットルール
Commit messege rule
svn ci -m "lang/LanguageName/BigProjectName: Commit messege."
svn ci -m "lang/LanguageName/misc/ScriptName: Commit messege."
svn ci -m "dotfiles/SoftwareName/Username-Filename: Commit messege."
を守ってcommit時にファイル名を一覧しました。
で、悩んだのが複数のファイルをcommitする場合。
色々な人のcommit logを見てたら、皆さん
lang/LanguageName/BigProjectName,
lang/LanguageName/misc/ScriptName,
dotfiles/SoftwareName/Username-Filename:
Added.
といった書き方をされていました。
でもこれってU*NIXなら"pwd"して、コピれば簡単ですが、Windowsの場合は"¥"になったり、部分的にチェックアウトしている場合には"pwd"で取得出来るものはなかったりと不便だったりします。
で、なんか楽出来ないかなと思いまして今回はこのcommit対象ファイル一覧を"svn commit"時のコメントとして出力してくれるvimscriptをご紹介します。
※というか、さっき作りました。
仕組みとしては、"svn info"を実行すると出力される
URL : http://host/root/path/to/dir
Repository Root : http://host/root
という部分の2行の差、「path/to/dir」を取得し、svn commit実行時にエディタに表示されている
A docs
A docs/file1.txt
A docs/file2.txt
A docs/file3.txt
のファイル名部分の先頭に上記フォルダ「path/to/dir」を付与し
path/to/dir/docs,
path/to/dir/docs/file1.txt,
path/to/dir/docs/file2.txt,
path/to/dir/docs/file3.txt:
というコメントを生成します。
あとはこれをFileTypeがsvnの場合に動作するようにautocmdを作ればsvn commit時に
path/to/dir/docs,
path/to/dir/docs/file1.txt,
path/to/dir/docs/file2.txt,
path/to/dir/docs/file3.txt:
A docs
A docs/file1.txt
A docs/file2.txt
A docs/file3.txt
という画面が現れます。カーソルも":"の次の行に移動しますので、そこからコメントを書くと事が出来ます。
ツールは横着から生まれる物ですね!
vimscriptのコードは以下の通り
File:
Author:
Last Change:
Version:
function! AppendCommitFiles()
let lstart = search("^--", "n")
let lend = line("$")
if line(".") > 1 || lstart != 2
return
endif
let oldlang=$LANG
let $LANG="C"
let lines=system("svn info")
let $LANG=oldlang
let url=substitute(lines, '.*\nURL: \([^\x0A]*\).*', '\1', '')
let root=substitute(lines, '.*\nRepository Root: \([^\x0A]*\).*', '\1', '')
if match(url, root) != 0
return
endif
let basedir=substitute(strpart(url, strlen(root)), '^\/*', '', '')
let lcur = lstart
let lines = ""
let mx = '^\s*[A-Z]\s\+\([^$]\+\)$'
while lcur <= lend
let line = getline(lcur)
if line =~ mx
let lines .= basedir."/".substitute(line, mx, '\1', '')."\<NL>"
endif
let lcur = lcur + 1
endwhile
let lines = substitute(lines, '\n.', ',&', 'g')
let lines = substitute(lines, '\n$', ':&', '')
call cursor(0)
let value = getreg("a")
let type = getregtype("a")
call setreg("a", lines, "c")
execute 'normal! "ap'
call setreg("a", value, type)
silent! /^$
endfunction
autocmd FileType svn call AppendCommitFiles()
例によって、このソースもCodeReposの
コノ辺に置く予定です。
追記
ちょこっと修正