2010-11-06 5 views
6

Dans un référentiel occupé, je peux prévoir des fichiers avec trop de logique centrale dans un endroit en cours d'édition en permanence.Statistiques du référentiel Mercurial, pour trouver des candidats pour le refactoring?

Existe-t-il un moyen de trouver de tels fichiers en demandant à Mercurial, soit par le biais d'extensions groupées, d'extensions tierces ou d'outils externes? Fondamentalement, je voudrais des statistiques qui montrent les fichiers qui sont édités le plus au fil du temps, de sorte que je peux utiliser pour trouver des candidats pour le fractionnement, comme refactoriser le code en plusieurs fichiers, pour éviter d'avoir une douleur de fusion constante des dossiers.

Je suis conscient de l'extension de churn, mais il semble se concentrer uniquement sur la façon dont chaque auteur fait pour le référentiel, et non sur ce que font les auteurs.

+0

Question intéressante! –

Répondre

4

Je ne pense pas que les extensions de résiliation, d'activité ou de graphique le fassent exactement, même si elles ne sont qu'un simple changement, je pense (elles se regroupent par utilisateur et non par fichier).

Vous pouvez utiliser une boucle comme:

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

Et au total par fichier.

+0

Il suffit de dire que votre réponse, et un peu de creuser dans la sortie et l'utilisation du client en ligne de commande m'a fait démarrer un projet C# pour créer un wrapper de la ligne de commande pour utilisation dans .NET. Un ensemble de statistiques va être l'un des résultats de cela. Ma bibliothèque de classe peut être trouvée ici: http://bitbucket.org/lassevk/mercurial.net - ** Merci pour l'inspiration! ** –

+0

La bibliothèque de classes a depuis longtemps été déplacée vers codéplex: http: //mercurialnet.codeplex. com/- Je viens d'éditer ceci puisque j'ai voté sur la question aujourd'hui, donc au moins cela a attiré l'attention. –

+0

Normalement, plus de code C# dans le monde me rendrait triste, mais si ça consolide la place de Mercurial par rapport à Git dans la communauté Csharpnetdot c'est tant mieux! –

1

Basé sur Ry4an J'ai créé le script Powershell suivant:

Il ne tient pas compte changesets qui contient le mot « fusion » dans la première ligne de description. Un fichier CSV est généré. J'ouvre ceci dans Excel et fais pivoter la table pour agréger les changements par dossier.

$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

Ceci est mon point de vue sur « me donner les 10 fichiers les plus modifiés dans la base de code du projet »:

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

Il faut un certain temps pour exécuter (sur un disque non SSD, de toute façon) mais ça fonctionne parfaitement. Pour ceux qui voudraient une visite, je récupère une liste de tous les fichiers source Java sous le répertoire actuel, récupère et compte les entrées du journal Hg pour ce fichier, affiche le nombre d'entrées du journal avec le nom du fichier, trier par nombre de changeset et filtrer tout sauf les 10 fichiers les plus modifiés.

L'approche pourrait facilement être modifiée pour inclure des fichiers d'un type différent, un système SCM différent, une plage de dates spécifique, etc. Bash et Hg à leur meilleur. ;)

Questions connexes