在一个繁忙的资料库中,我可以预见一些文件具有太多的中心逻辑,在一个不断编辑的地方。Mercurial存储库统计信息,用于查找重构的候选人?
有没有办法通过询问Mercurial,通过捆绑扩展,第三方扩展或任何外部工具来查找此类文件?
基本上我想要一些统计数据显示随时间变化最多的文件,这样我就可以使用它来查找拆分的候选项,例如将代码重构为多个文件,以避免持续合并文件。
我知道流失扩展,但它似乎只关注每个作者对存储库的作用程度,而不是作者对它的作用。
在一个繁忙的资料库中,我可以预见一些文件具有太多的中心逻辑,在一个不断编辑的地方。Mercurial存储库统计信息,用于查找重构的候选人?
有没有办法通过询问Mercurial,通过捆绑扩展,第三方扩展或任何外部工具来查找此类文件?
基本上我想要一些统计数据显示随时间变化最多的文件,这样我就可以使用它来查找拆分的候选项,例如将代码重构为多个文件,以避免持续合并文件。
我知道流失扩展,但它似乎只关注每个作者对存储库的作用程度,而不是作者对它的作用。
我不认为任何流失,活动或图表扩展都完全是这样,尽管它们都是从它的简单调整,我认为(它们按用户分组而不是按文件)。按文件
for therev in $(seq 1 $(hg id -n -r tip)) ; do
hg diff --change $therev --stats
done
然后总:
你可以使用像一个循环。
只需说出您的答案,并深入了解命令行客户端的输出和用法,就可以启动一个C#项目,以创建用于.NET的命令行包装。统计软件包将成为其中的一个成果。我的类库可以在这里找到:http://bitbucket.org/lassevk/mercurial.net - **感谢您的灵感!** – 2010-11-11 10:07:00
类库已经很久以来转移到codeplex:http://mercurialnet.codeplex。因为我今天就这个问题进行了投票,所以至少得到了一些关注。 – 2011-03-01 17:00:15
通常情况下,世界上更多的C#代码会让我难过,但是如果它巩固了Mercurial在Csharpnetdot社区的地位,那就更好了! – 2011-03-02 03:56:19
基于Ry4an我创建了以下PowerShell脚本:
它忽略了一个包含描述第一行字“合并”的变更。 生成一个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个最修改的文件”:
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和汞在他们最好的。 ;)
有趣的问题! – 2010-11-06 21:50:18