一天,领导让你统计一下最近一年,项目代码行数变化趋势。这该如何下手?
总体思路
- 计算出最近一年每个月的最后一天的时间
- 拿到每个月最后一次提交的commitId
- git checkout commitId
- 统计该 commitId 对应的代码
- 汇总得到最近一年代码变化趋势
第二步可以通过 gitlab 提供的 api 取得
第四步可以借助 scc 这个工具
gitlab api
此处用到的 api 为获取 commits 列表的 api :
GET /projects/:id/repository/commits
👉🏻文档传送门
此处需要传递的参数为:开始时间 since、结束时间 until、分支名称 ref_name(此处传主分支名 master 即可)
scc是啥
GitHub地址
scc可以用来统计项目各个类型文件的代码行数、文件数、注释行数、空格行数等。很🐂🍺的工具。需要将代码下载(下载地址)到本地,然后执行其代码即可。
开工
1. 计算出最近一年每个月的最后一天的时间
写个方法得到形如图所示的时间,之所以开始时间设为当月最后一天时间的前十天,是避免当月最后有好几天没提交过代码
2. 拿到每个月最后一次提交的commitId
请求接口,按文档传参
请求host: 你们项目的 gitlab 域名
PRIVATE-TOKEN: 可以去 gitlab 生成一个
projectId: 去 gitlab 查一下该项目对应的 id
since until: 就用第一步生成的起始时间
`/api/v4/projects/${projectId}/repository/commits?since=${since}&until=${until}&ref_name=master`
这样拿到的接口列表的第一个commit,即为当月最后一个commit
3. git checkout commitId
可以使用 child_process 的 exec 来执行
4. 统计该 commitId 对应的代码
const { stdout } = await exec(`~/work/scc/scc -f json ${项目路径}`);
const result = JSON.parse(stdout);
result 包括了各个文件类型的统计数据,例如:
[{
Name: 'JavaScript',
Bytes: 32364209,
CodeBytes: 0,
Lines: 858955, 代码行数
Code: 748857, 代码行数
Comment: 47206, 注释行数
Blank: 62892, 空格行数
Complexity: 74653,
Count: 4744, 文件数
WeightedComplexity: 0,
Files: []
}
......
]
5. 汇总得到最近一年代码变化趋势
用第一步拿到的时间数组,去循环统计即可
最后用 node 跑一下代码就好了
代码
源码放到GitHub,有些项目隐私相关的略去了,需要自己加一下~ 地址