文章源地址:http://www.cppblog.com/cloud/archive/2008/09/11/61606.aspx
要整合Mantis和SVN,需要幾個工具:
SVN用戶端,TortoiseSVN,: http://tortoisesvn.net/
SVN服務端,這個應該都有吧。
Mantis缺陷跟蹤系統 http://www.mantisbt.org/
首先在TortoiseSVN裡設定一下項目的屬性,右鍵點擊目錄,屬性,在subversion一欄裡,加入這幾個屬性
bugtraq:label = issue
bugtraq:url = http://%3cmantisserver%3e/mantis/view.php?id=%BUGID%
bugtraq:message = issue %BUGID%
bugtraq:warnifnoissue = true
到對應的SVN版本庫裡,找到hooks目錄,建立一個post-commit.bat檔案,將以下內容拷入:
REM Post-commit hook for MantisBT integration
rem REPOS svn版本庫的路徑
rem REV 版本資訊
rem DETAILS_FILE 是版本庫的目錄,在版本庫目錄下建立一個log的目錄,用來存放日誌
rem set PHPRC=D:\EasyPHP\apache 預設會使用windows 目錄下的 php.ini 修改後,讀取 easyphp\apach 目錄下
rem 拷貝了 checkin.php 進行修改,重新命名 為 checkin_svn.php 如果有中文傳輸,需要修改 checkin_svn.php
rem 增加抓換函數 $t_comment = mb_convert_encoding($t_comment, "utf-8","GB2312");
rem 修改位置在 “ foreach ( $t_issues as $t_issue_id ) { ”前面
rem mb_convert_encoding 此函數需要擴充檔案php_mbstring.dll的支援~~
rem $t_comment = iconv("UTF-8","GB2312//TRANSLIT",$t_comment); 據說這個編碼轉換效率更高
SET REPOS=%1
SET REV=%2
SET DETAILS_FILE=D:\svn\no1\log\svnfile_%REV%
SET LOG_FILE=D:\svn\no1\log\svnfile_%REV%_Log
set APR_ICONV_PATH=D:\EasyPHP\Subversion\iconv
set PHPRC=D:\EasyPHP\apache
set path=%path%;D:\EasyPHP\php5;D:\EasyPHP\Subversion\bin;
echo ****** Source code change ******>>%DETAILS_FILE%
echo SVN 修改人: >>%DETAILS_FILE%
svnlook author -r %REV% %REPOS%>>%DETAILS_FILE%
echo SVN 修改日期: >>%DETAILS_FILE%
svnlook date -r %REV% %REPOS%>>%DETAILS_FILE%
echo SVN 版本: >>%DETAILS_FILE%
echo %REV%>>%DETAILS_FILE%
echo SVN 提交注釋: >>%DETAILS_FILE%
svnlook log -r %REV% %REPOS%>>%DETAILS_FILE%
echo SVN 修改明細: >>%DETAILS_FILE%
svnlook diff -r %REV% %REPOS%>>%DETAILS_FILE%
rem php.exe .\checkin_svn.php 資訊檔記錄檔
php.exe D:\EasyPHP\www\mantis\core\checkin_svn.php <%DETAILS_FILE%>%LOG_FILE%
del %DETAILS_FILE%
del %LOG_FILE%
最後,修改mantis安裝目錄下的config_inc.php,加入以下內容(mantis系統裡要有SVN使用者):
$g_source_control_notes_view_status = VS_PUBLIC;
$g_source_control_account = 'SVN';
$g_source_control_set_status_to = OFF;
$g_source_control_regexp = "/\bissue [#]{0,1}(\d+)\b/i";
完成這些步驟後,就可以在SVN提交新版本時,同時發布內容到對應的缺陷跟蹤系統了。
比如,修改了一個源檔案,svn commit時,在右上的issue欄目裡輸入要提交到的具體的 issue/bug 編號,
然後在下面的message框內輸入具體的描述,svn的hook就會自動往mantis裡對應的條目裡寫入你提交時輸入的這些內容。
完成以上工作後使用過程中還存在一些問題
1、缺陷號沒有強制輸入,如果沒有輸入缺陷號,仍然可以提交
2、輸入了錯誤的缺陷號,系統仍然提交,但是缺陷系統中沒有相關的內容
解決這個問題,需要在提交前,對缺陷資訊進行校正
一、建立 pre-commit.bat 校正缺陷號
REM pre-commit.bat hook for MantisBT integration
set REPOS=%1
set TXN=%2
SET DETAILS_FILE=D:\svn\no1\log\svnfile
SET LOG_FILE=D:\svn\no1\log\svnfile_Log
set APR_ICONV_PATH=D:\EasyPHP\Subversion\iconv
set PHPRC=D:\EasyPHP\apache
set path=%path%;D:\EasyPHP\php5;D:\EasyPHP\Subversion\bin;
rem 把注釋資訊寫入到 DETAILS_FILE
svnlook log "%REPOS%" -t "%TXN%" >>%DETAILS_FILE%
rem 執行checkin_svn_pre_commit.php 進行校正缺陷單號 是否在缺陷系統中存在,如果不存在,返回輸出資訊到 log_file中
php.exe D:\EasyPHP\www\mantis\core\checkin_svn_pre_commit.php <%DETAILS_FILE%>%LOG_FILE%
rem 校正log_file中是否有內容,如果有內容,轉入到出錯提示
FOR /F "tokens=1,2* delims= " %%i in (%LOG_FILE%) do goto err
del %DETAILS_FILE%
del %LOG_FILE%
exit 0
:err
echo 缺陷單不存在,請正確填寫缺陷單號,提交終止! 1>&2
del %DETAILS_FILE%
del %LOG_FILE%
exit 1
二、建立checkin_svn_pre_commit.php 到資料庫中校正缺陷單資訊
拷貝 checkin.php 內容 建立checkin_svn_pre_commit.php 檔案
刪除 # add note to each bug only once 之後的到 exit( 0 ); 內容,修改為以下內容
# add note to each bug only once
$t_issues = array_unique( $t_issues );
$t_fixed_issues = array_unique( $t_fixed_issues );
$t_issues_svn = array_unique( $t_issues );
# 編碼轉換.
$t_comment = mb_convert_encoding($t_comment, "utf-8","GB2312");
# 判斷資料庫中的 缺陷單號是否存在
foreach ( $t_issues_svn as $t_issue_id ) {
$query = "SELECT *
FROM mantis_bug_table
WHERE bug_text_id='$t_issue_id'";
$result = db_query( $query );
$issues_raw_count = db_num_rows( $result );
if ($issues_raw_count == 0){
echo "$t_issue_id";
}
}
exit( 0 );
至此大部分的工作都已經完成,但是還存在一些問題
1 新增等操作的時候,有時候提交沒有出現收入 issue 提示框,但是此時仍然需要輸入缺陷號
測試可以要求,在提交注釋的時候,按照 issue 1 形式手工寫入缺陷單號,即可提交