2010-11-06 13 views
6

En un repositorio ocupado, puedo prever que algunos archivos con demasiada lógica central en un solo lugar se editen constantemente.Estadísticas del repositorio de Mercurial, para encontrar candidatos para refactorización?

¿Hay alguna forma de encontrar dichos archivos preguntando a Mercurial, ya sea a través de extensiones integradas, extensiones de terceros o cualquier herramienta externa?

Básicamente me gustaría obtener estadísticas que muestren los archivos que más se editan con el tiempo, para que pueda usarlos para buscar candidatos para dividir, como refactorizar el código en varios archivos, para evitar tener dolores de fusión constantes para solo archivos.

Estoy al tanto de la extensión de abandono, pero parece que solo se centra en cuánto hace cada autor al repositorio, no a qué lo hacen los autores.

+0

¡Pregunta interesante! –

Respuesta

4

No creo que ninguna de las extensiones de churn, actividad o gráfico haga exactamente eso, aunque creo que son un simple ajuste, agrupan por usuario, no por archivo.

Se puede usar un bucle como:

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

Y luego total de archivos.

+0

Basta con decir que su respuesta y un poco de exploración del resultado y el uso del cliente de línea de comandos me hizo iniciar un proyecto de C# para crear un contenedor de la línea de comandos para su uso en .NET. Un paquete de estadísticas será uno de los resultados de esto. La biblioteca de mi clase se puede encontrar aquí: http://bitbucket.org/lassevk/mercurial.net - ** ¡Gracias por la inspiración! ** –

+0

La biblioteca de clases se ha mudado hace mucho tiempo a codeplex: http: //mercurialnet.codeplex. com/- solo estoy editando esto desde que obtuve una votación sobre la pregunta hoy, por lo que al menos obtuvo algo de atención. –

+0

Normalmente, más códigos de C# en el mundo me entristecerían, pero si está consolidando tanto el lugar de Mercurial como el de Git en la comunidad de Csharpnetdot, ¡mucho mejor! –

1

Basado en Ry4an creé el siguiente script de PowerShell:

Ignora conjuntos de cambios que contiene la palabra 'fusión' en la primera línea de descripción. Se genera un archivo CSV. Lo abro en excel y giro la tabla para agregar los cambios por archivo.

$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

Esta es mi opinión sobre "dame los 10 archivos más modificadas en código base del proyecto":

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

Se toma un tiempo para funcionar (en un disco que no sea SSD, de todos modos) , pero funciona perfectamente

Para aquellos que quieran un recorrido, recupero una lista de todos los archivos fuente Java bajo el directorio actual, recupero y contemplo las entradas de registro Hg para ese archivo, obtengo el número de entradas de registro junto con el nombre del archivo, ordenar por count de changeset y filtrar todo excepto los 10 archivos más modificados.

El enfoque podría modificarse fácilmente para incluir archivos de un tipo diferente, un sistema SCM diferente, un intervalo de fechas específico, etc. Bash y Hg en su máxima expresión. ;)

Cuestiones relacionadas