Mercurial repository statistics,用于寻找重构候选对象?

Mercurial repository statistics,用于寻找重构候选对象?,mercurial,sustainable-pace,Mercurial,Sustainable Pace,在一个繁忙的存储库中,我可以预见一些文件在一个地方有太多的中心逻辑在不断地被编辑 有没有办法通过询问Mercurial(通过捆绑扩展、第三方扩展或任何外部工具)来查找此类文件 基本上,我想要一些统计数据来显示随着时间的推移被编辑最多的文件,这样我就可以使用这些数据来找到用于拆分的候选文件,比如将代码重构为多个文件,以避免对单个文件进行不断的合并 我知道搅动扩展,但它似乎只关注每个作者对存储库做了多少,而不是作者对存储库做了什么。我不认为任何搅动、活动或图表扩展都能做到这一点,尽管我认为它们只是一

在一个繁忙的存储库中,我可以预见一些文件在一个地方有太多的中心逻辑在不断地被编辑

有没有办法通过询问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