2006-08-24
Windows 上の Subversion でのコミットメール送信 〜 その2
以前、 Windows 上の Subversion でコミットメールを送信する方法を書きました。
前回はバッチファイル(と CMail)だけで処理していましたが、今回は vbs を使ってみました。
vbs を初めて作ったので、なんか勘違いしている処理があるかもしれません。
また、引数チェックやエラー処理はしてません。
コミットするとこんなメールが来ます。
From: toshyon <toshyon@example.com> Subject: [svn:repo:13] trunc/htdocs/ -- Author/Date ----------------------------------- Author : toshyon Date : 2006-08-24 23:15:55 +0900 (木, 24 8 2006) -- Log Message ----------------------------------- 改行位置を修正 -- Changed Directories --------------------------- trunc/htdocs/ -- Changed Files --------------------------------- U trunc/htdocs/index.html
前提とか。
前回同様、メールの送信には CMail を使わせてもらっています。
ファイルの配置は次の通り。
d:\svn\svnmail.vbs d:\svn\cmail.exe d:\svn\cmail.cfg d:\svn\hooks\post-commit.cmd
svnmail.vbs
' ' CScript //Nologo svnmail.vbs REPOPATH REVISION MAILTO REPONAME ' set objArgs = WScript.Arguments strRepoPath = objArgs(0) 'リポジトリパス strRevision = objArgs(1) 'リビジョン strMailTo = objArgs(2) ' メールの宛先 strSubject = objArgs(3) ' メールの題名に追加する接頭子 Set objShell = WScript.CreateObject("WScript.Shell") ' Author の取得 Set objExec = objShell.Exec("svnlook author " + strRepoPath + " -r " + strRevision) strAuthor = objExec.StdOut.ReadLine strMailAddress = getMailAddress(strAuthor) ' コミット日付の取得 Set objExec = objShell.Exec("svnlook date " + strRepoPath + " -r " + strRevision) strDate = objExec.StdOut.ReadLine ' ログメッセージの取得 Set objExec = objShell.Exec("svnlook log " + strRepoPath + " -r " + strRevision) Do Until objExec.StdOut.AtEndOfStream strLogMessage = strLogMessage & objExec.StdOut.ReadLine & vbCrLf Loop ' 変更ディレクトリの取得 Set objExec = objShell.Exec("svnlook dirs-changed " + strRepoPath + " -r " + strRevision) Do Until objExec.StdOut.AtEndOfStream s = objExec.StdOut.ReadLine strDirsChanged = strDirsChanged & s & vbCrLf If strDirsChangedSubject = "" Then strDirsChangedSubject = s Else strDirsChangedSubject = strDirsChangedSubject & "," & s End If Loop ' サブジェクト用の変更ディレクトリは、40文字で切る If Len(strDirsChangedSubject) > 40 Then strDirsChangedSubject = Left(strDirsChangedSubject, 40) & "...." End If ' 変更ファイルの取得 Set objExec = objShell.Exec("svnlook changed " + strRepoPath + " -r " + strRevision) Do Until objExec.StdOut.AtEndOfStream strChanged = strChanged & objExec.StdOut.ReadLine & vbCrLf Loop ' CMail 用のコマンドライン作成 strCmdLine = "cmail -a """ + strAuthor + " <" + strMailAddress + ">"" -s ""[svn:" + strSubject + ":" + strRevision + "] " +strDirsChangedSubject + """ " + strMailTo ' メールの BODY を作成 strBody = strBody & "-- Author/Date -----------------------------------" & vbCrLf strBody = strBody & "Author : " & strAuthor & vbCrLf strBody = strBody & "Date : " & strDate & vbCrLf strBody = strBody & vbCrLf strBody = strBody & "-- Log Message -----------------------------------" & vbCrLf strBody = strBody & strLogMessage & vbCrLf strBody = strBody & "-- Changed Directories ---------------------------" & vbCrLf strBody = strBody & strDirsChanged & vbCrLf strBody = strBody & "-- Changed Files ---------------------------------" & vbCrLf strBody = strBody & strChanged & vbCrLf ' CMail を実行して標準入力に流し込む Set objExec = objShell.Exec(strCmdLine) objExec.StdIn.Write strBody Function getMailAddress(strAuthor) select case strAuthor case "toshyon" getMailAddress = "toshyon@example.com" case "user1" getMailAddress = "user1@example.com" case "user2" getMailAddress = "user2@example.com" case "user3" getMailAddress = "user3@example.com" end select End Function
最後の getMailAddress() という関数は、Author からメールアドレスを得る関数です。
Java だったら HashMap にセットしといてガッっと取ってくるところですが、同じようなことをどうやってやるのかわからず、こんな感じになりました。
ここで得たメールアドレスを、コミットメールの From にセットしています。
hooks\post-commit.cmd
@echo off set APR_ICONV_PATH=C:\Program Files\Subversion\iconv set path=%PATH%;"C:\Program Files\Subversion\bin" D: cd \svn CScript //Nologo svnmail.vbs %1 %2 repo-ml@example.com repo
最後の行で svnmail.vbs を呼んでいます。
メールの宛先はメーリングリストを想定して1つのアドレスだけです。
最後の「repo」は、リポジトリを区別するために、コミットメールの Subject に入れるための文字列です。
その後、メール送信もvbsで行う方法を書いています。「Windows 上の Subversion でのコミットメール送信 〜 その3」