Windows 上の Subversion でのコミットメール送信 ~ その2

2018年2月25日

この記事は最初の投稿日から18年経過しています。内容が古い可能性があります。

以前、 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

前提とか。

リポジトリは、d:\svn にあるものとします。

前回同様、メールの送信には 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」

Subversion

Posted by toshyon