bugfree与SVN整合心得

对于Bugfree和SVN整合,我搞了一周终于搞好了,勉强可以使用,并且整合成功。唯一Bug,就是文件信息比较多是在Bugfree中不信息显示不是很好。如附件图片 

 

1、环境的搭架,具体搭建,请见bugfree官方网站的Bugfree和Svn整合
   我用的环境是,Bugfree2.0.3  SVN1.4.6 php5

 

2、代码修复说明
post-commit.bat代码
  
@echo off
setlocal enabledelayedexpansion  /*可使用延迟变量,我是网上找的具体我也不是非常明白*/

set REPOS=%1
set REV=%2
set PHP_EXE=C:\"Program Files"\PHP\php.exe             
  /* 注意:这里如果你的路径名中有空格一定用双引号引起,不然会找不到对应路径*/
set CHECK_IN_PHP=C:\svn_ci.php
set SVN_LOOK_EXE=C:\"Program Files"\Subversion\bin\svnlook.exe

for /f "delims=" %%a in ('%SVN_LOOK_EXE% author -r %REV% %REPOS%')  do set AUTHOR=%%a
for /f "delims=" %%a in ('%SVN_LOOK_EXE% date -r %REV% %REPOS%')    do set DATE=%%a
for /f "delims=" %%a in ('%SVN_LOOK_EXE% changed -r %REV% %REPOS%') do (
set CHANGED=!CHANGED!  %%a        /* 将所有的文件更新数据连接*/
echo changed = !CHANGED!

/* */ 
for /f "delims=" %%a in ('%SVN_LOOK_EXE% log -r %REV% %REPOS%')     do set LOG=%%a
for /f "delims=" %%a in ('%PHP_EXE% -r "echo chr(0x04);"')          do set N=%%a

echo repos = %REPOS%
echo rev = %REV%
echo changed = %CHANGED%
echo LOG = %LOG%


%PHP_EXE% %CHECK_IN_PHP%  "Changeset [%REV%] by %AUTHOR%, %DATE%%N%%LOG%%N%%REV%%N%%CHANGED%"


endlocal

这个文件跟Bugfree官方网上的基本上一样,只有部分进行修改,修改地方我都进行了说明。

 

 

3、SVN_ci.php文件,代码说明,这个文件中的内容我主是通过Bugfree中api-example.php文件来修改的。我发现官网的下载文件内容基本一样。大家直接用官网上文件进行修改也是一样的。

注意:1、可以先通过PHP.exe来调试成功svn_ci.php (如PHP.exe c:\svn_ci.php "123123123 fix bug #3") 
          2、最好是Class.http.php和svn_ci.php放在同一个目录下。

SVN_ci.php代码:

<?php

/**
 * BugFree api 使用样例文件
 */
@header("Content-Type: text/html; charset=gbk");
error_reporting(E_ALL^E_NOTICE);

// 类文件可以从此链接获得:http://www.phpfour.com/blog/downloads/http-class
include('class.http.php');

define('API_NEWLINE', chr(0x03));   // 定义值参考Include/Api.inc.php
define('API_DEVIDER', chr(0x04));   // 定义值参考Include/Api.inc.php
define('API_KEY', 'YOUR_KEY');      // 定义值参考Include/Api.inc.php
define('USER_NAME', 'admin');     // 用户名
define('USER_PASSWORD', 'e10adc3949ba59abbe56e057f20f883e');  // 数据库中存储的密码,一般为md5(原始密码)
define('API', "http://192.168.23.97:8989/bugfree/api.php");      // api地址


print_r($argv);
// 解析api产生的结果
function parse($result)
{
    $apiInfo = array();
    $message = explode(API_NEWLINE, $result);
    if(count($message) == 1) return $message;

    $keyArray = explode(API_DEVIDER, $message[1]);
    $valueArray = explode(API_DEVIDER, $message[2]);
    foreach($keyArray as $key => $keyName)
    {
        $apiInfo[$keyName] = $valueArray[$key];
    }
    return $apiInfo;
}

// 加密函数
function encrypt($UserName, $UserPassword, $ApiKey, $Rand)
{
    return md5(md5($UserName . $UserPassword) . $ApiKey . $Rand);
}

$fixMessageList = explode(API_DEVIDER, $argv[1]);

print_r($fixMessageList);
// get bug IDs
$fixRegx = '/\s*fix\s*bug\s+(#(\d+)( |,)*)+/i';
preg_match_all($fixRegx, $fixMessageList[1], $regs);
$fixRegx = '/#(\d+)+/i';
preg_match_all($fixRegx, $regs[0][0], $regs);
$BugIdList = array();
if(is_array($regs[1]))
{
    $BugIdList = $regs[1];
}

 

$BugIdList = array_unique($BugIdList);
if(count($BugIdList) <= 0) exit;

// create replynote
$note = '';
$note = $fixMessageList[0] . "\n\n";
$fileList = explode("\n", $fixMessageList[3]);
$rev = $fixMessageList[2];
$pre = $rev - 1;
foreach($fileList as $file)
{
    preg_match_all('/(\w)(\s+)(.*)/', $file, $regs);
    $action = trim($regs[1][0]);
    $fileName = trim($regs[3][0]);
    if($fileName == '') continue;
    $note .= $file;
    // u can change this url's link
    $note .= '  [url=' . VIEWVC . $fileName . '?r1='. $pre . '&sortdir=down&r2=' . $rev . '&sortby=log][diff][/url]';
    $note .= "\n";
}

 

// 获得会话
$http = new Http();
$http->addParam('mode' , 'getsid');
//$http->addParam('charset' , 'GBK');
$http->execute(API);
$apiInfo = parse($http->result);
$apiInfo = parse($http->result);
print_r($apiInfo);

// 获得sessionname和sessionid,用于保持后面的对话
$sessionname = $apiInfo['sessionname'];
$sessionid = $apiInfo['sessionid'];

// 使用刚刚获得的会话id进行登录
$http = new Http();
$http->addParam('mode' , 'login');
$http->addParam('charset' , 'GBK');
$http->addParam('username' , USER_NAME);
$http->addParam('auth' , encrypt(USER_NAME, USER_PASSWORD, API_KEY, $apiInfo['rand']));
$http->addParam($sessionname , $sessionid);
$http->execute(API);
$apiInfo = parse($http->result);


print_r($apiInfo);

 

// 编辑Bug
//$BugID = 2;
foreach($BugIdList as $BugID)//遍历所有BugID
{
$http = new Http();
//$http->addParam('charset' , 'GBK');
$http->addParam('mode' , 'updatebug');
//$http->addParam('BugID' , 3);
$http->addParam('BugID' , $BugID);
$http->addParam('ReplyNote' , $note);
//$http->addParam('ReplyNote' , $note);
$http->addParam($sessionname , $sessionid);
$http->execute(API);
$apiInfo = parse($http->result);
print_r($apiInfo);
}

/*
$http = new Http();
$http->addParam('charset' , 'GBK');
$http->addParam('mode' , 'updatebug');
$http->addParam('BugID' , 3);
//$http->addParam('BugID' , $BugID);
$http->addParam('ReplyNote' , $argv[1]);
//$http->addParam('ReplyNote' , $note);
$http->addParam($sessionname , $sessionid);
$http->execute(API);
*/
?>

4、调试Bat文件,(可以将post-commit.bat复制到C盘下,将代码库中hooks目录下的,post-commit.bat修改如下:)
   @echo off
    setlocal
    c:/post-commit.bat %1 %2 > c:/test.log  /*执行C盘下的post-commit.bat,将输入结果存放在c:/test.log文件中*/
   endlocal

5、手动运用 C:\Program Files\Subversion\bin\svnlook.exe 进行一些调试用。网上有更加详细说明。

 

附件中有修改后效果图和修改后文件 

 

 

你可能感兴趣的:(C++,c,PHP,SVN,C#)