January 1, 2024
By: kevin
逐项目git统计工具的设计和实现
初衷
通过分析git库的历史, 获得对项目的洞见, 比如说在特定的时间段内.
- 哪些是最频繁修改的文件/目录(模块)
- 系统中有哪些不该提交的大文件
- 某段时间内的用户提交/代码行树/文档行数
通过配置, 解决外部工具很难统计的一些情况:
- 清晰划分提交的归属(git库中用户alias不统一)
- 在统计中需要排除一些在git中, 但是不想统计的文件或者目录.
对系统中的所有项目, 提供函数圈复杂度分析(wip).
最后提供一份格式清晰的报告.
设计
获得所有的提交
获取git的全部log的输出, 包含在所有本地分支, 够获取到全部的log信息, 需要包含提交人,提交时间, 提交信息, 所有的diff信息, 改动的代码, 行数, 通过以下参数
`--no-merges` 来排除merge的提交
`--all` 来获取全部分支的提交
`--stat` 来获取diff的信息
`--date=iso` 来制定时间格式, iso格式便于解析
拿到的一个commit如下
commit fb03211a475c36fa82601113bf70f536333759e6
Author: lizy kevin@abc.com
Date: 2024-01-15 18:34:47 +0800
[wip] 修改20240115测试bug
env/dev/clj/simulator.clj | 3 +-
src/clj/core.clj | 2 +-
src/clj/socket.clj | 2 +-
src/cljs/app/socket_client.cljs | 23 ++++++++++----
src/cljs/pages/portal.cljs | 4 +--
src/cljs/pages/program.cljs | 535 ++++++++++++++++++++++++++-----------------------------
6 files changed, 251 insertions(+), 318 deletions(-)
所有的历史记录是以上字符串的不断累加多行文本
分析提交记录
- 使用正则表达式分割commit这个
多行文本, 得到一个字符串数组, 每个元素是一段commit信息 - 从每一段提交信息中得到一个map 2.1 commit number 2.2 作者信息 2.3 提交日期 3.4 代码修改 3.4.1 忽略空二进制文件 3.4.1 处理文件名重命名的情况 3.4.1 根据修改总行数和"+++--"计算具体行数
- 从以上的map中, 进行作者, 提交次数, 行数等等各个纬度的统计.
处理特殊情况
- git可以有空提交, 即不对应任何修改的提交, 需要进行过滤
- git文件并不都是文本文件, 二进制文件是没有行数的, 需要过滤掉
doc/design/uml-imgs/scada_db.png | Bin 0 -> 257679 bytes
doc/design/uml-imgs/sql-er.png | Bin 140946 -> 153568 bytes
- git中有重命名的情况, 需要特殊处理
" react/src/components/{chartA => chart}/style.js | 3 ++-"
- git中有window中提交的不含有特殊字符的路径
"test/\351\205\215\346\266\262\347\275\220\345\244\207\344\273\275 2.svg" | 196 ---------
格式化输出
doric.core 表格化输出
> (println (table [:a :b] [{:a 1 :b 2}]))
|---+---|
| A | B |
|---+---|
| 1 | 2 |
|---+---|
最终结果
** 项目中的大文件(前40个)
|----------------------------------------------------+------|
| File | Size |
|----------------------------------------------------+------|
| src/clj/peptide.clj | 2108 |
| src/cljc/program_util.cljc | 1484 |
| src/clj/peptide_utils.clj | 1290 |
| src/clj/ws.clj | 1039 |
| src/peptide.cljc | 987 |
| src/cljs/pages/program.cljs | 867 |
| src/cljs/app/socket_client.cljs | 824 |
| src/clj/params.cljc | 747 |
| src/cljs/pages/sync_control.cljs | 735 |
| bb/git.clj | 716 |
| src/cljs/pages/portal.cljs | 690 |
| src/cljs/pages/auto_run.cljs | 643 |
| src/cljs/pages/sequence.cljs | 628 |
| bb/electron/program/function_liquid.clj | 586 |
| src/clj/socket.clj | 569 |
| src/cljs/pages/log.cljs | 568 |
| resources/migrations/20231014074245-initdb.up.sql | 483 |
| src/cljs/app/main.cljs | 472 |
| src/cljs/pages/svg870.txt | 456 |
| bb/electron/program/function_test_not_loop.clj | 422 |
| bb/electron/utils.clj | 384 |
| elegantpaper.cls | 371 |
| src/clj/pdf.clj | 369 |
| bb/electron/program/function_operation_testing.clj | 326 |
| src/cljs/common/utils.cljs | 313 |
| src/params.cljc | 286 |
| bb/os.clj | 280 |
| src/cljs/pages/program_test.cljs | 278 |
| bb/electron/program/program_test.clj | 276 |
| src/clj/params.clj | 275 |
| src/cljs/resources/styles/app.css | 271 |
| bb/electron/qualication/motor.clj | 259 |
| env/dev/clj/simulator.clj | 256 |
| src/cljs/pages/qualification.cljs | 233 |
| src/cljs/common/db/db890.cljs | 231 |
| readme.tex | 206 |
| src/ws.clj | 202 |
| src/cljs/common/db/db850.cljs | 202 |
| src/cljs/effects/control.cljs | 189 |
| src/cljs/effects/params.cljs | 175 |
|----------------------------------------------------+------|
** 热点文件
*** 全项目热点
|-----------------------------------+--------------|
| File | Change Times |
|-----------------------------------+--------------|
| src/clj/peptide.cljc | 293 |
| src/cljs/pages/portal.cljs | 187 |
| src/clj/ws.clj | 174 |
| src/cljc/program_util.cljc | 142 |
| src/cljs/app/socket_client.cljs | 132 |
| src/cljs/pages/sync_control.cljs | 114 |
| src/cljs/pages/program.cljs | 114 |
| src/cljs/pages/log.cljs | 84 |
| src/clj/peptide_utils.clj | 67 |
| src/clj/socket.clj | 60 |
| src/cljs/common/utils.cljs | 58 |
| src/cljs/app/main.cljs | 54 |
| src/cljs/pages/qualification.cljs | 53 |
| package.json | 51 |
| src/clj/core.clj | 49 |
| src/cljs/electron/main.cljs | 43 |
| src/clj/params.clj | 41 |
| src/cljs/common/db/db890.cljs | 39 |
| src/cljs/pages/auto_run.cljs | 38 |
| src/cljs/effects/global.cljs | 38 |
|-----------------------------------+--------------|
*** 项目月度热点
|----------------------------------------------------+--------------|
| File | Change Times |
|----------------------------------------------------+--------------|
| src/clj/peptide_utils.clj | 34 |
| bb/electron/utils.clj | 24 |
| bb/os.clj | 22 |
| src/clj/core.clj | 20 |
| src/clj/socket.clj | 19 |
| bb/electron/program/function_operation_testing.clj | 19 |
| src/cljs/pages/portal.cljs | 18 |
| env/dev/clj/simulator.clj | 17 |
| bb/electron/test.clj | 16 |
| src/cljs/app/main.cljs | 15 |
| src/cljs/app/socket_client.cljs | 15 |
| src/clj/ws.clj | 13 |
| bb/git.clj | 13 |
| bb/electron/program/function_test_not_loop.clj | 12 |
| bb/electron/report.clj | 11 |
| src/clj/peptide.clj | 11 |
| bb.edn | 11 |
| src/cljs/pages/sync_control.cljs | 10 |
| bb/electron/program/function_test.clj | 9 |
| bb/electron/program/program_test.clj | 8 |
|----------------------------------------------------+--------------|
*** 项目本周热点
|----------------------------------------------------+--------------|
| File | Change Times |
|----------------------------------------------------+--------------|
| bb/git.clj | 12 |
| src/clj/socket.clj | 7 |
| src/cljs/app/main.cljs | 6 |
| src/clj/core.clj | 6 |
| env/dev/clj/simulator.clj | 4 |
| src/cljs/pages/sync_control.cljs | 4 |
| src/cljs/app/socket_client.cljs | 4 |
| bb/electron/program/function_test_not_loop.clj | 4 |
| src/clj/heart.clj | 3 |
| src/cljs/pages/log.cljs | 2 |
| bb/electron/test.clj | 2 |
| bb/electron/program/function_operation_testing.clj | 2 |
| src/cljs/pages/portal.cljs | 2 |
| src/clj/peptide_utils.clj | 2 |
| src/cljs/pages/program.cljs | 2 |
| bb.edn | 2 |
| src/clj/ws.clj | 1 |
| resources/sql/queries.sql | 1 |
| resources/migrations/20231014074245-initdb.up.sql | 1 |
| src/cljs/common/utils.cljs | 1 |
|----------------------------------------------------+--------------|
*** 项目今日热点
|---------------------------------+--------------|
| File | Change Times |
|---------------------------------+--------------|
| src/cljs/pages/program.cljs | 1 |
| src/cljs/pages/portal.cljs | 1 |
| src/cljs/app/socket_client.cljs | 1 |
| src/clj/socket.clj | 1 |
| src/clj/core.clj | 1 |
| env/dev/clj/simulator.clj | 1 |
|---------------------------------+--------------|
** 提交次数
*** 项目总提交次数
|-----------+--------------|
| Author | Commit Count |
|-----------+--------------|
| LiFachen | 27 |
| WuChengsi | 97 |
| LiQiannan | 104 |
| LiZhaoyu | 1155 |
|-----------+--------------|
*** 项目月度提交次数
|-----------+--------------|
| Author | Commit Count |
|-----------+--------------|
| LiFachen | 27 |
| LiQiannan | 49 |
| LiZhaoyu | 119 |
|-----------+--------------|
*** 项目本周提交次数
|-----------+--------------|
| Author | Commit Count |
|-----------+--------------|
| LiFachen | 4 |
| LiQiannan | 10 |
| LiZhaoyu | 24 |
|-----------+--------------|
*** 项目今日交次数
|-----------+--------------|
| Author | Commit Count |
|-----------+--------------|
| LiQiannan | 1 |
|-----------+--------------|
** 提交行数
*** 项目总提交行数
|-----------+-------+-----|
| Author | Code | Doc |
|-----------+-------+-----|
| LiFachen | 693 | 0 |
| WuChengsi | 3073 | 0 |
| LiQiannan | 5658 | 0 |
| LiZhaoyu | 17502 | 113 |
|-----------+-------+-----|
*** 项目月度提交行数
|-----------+------+-----|
| Author | Code | Doc |
|-----------+------+-----|
| LiFachen | 693 | 0 |
| LiQiannan | 1326 | 0 |
| LiZhaoyu | 2095 | 0 |
|-----------+------+-----|
*** 项目本周提交行数
|-----------+------+-----|
| Author | Code | Doc |
|-----------+------+-----|
| LiQiannan | 1 | 0 |
| LiFachen | 64 | 0 |
| LiZhaoyu | 674 | 0 |
|-----------+------+-----|
*** 项目今日交行数
|-----------+------+-----|
| Author | Code | Doc |
|-----------+------+-----|
| LiQiannan | 10 | 0 |
|-----------+------+-----|