如何写个脚本统计项目的代码行数

750 阅读2分钟

一天,领导让你统计一下最近一年,项目代码行数变化趋势。这该如何下手?

总体思路

  1. 计算出最近一年每个月的最后一天的时间
  2. 拿到每个月最后一次提交的commitId
  3. git checkout commitId
  4. 统计该 commitId 对应的代码
  5. 汇总得到最近一年代码变化趋势

第二步可以通过 gitlab 提供的 api 取得
第四步可以借助 scc 这个工具

gitlab api

此处用到的 api 为获取 commits 列表的 api :
GET /projects/:id/repository/commits
👉🏻文档传送门
此处需要传递的参数为:开始时间 since、结束时间 until、分支名称 ref_name(此处传主分支名 master 即可)

scc是啥

GitHub地址
scc可以用来统计项目各个类型文件的代码行数、文件数、注释行数、空格行数等。很🐂🍺的工具。需要将代码下载(下载地址)到本地,然后执行其代码即可。

开工

1. 计算出最近一年每个月的最后一天的时间

写个方法得到形如图所示的时间,之所以开始时间设为当月最后一天时间的前十天,是避免当月最后有好几天没提交过代码 image.png

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,有些项目隐私相关的略去了,需要自己加一下~ 地址