20

cloc使人们能够计算每种语言每种类型(空白、注释或代码)存储在目录中的代码行数。

git blame使人们能够看到文件的哪一部分属于谁。

我正在寻找一种将两者结合起来的方法,以便获得一个(三维)矩阵,该矩阵列出每个用户每种语言每种类型的代码行。

是否有优雅的内置方法可以做到这一点,或者应该“废弃”每个用户的“责备”部分(通过运行grepafter git blame)并cloc在它们上运行以计算每个用户的表?


编辑

天真的方法(基于@Jubobs 的评论):

  1. 首先为目录中的每个文件生成一个责备文件(不必显式)。
  2. 运行 grepgrep "^[^(]*([^)]*)"以捕获所有用户的列表并使用 和 检索唯一sortuniq
  3. 对于每个用户:生成文件夹的卷影副本并使用 grep 进行 grep,grep "^[^(]*($user)"以便仅保留该用户的行。
  4. 在卷影副本上运行 cloc。
  5. 为每个用户执行此操作,存储结果并将它们一起输出。

这或多或少是如何生成所需的输出。但是正如人们所看到的,这种方法会进行大量复制(或至少存储在内存中),并且实际上可以通过运行文件一次而不是多次来计算每个用户的行数。


期望的输出

就像是:

+--------+--------------------------------+--------------------------------+
|User    | C#                             | XML                            |
+--------+-------+-------+---------+------+-------+-------+---------+------+
|        | files | blank | comment | code | files | blank | comment | code |
+--------+-------+-------+---------+------+-------+-------+---------+------+
| Foo    |    12 |    75 |     148 | 2711 |     2 |    42 |       0 |    0 |
| Bar    |   167 |  1795 |    1425 |    2 |    16 |     0 |     512 | 1678 | 
+--------+-------+-------+---------+------+-------+-------+---------+------+
| Total  |   179 |  1870 |    1573 | 2713 |    18 |    42 |     512 | 1678 |
+--------+-------+-------+---------+------+-------+-------+---------+------+
4

1 回答 1

3

这是一个较老的问题,但它激发了我的兴趣,所以我开始尝试解决它。这不会产生一个很好的报告,但它确实将数据放入 csv 中,其中 3 列是:file extension, email of committer, # lines this user has committed for this file type。这也不会像 cloc 那样给出空白、注释、代码行。如果我有时间,我会尝试让所有这些都很好地工作,但认为这可能是一个“足够好”的解决方案,或者至少让你朝着正确的方向开始。

#!/bin/bash

LIST_OF_GIT_FILES=/tmp/gitfiles.txt
GIT_BLAME_COMBINED_RESULTS=/tmp/git-blame.txt
OUTPUT=/tmp/git-blame-output.txt
SUMMARY=code-summary.csv

rm $GIT_BLAME_COMBINED_RESULTS
git ls-files > $LIST_OF_GIT_FILES
while read p; do
  git blame -e -f $p >> $GIT_BLAME_COMBINED_RESULTS
done < $LIST_OF_GIT_FILES
awk -F ' ' '{print $2 "," $3}' $GIT_BLAME_COMBINED_RESULTS | tr -d '(<>' | awk -F ',' '{n = split($1, a, "."); print a[n] "," $2}' > $OUTPUT
sort $OUTPUT | uniq -c | sort -n | awk -F ' ' '{print $2 "," $1}' | sort > $SUMMARY

rm $GIT_BLAME_COMBINED_RESULTS
rm $LIST_OF_GIT_FILES
rm $OUTPUT
于 2016-06-09T12:46:21.353 回答