实现的功能

git

根据传入的三个参数:起始统计日期、结束统计日期、git仓库地址。

脚本统计的是git仓库内的所有分支的log信息。

脚本统计的是指定时间段内、每一个提交人指定的git地址的所有分支里的提交代码行的新增情况。

其中代码行可分别统计出:新增的有效代码行数、新增的空行数、新增的注释行数。

并且脚本中还做了相应的提交历史“去重”,避免了这种情况:“某个分支是以其他分支为基础拉出来的,所以会将其他分支的git历史log一并复制,导致log历史重复了两份”,在统计时会去重,多次重复的git提交log只会算作一次提交。

svn

svn的统计方式与git有很大不同,svn要查看log不需要将代码checkout到本地。

svn的log命令最多只能看出,某个时间段内什么用户在什么版本号下修改了那些文件,

至于具体的修改内容,需要结合diff命令对每一个文件进行检查。

有相关log统计需求的朋友可以按照自己的需要修改后使用。

脚本内容

git

脚本布置在jenkins的job上,需要提前传入以下参数:

start_time(起始统计日期,格式为:xxxx-xx-xx xx:xx:xx)

end_time(结束统计日期,格式为:xxxx-xx-xx xx:xx:xx)

repo_url(git仓库地址,如:http://xxx.xxx.xxx.xxx/xxxxx/xxxxx.git

#clone主分支
git clone ${repo_url}
#cd进主分支文件夹
#拆分出url地址的最后一个路径,该路径是clone下来的文件夹名
newurl=${repo_url%.git};
array=(${newurl//// })
filename=${array[${#array[*]}-]}
cd ./$filename
cat>>chash_array
#循环切换各个分支
git branch -r |
grep -v '\->' |
while read remote;
do
#将一个分支拉下来
git checkout "$remote";
#遍历该分支在指定时间节点上的所有提交人
git log --format='%cn' --since="${start_time}" --until="${end_time}" | sort -u | while read name;
do
#遍历该提交人的所有提交hash码
git log --format='%H' --committer="${name}" --since="${start_time}" --until="${end_time}" | while read chash;
do
#0表示当前chash不在总数组中
flag=
while read line;
do
if [ $line = ${chash} ];then
flag=
break
fi
done < chash_array
#如果当前chash值在其中,则不进行log统计,否则将该chash存入总数组,并统计该chash的log
if [ ${flag} -eq ];then
#将chash存入文件
echo $chash>>chash_array
#计算三种该chash的三种代码行数
num_null=`git show ${chash} | awk '/^\+\s*$/' | wc -l`;
num_ann=`git show ${chash} | awk '/^\+\s*\/|^\+\s*\*|^\+\s*\#|^\+\s*\<\!\-\-|^\+\s*\-\-\>/' | wc -l`;
num_all=`git show ${chash} | awk '/^\+/' | wc -l`;
num_code=$(($num_all-$num_null-$num_ann))
#以下开始为有效代码行赋权值,weight为1表示权值是1,为2表示权值是1.,为3表示权值是1.,为4表示权值是1.
weight=
this_file=`git show ${chash} | awk '/diff.*\.js$/' | wc -l`;
if [ $this_file -ne ]; then
weight=
else
this_file=`git show ${chash} | awk '/diff.*\.py$|diff.*\.cpp$|diff.*\.c$|diff.*\.h$|diff.*\.go$|diff.*\.m$|diff.*\.swift$/' | wc -l`;
if [ $this_file -ne ]; then
weight=
else
this_file=`git show ${chash} | awk '/diff.*\.scala$/' | wc -l`;
if [ $this_file -ne ]; then
weight=
fi
fi
fi
#将所有参数传给python脚本 fi
done
done
echo "下一个分支"
done

svn

需提前传入以下参数:

start_time(起始统计日期,格式为:xxxx-xx-xx xx:xx:xx)

end_time(结束统计日期,格式为:xxxx-xx-xx xx:xx:xx)

trunk_repo_id(trunk仓库id号)

trunk_url(trunk仓库地址,如:svn://xxx.xxx.xxx.xxx/项目名/xxx/trunk)

branches_repo_id(branches仓库id号)

branches_url(branch仓库地址,如:svn://xxx.xxx.xxx.xxx/项目名/xxx/branches)

# 1表示当前行内容为“用户名、版本号”。2表示当前行内容为“该版本的某一个被修改了的文件的路径”
dothings=''
#当前正在统计的用户的用户名
username=''
#当前正在统计的版本号
rversion=''
#拼接出文件路径的前缀
OLD_IFS="$IFS"
IFS="/"
arr=($trunk_url)
IFS="$OLD_IFS"
urlpre="svn://""${arr[2]}""/""${arr[3]}""/"
#将需要查询的svn仓库地址装入数组
svn_url_arr=("${trunk_url} ${trunk_repo_id}" "${branches_url} ${branches_repo_id}") for i in "${svn_url_arr[@]}" ;
do
one=($i)
now_url=${one[]}
repo_id=${one[]}
svn log -v -r {"$start_time"}:{"$end_time"} ${now_url} | while read line
do
if [ "${line}" = "------------------------------------------------------------------------" ];
#如果当前行到这行,表示接下来该正则用户名与版本号了。
then
dothings=''
elif [ "${line}" = "Changed paths:" ];
#如果当前行到这行,表示接下来该正则文件路径了
then
dothings=''
elif [ ${dothings} = '' ];
#正则出当前行的用户名和版本号,并赋值
then
OLD_IFS="$IFS"
IFS="|"
arr=($line)
IFS="$OLD_IFS"
rversion=${arr[]#r}
username=${arr[]}
elif [ ${dothings} = '' ];
#正则当前行并拼接出路径,然后diff
then
fileurl=`echo ${line} | awk '/\/.*\..*/'`
#如果不为空,则表示文件格式正确,开始diff该文件详情
if [ -n "$fileurl" ]; then
OLD_IFS="$IFS"
IFS="("
arr=($line)
IFS="$OLD_IFS"
fileurl=${arr[]#*/}
fileurl="$urlpre""${fileurl}" svn diff -c $rversion ${fileurl}
#计算该文件的三种代码行数
num_null=`svn diff -c $rversion ${fileurl} | awk '/^\+\s*$/' | wc -l`;
num_ann=`svn diff -c $rversion ${fileurl} | awk '/^\+\s*\/|^\+\s*\*|^\+\s*\#|^\+\s*\<\!\-\-|^\+\s*\-\-\>/' | wc -l`;
num_all=`svn diff -c $rversion ${fileurl} | awk '/^\+/' | wc -l`;
num_code=$(($num_all-$num_null-$num_ann-)) #以下开始为有效代码行赋权值,weight为1表示权值是1,为2表示权值是1.,为3表示权值是1.,为4表示权值是1.
weight=
this_file=`svn diff -c $rversion ${fileurl} | awk '/\+\+\+.*\.js/' | wc -l`;
if [ $this_file -ne ]; then
weight=
else
this_file=`svn diff -c $rversion ${fileurl} | awk '/\+\+\+.*\.py|\+\+\+.*\.cpp|\+\+\+.*\.c|\+\+\+.*\.h|\+\+\+.*\.go|\+\+\+.*\.m|\+\+\+.*\.swift/' | wc -l`;
if [ $this_file -ne ]; then
weight=
else
this_file=`svn diff -c $rversion ${fileurl} | awk '/\+\+\+.*\.scala/' | wc -l`;
if [ $this_file -ne ]; then
weight=
fi
fi
fi #将所有参数传给python脚本 fi
fi
done
done

shell脚本实现git和svn统计log代码行的更多相关文章

  1. 使用PYTHON统计项目代码行数

    目录 一 使用PYTHON统计项目代码行数 二 应用实例 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 使用PYTHON统计项目代码行数 遇到一个非常小的需求:统计一个项目里头的各类源代码 ...

  2. VS2012 利用正则统计项目代码行数

    原文:VS2012 利用正则统计项目代码行数 #开头和/开头或者空行都不计入代码量,  搜索出来以后最后一行就是代码行数了:

  3. Visual Studio使用正则表达式快速统计总共代码行数

    原文:Visual Studio使用正则表达式快速统计总共代码行数 按CTRL+SHIFT+F,勾上支持正则表达式,然后输入搜索内容: <span style="font-family ...

  4. Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.

    Atitit.Guibutton与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi:::  代码行数(凝视行数,空白的行数), 方法数,class数 1 2. ...

  5. Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数.

    Atitit.Gui按钮与面板---项目规模的评估----文件数统计,结构,代码行数,每类型文件行数. 1. Kpi:::  代码行数(注释行数,空白的行数), 方法数,class数 1 2. 过滤器 ...

  6. IDEA 怎么统计项目代码行数

    引言 IDEA 统计项目代码行数,主要是使用 Statistic 插件来统计 第一步 点击 File->Settings,如下图所示: 第二步 点击 install 安装 Statistic 插 ...

  7. jenkins+gitlab钩子+shell脚本基于git的tag实现App增量更新

    转自:http://blog.csdn.net/kingboyworld/article/details/54175330 环境安装 jdk1.8 1.安装jenkins 首先到https://jen ...

  8. shell脚本实现网站日志分析统计

    如何用shell脚本分析与统计每天的访问日志,并发送到电子邮箱,以方便每天了解网站情况.今天脚本小编为大家介绍一款不错的shell脚本,可以实现如上功能. 本脚本统计了:1.总访问量2.总带宽3.独立 ...

  9. linux shell脚本守护进程监控svn服务

    最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...

随机推荐

  1. vue 引入iconfont字体库

    1.登录官网 https://www.iconfont.cn/ 2.选择所需要的图标加入图库 新建项目 选择fontClass 并下载到本地   目录如下 3.项目 assets目录下 新建  ico ...

  2. MySQL安装时MySQL server一直安装失败日志显示This application requires Visual Studio 2013 Redistributable

    使用MySQL社区版的msi包进行安装,试了好多次,别的组件都能正常安装,只有MySQL server的安装状态显示为fail.删除所有安装的程序,包括所依赖的各种Microsoft发布的包,删除所有 ...

  3. pat1067 在离散数学中置换群思想上可用并查集和递归两种方法求解问题

    1.递归求解  注:叙述时 节点其实就是数字0-N-1 !!!最好用一个数组记录0-N-1每个数字的位置 !!!递归计算一个置换群内部的节点数 分为两种情况 累加M,M即是一个置换群所有数字在正确位置 ...

  4. 阿里云centos怎么用xshell5登陆

    第一种是用ssh,安装Xshell5   打开XShell   新建会话输入ip   选择新建的会话,点击连接,选择接受并保护,输入root,点击确定   输入密码   已经连接成功了,用Xshell ...

  5. [IoC容器Unity]第二回:Lifetime Managers生命周期

    1.引言 Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理,非常方便,下面就介 ...

  6. TGCA数据的标准化以及差异分析--转载

    转载果子学生信  https://mp.weixin.qq.com/s/Ph1O6V5RkxkyrKpVmB5ODA 前面我们从GDC下载了TCGA肿瘤数据库的数据,也能够把GDC下载的多个TCGA文 ...

  7. 使用sphinx制作接口文档并托管到readthedocs

    此sphinx可不是彼sphinx,此篇是指生成文档的工具,是python下最流行的文档生成工具,python官方文档即是它生成,官方网站是http://www.sphinx-doc.org,这里是一 ...

  8. 微信、qq二次分享

    前言 我们平时做微信分享的时候,一般分享出来的页面都是一个简单的html页面,不会加入框架之类的东西.所以当我们在分享出来的页面里面再次进行分享的时候,由于我们没有配置分享的标题.描述这些东西,分享出 ...

  9. Evaluate X and Y returned from the differential equation solvers using printput frequency in Python的代码

    把内容过程中经常用到的一些内容段做个备份,如下的内容是关于Evaluate X and Y returned from the differential equation solvers using ...

  10. 合并K个排序链表(java实现)

    题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: ...