Mercurial repository statistics,用于寻找重构候选对象?
在一个繁忙的存储库中,我可以预见一些文件在一个地方有太多的中心逻辑在不断地被编辑 有没有办法通过询问Mercurial(通过捆绑扩展、第三方扩展或任何外部工具)来查找此类文件 基本上,我想要一些统计数据来显示随着时间的推移被编辑最多的文件,这样我就可以使用这些数据来找到用于拆分的候选文件,比如将代码重构为多个文件,以避免对单个文件进行不断的合并Mercurial repository statistics,用于寻找重构候选对象?,mercurial,sustainable-pace,Mercurial,Sustainable Pace,在一个繁忙的存储库中,我可以预见一些文件在一个地方有太多的中心逻辑在不断地被编辑 有没有办法通过询问Mercurial(通过捆绑扩展、第三方扩展或任何外部工具)来查找此类文件 基本上,我想要一些统计数据来显示随着时间的推移被编辑最多的文件,这样我就可以使用这些数据来找到用于拆分的候选文件,比如将代码重构为多个文件,以避免对单个文件进行不断的合并 我知道搅动扩展,但它似乎只关注每个作者对存储库做了多少,而不是作者对存储库做了什么。我不认为任何搅动、活动或图表扩展都能做到这一点,尽管我认为它们只是一
我知道搅动扩展,但它似乎只关注每个作者对存储库做了多少,而不是作者对存储库做了什么。我不认为任何搅动、活动或图表扩展都能做到这一点,尽管我认为它们只是一个简单的调整(它们按用户分组,而不是按文件分组) 您可以使用如下循环:
for therev in $(seq 1 $(hg id -n -r tip)) ; do
hg diff --change $therev --stats
done
然后按文件总计。基于Ry4an,我创建了以下powershell脚本: 它忽略在第一个描述行中包含单词“merge”的变更集。 将生成一个CSV文件。我在excel中打开它,并透视表以聚合每个文件的更改
$revisions = @{};
function GetFileChanges([int] $revision){
try{
$logDescription = hg log -r $revision --template '{desc|firstline}'
if ($logDescription.ToLower().Contains("merge")){
write-output "Skipping merges " $logDescription
} else {
$fileChanges = hg diff --change $revision --stat
$fileModifications = @{};
foreach($fileChange in $fileChanges){
if ($fileChange){ #when you have a branch operation, no files are changed.
$fileLineDetail = $fileChange.split('|');
$changes = select-string -InputObject $fileLineDetail[1] -pattern '(\d+)' | % { $_.Matches } | % { $_.Value }
if ($changes){
$fileModifications.Add($fileLineDetail[0].trim(), [int] $changes);
}
}
}
$revisions.Add($revision, $fileModifications);
}
}
catch [exception]
{
"caught an exception"
write-error $revision
}
}
$previous = hg identify -r build-3.4.139.0 -n
$now = hg identify -r tip -n
for($i = [int] $previous; $i -le [int] $now; $i++){
GetFileChanges($i);
}
# hg diff -r 3610:tip --stat
$exportTable = @();
foreach($key in $revisions.Keys){
$revision2= $revisions[$key];
foreach($file in $revision2.Keys){
$tempreport = New-Object PSObject
$tempreport | Add-Member -type NoteProperty -Name Revision -Value $key
$tempreport | Add-Member -type NoteProperty -Name File -Value $file
$tempreport | Add-Member -type NoteProperty -Name Changes -Value $revisions[$key][$file]
$exportTable += $tempreport;
}
}
$exportTable | export-csv "stats.csv" -noType
这是我对“给我项目代码库中修改最多的10个文件”的看法:
它需要一段时间才能运行(无论如何,在非SSD磁盘上),但它工作得非常好
对于那些想要浏览的人,我检索当前目录下所有Java源文件的列表,检索并计算该文件的Hg日志条目,输出日志条目数和文件名,按变更集计数排序,并过滤掉除10个修改最多的文件之外的所有文件
该方法可以很容易地修改,以包括不同类型的文件、不同的SCM系统、特定的日期范围等。Bash和Hg处于最佳状态 我只想说,您的回答,以及对命令行客户机的输出和使用的一些深入研究,使我启动了一个C#项目,用于创建命令行的包装器,以便在.NET中使用。统计数据包将是这项工作的成果之一。我的类库可以在这里找到:-谢谢你的灵感!类库早就转移到codeplex了:-自从我今天就这个问题进行投票后,我就编辑了这个,所以至少它引起了一些注意。通常世界上更多的C代码会让我感到悲伤,但如果它能巩固Mercurial在Csharpnetdot社区中相对于git的地位,那就更好了!
for f in `find . -name '*.java'`; do c=`hg log $f | grep changeset | wc -l`; echo "$c $f" ; done | sort -n | tail -n 10