January 1, 2024
By: kevin

逐项目git统计工具的设计和实现

  1. 初衷
  2. 设计
  3. 最终结果

初衷

通过分析git库的历史, 获得对项目的洞见, 比如说在特定的时间段内.

  1. 哪些是最频繁修改的文件/目录(模块)
  2. 系统中有哪些不该提交的大文件
  3. 某段时间内的用户提交/代码行树/文档行数

通过配置, 解决外部工具很难统计的一些情况:

  1. 清晰划分提交的归属(git库中用户alias不统一)
  2. 在统计中需要排除一些在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(-)

所有的历史记录是以上字符串的不断累加多行文本

分析提交记录

  1. 使用正则表达式分割commit这个多行文本, 得到一个字符串数组, 每个元素是一段commit信息
  2. 从每一段提交信息中得到一个map 2.1 commit number 2.2 作者信息 2.3 提交日期 3.4 代码修改 3.4.1 忽略空二进制文件 3.4.1 处理文件名重命名的情况 3.4.1 根据修改总行数和"+++--"计算具体行数
  3. 从以上的map中, 进行作者, 提交次数, 行数等等各个纬度的统计.

处理特殊情况

  1. git可以有空提交, 即不对应任何修改的提交, 需要进行过滤
  2. git文件并不都是文本文件, 二进制文件是没有行数的, 需要过滤掉
 doc/design/uml-imgs/scada_db.png | Bin 0 -> 257679 bytes
 doc/design/uml-imgs/sql-er.png   | Bin 140946 -> 153568 bytes
  1. git中有重命名的情况, 需要特殊处理
" react/src/components/{chartA => chart}/style.js |   3 ++-"
  1. 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   |
|-----------+------+-----|
Tags: babashka