MantisBTとSubversionを連携させてみた。


バグトラッカーのMantisとSubversionを使っているので
Subversionでコミットしたらmantisにコミットログが残ると嬉しなーと思い調べてみた。

基本はここ↓の方法で実現できますが
http://bacons.ddo.jp/wiki/mantis/customize/remote_scm_integration

残念ながら以下の様な理由でそのまま使うことができない
・Mantisが外部レンタルサーバ(Linux系)
・SubversionはローカルのWindowsでのsvnserve運用、外からの参照はできない

具体な部分でいうとpre-commitとpost-commitがWindowsでは使えないので
Windows用に書きなおさなければならない。

ってことでhookスクリプトの部分をWindowsでそのまま使えるであろうcmdとVBSあたりで書いてみた。
※SVNの情報を取得する部分を以下から参考にさせていただきました。
http://www.bnote.net/windows/windows/svn_commitmail.shtml

コミット後の流れとしては
hooks/pre-commit.cmd → ~/pre-commit.vbs
mantis/pre-commit.php
hooks/post-commit.cmd → ~/post-commit.vbs
mantis/post-commit.php
こんな感で



pre-commit.vbs

'MantisのURL
Const URL = "http://www.example.net/mantis/pre_commit.php"

set objArgs = WScript.Arguments
strRepoPath = objArgs(0) 'リポジトリパス
strTxn = objArgs(1) 'リビジョン
strLogMessage = ""
strAuthor = ""
strLogChanged = ""
Set objShell = WScript.CreateObject("WScript.Shell")

' Author の取得
Set objExec = objShell.Exec("svnlook author -t " + strTxn + " " + strRepoPath)
strAuthor = objExec.StdOut.ReadLine

' ログメッセージの取得
Set objExec = objShell.Exec("svnlook log -t " + strTxn + " " + strRepoPath)
Do Until objExec.StdOut.AtEndOfStream
  strLogMessage = strLogMessage & objExec.StdOut.ReadLine & vbCrLf
Loop

' Get changed files
Set objExec = objShell.Exec("svnlook changed -t " + strTxn + " " + strRepoPath)
Do Until objExec.StdOut.AtEndOfStream
  strLogChanged = strLogChanged & objExec.StdOut.ReadLine & vbCrLf
Loop

'URLでいうところのGET値を生成
Body= "account=" & strAuthor & "&log=" & strLogMessage & "&changed=" & strLogChanged

' MSXML.XMLHTTPRequest オブジェクトを作る。
Dim objRequest
set objRequest= WScript.CreateObject("Microsoft.XMLHTTP")
objRequest.open "POST", URL, False

'必要なヘッダのセット
objRequest.setRequestHeader "Content-Length", Len(Body)
objRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 

'送信
objRequest.Send Body

'結果を取得して表示
Dim strString
Dim strSearch
strSearch = "ERROR" 'を検索します

'レスポンスの内容取得
result = objRequest.responseText 

If InStr(result, strSearch) > 0 Then
    Wscript.StdErr.Write "エラーがあります"+ vbCrLf +  result
    WScript.Quit 1
End If

post-commit.vbs
'MantisのURL
Const URL = "http://www.example.net/mantis/pre_commit.php"

set objArgs = WScript.Arguments
strRepoPath = objArgs(0) 'リポジトリパス
strRevision = objArgs(1) 'リビジョン
strLogChanged = ""

Set objShell = WScript.CreateObject("WScript.Shell")

' Author の取得
Set objExec = objShell.Exec("svnlook author " + strRepoPath + " -r " + strRevision)
strAuthor = objExec.StdOut.ReadLine

' ログメッセージの取得
Set objExec = objShell.Exec("svnlook log " + strRepoPath + " -r " + strRevision)
Do Until objExec.StdOut.AtEndOfStream
  strLogMessage = strLogMessage & objExec.StdOut.ReadLine & vbCrLf
Loop

' Get changed files
Set objExec = objShell.Exec("svnlook changed " + strRepoPath + " -r " + strRevision)
Do Until objExec.StdOut.AtEndOfStream
  strLogChanged = strLogChanged & objExec.StdOut.ReadLine & vbCrLf
Loop

'コミットログの生成 ここでログコメントを生成する
strLogMessage = strLogMessage & vbCrLf
strLogMessage = strLogMessage & "Revision: " & strRevision & vbCrLf
strLogMessage = strLogMessage & strLogChanged & vbCrLf

Body= "account=" & strAuthor & "&log=" & strLogMessage & "&strRevision=" & strRevision & "&strRepoPath=" & strRepoPath & "&changed=" & strLogChanged

' MSXML.XMLHTTPRequest オブジェクトを作る。
Dim objRequest
set objRequest= WScript.CreateObject("Microsoft.XMLHTTP")
objRequest.open "POST", URL, False

'必要なヘッダのセット
objRequest.setRequestHeader "Content-Length", Len(Body)
objRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 

'送信
'
objRequest.Send Body

'結果を取得して表示
'
Wscript.Stdout.Write objRequest.responseText 'レスポンスの内容 

Wscript.StdIn.Write "cin"
Wscript.StdErr.Write "cerror"
Wscript.StdOut.Write "cout"

それぞれSvnのリポジトリのhooksディレクトリにhookファイルを設置
パスは適宜読み替えてください

SVN-Repository/hooks/pre-commit.cmd
@echo off
D:
cd \svn
CScript //Nologo ~/mantis_pre_commit.vbs %1 %2

SVN-Repository/hooks/post-commit.cmd
@echo off
D:
cd \svn
CScript //Nologo ~/mantis_post_commit.vbs %1 %2

ちなみにcmdをvbsを分けておくと
複数リポジトリがある場合に、VBSは共有ディレクトリにおいて適宜cmdから呼べるようになるっていう

Comments are closed.