1. 程式人生 > >使用svn命令統計兩次上線之間的程式碼行數,以及不同作者的程式碼行數

使用svn命令統計兩次上線之間的程式碼行數,以及不同作者的程式碼行數

原理

其原理如下: 

1,取得svn的兩個版本之間的diff資料

target=https://svn.xxx.com/erp/trunk/cms/cmsnew

   start_version=113121

   end_version=113128

   步驟一,使用svn diff命令取得SVN兩個版本diff檔案

   svn diff -r$start_version:$end_version$target --username lizejun --password xxx >svndiff.log

   步驟二,然後將檔案取得 開頭為+的行,處理後去掉空行,計算行數

   grep "^+" svndiff.log | grep -v"^+++" | sed 's/^.//'| sed s/[[:space:]]//g |sed '/^$/d'|wc -l

2,取得某個RD在兩次上線版本之間增加的程式碼行數

  步驟一,使用svn log命令取得$rdname提交程式碼的svn版本號

  svn log -q $target -r$start_version:HEAD --username lizejun --password xxx |awk '{print $1,$3}'|grep$rdname |awk '{print \$1}'

 步驟二,將取得的版本號與上一個版本做操作1中的工作,統計程式碼的增加情況

   for rev in ${revs};do

       rev=${rev:1}

       last_rev=$((rev-1))

       ${SVN_CMD} diff -r${last_rev}:${rev} $target --username $USERNAME --password$PASSWD  > $TEMPFILE

       count=`grep "^+" $TEMPFILE | grep -v "^+++" |sed 's/^.//'| sed s/[[:space:]]//g |sed '/^$/d'|wc -l`

       TOTAL=$((TOTAL+count))

       rm -rf $TEMPFILE

    done    

程式碼指令碼

//向我們公司偉大的作者致敬,為防止挖牆腳,去掉作者

#! /bin/bash
# 計算有效變更程式碼量的指令碼
# 包括註釋,但不包括新增的空行
version() {
    OS=`uname -o`
    echo "svn_counter ($OS) 0.0.1"
}


usage() {
    echo "usage: svn_counter [-t SVN_REPOSITORY_URL] [-s START_REVISION]"
    echo "                      [-e END_REVISION] [-u USER_NAME]"
    echo "                      [-p PASSWD]"
    echo "       svn_counter [-v|-h]"
    echo 
    echo "        -t,                 目標SVN庫地址"
    echo "        -s,                 起始修訂號"
    echo "        -e,                 結束脩訂號"
    echo "        -a,                 提交作者"
    echo "        -u,                 svn帳號"
    echo "        -p,                 svn密碼"
    echo "        -h,                 幫助"
    echo "        -v,                 版本資訊"
}


if [ $# -lt 1 ]; then
    usage
    exit 1 
fi


while getopts "t:s:e:a:u:p:vh" opt; do
    case $opt in
        t) target=$OPTARG;;
        s) start_revision=$OPTARG;;
        e) end_revision=$OPTARG;;
        a) author=$OPTARG;;
        u) user=$OPTARG;;
        p) passwd=$OPTARG;;
        v) version; exit 1;;
        h) usage; exit 1;;
    esac
done


if [ -z $target ]; then
    echo "請輸入目標SVN庫地址!"
    exit 1
fi


if [ -z $start_revision ]; then
    echo "請輸入起始修訂號!"
    exit 1
fi




#SVN_CMD='/home/work/local/svn/bin/svn'
SVN_CMD='svn'


TEMPFILE=temp_diff.log
USERNAME=${user}
PASSWD=${passwd}
TOTAL=0


if [ -z $author ]; then
    if [ -z $end_revision ]; then
        ${SVN_CMD} diff -r$start_revision $target --username $USERNAME --password $PASSWD > $TEMPFILE
    else
        ${SVN_CMD} diff -r$start_revision:$end_revision $target --username $USERNAME --password $PASSWD > $TEMPFILE
    fi


    #去掉含空格的空行
    TOTAL=`grep "^+" $TEMPFILE | grep -v "^+++" | sed 's/^.//'| sed s/[[:space:]]//g |sed '/^$/d'|wc -l`
    #沒有去掉有的空行
    #TOTAL=`grep "^+" $TEMPFILE|grep -v "^+++"|sed 's/^.//'|sed '/^$/d'|wc -l`
    
    rm -fr $TEMPFILE
    echo "$TOTAL"
else
    if [ -z $end_revision ]; then   
        revs=`${SVN_CMD} log -q $target  -r $start_revision:HEAD --username $USERNAME --password $PASSWD |awk '{print \$1,\$3}'| grep  ${author}| awk '{print \$1}'`
    else 
        revs=`${SVN_CMD} log -q $target  -r $start_revision:$end_revision --username $USERNAME --password $PASSWD |awk '{print \$1,\$3}'| grep  ${author}| awk '{print \$1}'`
    fi 
    for rev in ${revs};do
        rev=${rev:1}
        last_rev=$((rev-1))


        ${SVN_CMD} diff -r${last_rev}:${rev} $target --username $USERNAME --password $PASSWD  > $TEMPFILE
        count=`grep "^+" $TEMPFILE | grep -v "^+++" | sed 's/^.//'| sed s/[[:space:]]//g |sed '/^$/d'|wc -l`
        TOTAL=$((TOTAL+count))
        rm -rf $TEMPFILE
    done    
    echo "$TOTAL" 
fi