2010-11-06 4 views
6

In einem ausgelasteten Repository kann ich vorhersehen, dass einige Dateien mit zu viel zentraler Logik an einer Stelle ständig bearbeitet werden.Mercurial Repository Statistiken, um Kandidaten für Refactoring zu finden?

Gibt es eine Möglichkeit, solche Dateien zu finden, indem Sie Mercurial entweder über gebündelte Erweiterungen, Drittanbieter-Erweiterungen oder externe Tools anfragen?

Grundsätzlich möchte ich einige Statistiken, die Dateien zeigt, die am meisten im Laufe der Zeit bearbeitet werden, so dass ich diese zum Aufspalten Kandidaten, wie Refactoring des Codes in mehrere Dateien verwenden kann, um konstante Verschmelzung Schmerzen für Single zu vermeiden Dateien.

Ich bin mir der Churn-Erweiterung bewusst, aber es scheint sich nur darauf zu konzentrieren, wie viel jeder Autor zum Repository tut, nicht, was die Autoren tun.

+0

Interessante Frage! –

Antwort

4

Ich glaube nicht, dass die Churn-, Aktivitäts- oder Diagrammerweiterungen genau das tun, obwohl sie alle ein einfacher Tweak sind, denke ich (sie gruppieren sich nach Benutzer und nicht nach Datei).

könnten Sie eine Schleife wie verwenden:

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

Und dann insgesamt durch Datei.

+0

Es reicht aus zu sagen, dass Ihre Antwort und ein wenig in die Ausgabe und Verwendung des Befehlszeilenclients gegraben haben, dass ich ein C# -Projekt zum Erstellen eines Wrappers der Befehlszeile für die Verwendung in .NET gestartet habe. Ein Statistikpaket wird eines der Ergebnisse sein. Meine Klassenbibliothek kann hier gefunden werden: http://bitbucket.org/lassevk/mercurial.net - ** Danke für die Inspiration! ** –

+0

Die Klassenbibliothek ist seit langem in Codeplex verschoben: http: //mercurialnet.codeplex. com/- Ich bearbeite das nur, da ich heute über die Frage abstimmen konnte, also hat es zumindest einige Aufmerksamkeit erregt. –

+0

Normalerweise würde mich mehr C# -Code in der Welt traurig machen, aber wenn es Mercurials Platz über Git in der Csharpnetdot-Community festigt, umso besser! –

1

Basierend auf Ry4an habe ich den folgenden Powershell-Skript:

Es ignoriert Changeset, die das Wort ‚merge‘ in der ersten Textzeile enthält. Eine CSV-Datei wird generiert. Ich öffne das in Excel und schwenke die Tabelle, um die Änderungen pro Datei zu aggregieren.

$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

Dies ist mein nehmen auf: „Gib mir die 10 geändertenen Dateien in dem Code-Basis des Projektes“:

for f in `find . -name '*.java'`; do c=`hg log $f | grep changeset | wc -l`; echo "$c $f" ; done | sort -n | tail -n 10 

Es hat eine Weile laufen dauert (auf einem nicht-SSD-Disk, sowieso) , aber es funktioniert perfekt.

Für diejenigen, die einen Spaziergang möchten, ich eine Liste aller Java-Quelldateien unter dem aktuellen Verzeichnis abrufen, Hg Protokolleinträge für diese Datei abrufen und zählen, die Anzahl der Protokolleinträge zusammen mit dem Dateinamen ausgeben, Nach Änderungsmenge sortieren und alles außer den 10 am meisten geänderten Dateien herausfiltern.

Der Ansatz könnte leicht geändert werden, um Dateien eines anderen Typs, ein anderes SCM-System, einen bestimmten Datumsbereich usw. zu enthalten. Bash und Hg vom Feinsten. ;)

Verwandte Themen