将`cloc`与`git blame`结合起来

时间:2014-08-25 11:19:00

标签: git blame cloc git-blame

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

git blame可以让人看到文件的哪个部分属于谁。

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

是否有优雅的内置方法可以执行此操作,还是应该“废弃”每个用户grep之后的“{0}}”的“责备”部分并在其上运行git blame计算每个用户的表格?


修改

天真的方法(根据@Jubobs的评论):

  1. 首先为目录中的每个文件生成一个blame文件(不一定要显式)。
  2. 使用cloc之类的内容运行grep以捕获所有用户的列表,并使用grep "^[^(]*([^)]*)"sort检索唯一身份用户。
  3. 对于每个用户:生成文件夹的影子副本,并使用uniq生成grep,以便只保留该用户的行。
  4. 在卷影副本上运行cloc。
  5. 为每个用户执行此操作,存储结果并将它们一起输出。
  6. 这或多或少是如何生成所需的输出。但是正如人们所看到的,这种方法进行了大量的复制(或者至少存储在内存中),并且实际上可以通过在文件上运行一次而不是多次来计算每个用户的行数。


    期望的输出

    类似的东西:

    grep "^[^(]*($user)"

1 个答案:

答案 0 :(得分:3)

这是一个较老的问题,但它引起了我的兴趣,所以我开始尝试解决它。这不是一个很好的报告,但它确实将数据放在一个csv中,其中包含3列:file extensionemail 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