利用SVN log命令統計SVN提交代碼

  1. 題記

    大家在開發中經常會碰到提交SVN代碼時的審覈問題,例如:你從3月25號到4月1號開發了一個需求,此時你要上線的話,需從svn日誌裏篩選出你提交過的文件(全局同步除外),然後確認文件是否被其他同事提交過,這裏你首先需要對你提交文件去重,然後再單獨看每個文件的svn日誌信息有無被其他賬戶提交過。這裏,我們可以利用php的shell執行svn log命令來一步完成如上操作(或者其他語言都可以)。

  2. 開發準備
    首先普及下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輸出到頁面上。。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章