在一个繁忙的存储库中,我可以预见一些文件在一个地方经常被编辑过多的中央逻辑。
有没有办法通过捆绑扩展,第三方扩展或任何外部工具询问Mercurial来查找此类文件?
基本上我想要一些统计数据显示编辑次数最多的文件,这样我就可以用它来查找拆分的候选者,比如将代码重构为多个文件,以避免单个文件经常出现合并问题
我知道流失扩展,但它似乎只关注每个作者对存储库做了多少,而不是作者做了什么。
答案 0 :(得分:4)
我认为任何流失,活动或图表扩展都没有做到这一点,尽管我们认为它们都是一个简单的调整(它们按用户分组而不是按文件分组)。
您可以使用如下的循环:
for therev in $(seq 1 $(hg id -n -r tip)) ; do
hg diff --change $therev --stats
done
然后按文件计算。
答案 1 :(得分:1)
基于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
答案 2 :(得分:0)
这是我的承诺"在项目的代码库中为我提供10个修改最多的文件":
for f in `find . -name '*.java'`; do c=`hg log $f | grep changeset | wc -l`; echo "$c $f" ; done | sort -n | tail -n 10
运行需要一段时间(无论如何在非SSD磁盘上),但它运行良好。
对于那些想要演练的人,我检索当前目录下所有Java源文件的列表,检索并计算该文件的Hg日志条目,输出日志条目的数量以及文件名,排序通过变更集计数并过滤掉除了10个修改过的文件之外的所有内容。
可以轻松修改该方法,以包含不同类型的文件,不同的SCM系统,特定的日期范围等.Bash和Hg最好。 ;)