Mercurial存储库统计信息,用于查找重构的候选者?

时间:2010-11-06 19:36:16

标签: mercurial sustainable-pace

在一个繁忙的存储库中,我可以预见一些文件在一个地方经常被编辑过多的中央逻辑。

有没有办法通过捆绑扩展,第三方扩展或任何外部工具询问Mercurial来查找此类文件?

基本上我想要一些统计数据显示编辑次数最多的文件,这样我就可以用它来查找拆分的候选者,比如将代码重构为多个文件,以避免单个文件经常出现合并问题

我知道流失扩展,但它似乎只关注每个作者对存储库做了多少,而不是作者做了什么。

3 个答案:

答案 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最好。 ;)