利用SVN log命令统计SVN提交代码

来源:互联网 发布:手机淘宝截图生成器 编辑:程序博客网 时间:2024/05/22 09:00
  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输出到页面上。。

这里写图片描述

0 0
原创粉丝点击