としよんメモ RSSフィード Twitter

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

前提とか。

リポジトリは、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」