題記
大家在開發中經常會碰到提交SVN代碼時的審覈問題,例如:你從3月25號到4月1號開發了一個需求,此時你要上線的話,需從svn日誌裏篩選出你提交過的文件(全局同步除外),然後確認文件是否被其他同事提交過,這裏你首先需要對你提交文件去重,然後再單獨看每個文件的svn日誌信息有無被其他賬戶提交過。這裏,我們可以利用php的shell執行svn log命令來一步完成如上操作(或者其他語言都可以)。
開發準備
首先普及下svn log命令:這裏我直接複製別人博客的詳解
log: 顯示一組版本與/或文件的提交日誌信息。
用法: 1、log [PATH]
2、log URL[@REV] [PATH…]1、顯示本地 PATH (默認: “.”) 的日誌信息。默認的版本範圍是 BASE:1。
2、顯示 URL 中 PATH (默認: “.”) 的日誌信息。如果指定了 REV,就從 REV
開始查找 URL,版本範圍是 REV:1。否則就從 HEAD 開始查找 URL,版本範圍
是 HEAD:1。
有效選項:
-r [–revision] ARG : ARG (一些命令也接受ARG1:ARG2範圍)
版本參數可以是如下之一:
NUMBER 版本號
‘{’ DATE ‘}’ 在指定時間以後的版本
‘HEAD’ 版本庫中的最新版本
‘BASE’ 工作副本的基線版本
‘COMMITTED’ 最後提交或基線之前
‘PREV’ COMMITTED的前一版本
-q [–quiet] : 不打印信息,或只打印概要信息
-v [–verbose] : 打印附加信息
-g [–use-merge-history] : 從合併歷史使用/顯示額外信息
-c [–change] ARG : 版本 ARG 引起的改變
–targets ARG : 傳遞文件 ARG 內容爲附件參數
–stop-on-copy : 查看歷史不要跨越不同的副本
–incremental : 給予適合串聯的輸出
–xml : 輸出爲 XML
-l [–limit] ARG : 日值項最大值
–with-all-revprops : 獲取所有版本屬性
–with-no-revprops : 沒有找回版本屬性
–with-revprop ARG : 獲取版本屬性 ARG
全局選項:
–username ARG : 指定用戶名稱 ARG
–password ARG : 指定密碼 ARG
–no-auth-cache : 不要緩存用戶認證令牌
–non-interactive : 不要交互提示
–trust-server-cert : 不提示的接受未知的 SSL 服務器證書(只用於選項 “–non-interactive”)
–config-dir ARG : 從目錄 ARG 讀取用戶配置文件
–config-option ARG : 以下屬格式設置用戶配置選項:
FILE:SECTION:OPTION=[VALUE]
例如:
servers:global:http-library=serf
3. 代碼
$user_name=$this->getParam('name');
$start_time=$this->getParam('start_time');
$end_time=$this->getParam('end_time');
$svn_url='你的svnurl';
$usernmae='你的svn用戶名';
$password='你的svn密碼';
$dir ='你項目的目錄'
//調試錯誤時,加上2>&1,利用log -r 選項篩選時間段的日誌
$shell = '/usr/bin/svn log '.$svn_url.$dir.' -r {"'.$start_time.'"}:{"'.$end_time.'"} -v --username '.$username.' --password '.$password.' --no-auth-cache';
$output = shell_exec($shell);
//這裏的output就是svn log返回的日誌信息 如下對log信息格式化成我們需要的
$output = explode('------------------------------------------------------------------------',$output);
$commit_arr = array(); //提交文件的數組
$waring = ''; //文件有被其他用戶提交過的警告
foreach($output as $key=>$val){
$tmp_arr = explode('|',$val);
if(count($tmp_arr)>1){
$time = substr(trim($tmp_arr[2]),0,19);
//再次篩選用戶和時間段在條件內
if(trim($tmp_arr[1])==$user_name && $time>=$start_time && $time<$end_time)
{
$match_dir = str_replace('/','\/',$dir);
preg_match_all('/'.$match_dir.'.+/',$tmp_arr[3],$file_arr);
$file_arr = $file_arr[0];
foreach($file_arr as $file_val){
if(!in_array($file_val,$commit_arr)){
//調取每個文件的詳細日誌,以判斷其他用戶是否有提交的記錄
$shell1 = '/usr/bin/svn log '.$svn_url.$file_val.' -r {"'.$start_time.'"}:{"'.$end_time.'"} -v --username '.$username.' --password '.$password.' --no-auth-cache';
$output1 = shell_exec($shell1);
$output1 = explode('------------------------------------------------------------------------',$output1);
foreach($output1 as $key1=>$val1){
$tmp_arr1 = explode('|',$val1);
if(count($tmp_arr1)>1){
if(trim($tmp_arr1[1])!=$user_name){
$waring.= $file_val.' '.$tmp_arr1[1].'在'.substr(trim($tmp_arr1[2]),0,19).'期間'.'提交過版本,請確認'.'<br/>';
}
}
}
$commit_arr[]=$file_val;
}
}
}
}
}
if($commit_arr){
$json_out['status']=1;
$json_out['files'] = implode('<br />',$commit_arr);
$json_out['waring'] = $waring;
}else{
$json_out['status']=0;
}
echo json_encode($json_out);exit;
我的前臺是這樣 直接將json輸出到頁面上。。