2010-11-06 34 views
6

在一个繁忙的资料库中,我可以预见一些文件具有太多的中心逻辑,在一个不断编辑的地方。Mercurial存储库统计信息,用于查找重构的候选人?

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

基本上我想要一些统计数据显示随时间变化最多的文件,这样我就可以使用它来查找拆分的候选项,例如将代码重构为多个文件,以避免持续合并文件。

我知道流失扩展,但它似乎只关注每个作者对存储库的作用程度,而不是作者对它的作用。

+0

有趣的问题! – 2010-11-06 21:50:18

回答

4

我不认为任何流失,活动或图表扩展都完全是这样,尽管它们都是从它的简单调整,我认为(它们按用户分组而不是按文件)。按文件

for therev in $(seq 1 $(hg id -n -r tip)) ; do 
    hg diff --change $therev --stats 
done 

然后总:

你可以使用像一个循环。

+0

只需说出您的答案,并深入了解命令行客户端的输出和用法,就可以启动一个C#项目,以创建用于.NET的命令行包装。统计软件包将成为其中的一个成果。我的类库可以在这里找到:http://bitbucket.org/lassevk/mercurial.net - **感谢您的灵感!** – 2010-11-11 10:07:00

+0

类库已经很久以来转移到codeplex:http://mercurialnet.codeplex。因为我今天就这个问题进行了投票,所以至少得到了一些关注。 – 2011-03-01 17:00:15

+0

通常情况下,世界上更多的C#代码会让我难过,但是如果它巩固了Mercurial在Csharpnetdot社区的地位,那就更好了! – 2011-03-02 03:56:19

1

基于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 
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和汞在他们最好的。 ;)