有的时候,我们想要统计svn上两个版本或一段时间内的代码修改行数。我们可以通过svn提供的svn diff命令帮助我们解决这个问题。
svn环境
首先,你必须要有一个svn的环境。如果你安装的是TortoiseSVN客户端,那么一定要安装command line client tools。这个就是svn最基本的命令行工具。
比较文件
通过如下命令比较文件差异并输出到文件
svn diff -r 13605:13762 https://192.168.1.1/xxx --username xxx --password xxx > c:/temp_svn_file
分析文件
打开文件,可以看到如下几种类型:
1. 含有1个+或-开头的行
2. 含有3个+或-开头的行
3. 不含有+和-开头的行
其中:1个+和-说明对文件的增加,修改和删除操作。我们只要知道这个,就可以统计修改的代码行数了。
其他符号说明
我们只要统计以+开头的行,就可以知道修改代码的总行数了,为了统计有效修改行数,我们还要剔除掉以+开头并且后面没有内容的空行。
实现
java实现
BufferedReader r = new BufferedReader(new FileReader(new File(this.tempFile)));
while ((line = r.readLine()) != null) {
if (line.startsWith("+") && !line.startsWith("+++") && !isBlank(line.substring(1))) {
count++;
}
}
r.close();
shell脚本实现
#! /bin/bash
# 计算有效变更代码量的脚本
#./svnCount -thttps://192.168.1.1/xxx -s1000 -e2000 -uxxx -pxxx
version() {
OS=`uname -o`
echo "Source_counter ($OS) 0.0.1"
echo " tony bai (http://tonybai.com)"
}
usage() {
echo "usage: source-counter [-t SVN_REPOSITORY_URL] [-s START_REVISION]"
echo " [-e END_REVISION] [-u USER_NAME]"
echo " [-p PASSWD]"
echo " source-counter [-v|-h]"
echo
echo " -t, 目标SVN库地址"
echo " -s, 起始修订号"
echo " -e, 结束修订号"
echo " -u, svn帐号"
echo " -p, svn密码"
echo " -h, 帮助"
echo " -v, 版本信息"
}
if [ $# -lt 2 ]; then
usage
exit 1
fi
while getopts "t:s:e:u:p:vh" opt; do
case $opt in
t) target=$OPTARG;;
s) start_revision=$OPTARG;;
e) end_revision=$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
if [ -z $end_revision ]; then
echo "请输入终止修订号!"
exit 1
fi
TEMPFILE=temp.log
USERNAME=${user:-}
PASSWD=${passwd:-}
svn diff -r$start_revision:$end_revision $target > $TEMPFILE
#去掉含空格的空行
add_lines_count=`grep "^+" $TEMPFILE | grep -v "^+++" | sed 's/^.//'| sed s/[[:space:]]//g |sed '/^$/d'|wc -l`
echo "the actually incremental source code lines = $add_lines_count"