使用脚本统计SVN代码修改数

在不断填坑中前进。。

Posted by 三十一 on January 9, 2018

使用脚本统计SVN代码修改数

今天老大让统计自己这一段写的代码量,之前因为是写的新功能,所有的文件都是新增的比较好统计,使用了 cloc 来统计了代码的总量,最近的修改都是修补一些bug,没怎么大模块的提交代码,都是小小的修修补补,不可能每一次提交都去看下修改的代码行数的,作为一个程序员,还是习惯性的在网上看看前辈们是怎么统计代码的,最后找到了一个工具来统计自己修改的代码数量。脚本如下: 原脚本地址:使用svn命令统计两次上线之间的代码行数,以及不同作者的代码行数

#! /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

试用了一下,使用就比较简单了,统计的也比较准,记录下如何使用。

sh countCode.sh -t 要统计的代码SVN地址 -s 起始版本号 -e 结束版本号 -a 要统计那个用户的代码量 -u 用户名 -p 密码

countCode.sh 为保存上面那段代码的文件名称。