代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

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

  •  6
  • Lasse V. Karlsen  · 技术社区  · 14 年前

    有没有任何方法可以通过询问Mercurial来找到这些文件,或者通过捆绑的扩展、第三方扩展,或者任何外部工具?

    基本上,我想要一些统计数据,显示随着时间的推移被编辑得最多的文件,这样我就可以用它来找到要拆分的候选文件,比如将代码重构成多个文件,以避免单个文件持续的合并痛苦。

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   Ry4an Brase    14 年前

    我不认为任何搅动、活动或图表扩展都能做到这一点,尽管我认为它们都是一个简单的调整(它们是按用户而不是按文件分组的)。

    可以使用如下循环:

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

    然后按文件汇总。

        2
  •  1
  •   Sentient    13 年前

    它忽略在第一个描述行中包含单词“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 
    
        3
  •  0
  •   Tomislav Nakic-Alfirevic    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个最修改的文件之外的所有内容。

    推荐文章