vscode - Combina `cloc` con` git blame`
git-bisect (1)
cloc
permite contar el número de líneas de código almacenadas en un directorio por idioma por tipo (en blanco, comentario o código).
git blame
permite a uno ver qué parte de un archivo pertenece a quién.
Estoy buscando una manera de combinar ambos para que uno obtenga una matriz (tridimensional) que enumera las líneas de código por tipo por idioma por usuario.
¿Hay formas elegantes e integradas de hacer esto o debería uno "desechar" las partes de "culpa" (ejecutando grep
después de git blame
) de cada usuario y ejecutar cloc
en ellas para calcular la tabla para cada usuario?
EDITAR :
Enfoque ingenuo (basado en el comentario de @Jubobs):
- Primero genere un archivo de culpa para cada archivo en el directorio (no es necesario explícito).
- Ejecute grep con algo como
grep "^[^(]*([^)]*)"
para capturar la lista de todos los usuarios y recuperar los únicos consort
yuniq
. - Para cada usuario: genere una instantánea de la carpeta y grep con
grep "^[^(]*($user)"
modo que solo queden las líneas de ese usuario. - Ejecutar cloc en la instantánea.
- Haga esto para cada usuario, almacene los resultados y publíquelos juntos.
Esto es más o menos cómo generar la salida deseada. Pero como se puede ver, este enfoque hace muchas copias (o al menos se almacena en la memoria) y uno puede realmente calcular las líneas por usuario ejecutando sobre el archivo una vez en lugar de varias veces.
Salida deseada :
algo como:
+--------+--------------------------------+--------------------------------+
|User | C# | XML |
+--------+-------+-------+---------+------+-------+-------+---------+------+
| | files | blank | comment | code | files | blank | comment | code |
+--------+-------+-------+---------+------+-------+-------+---------+------+
| Foo | 12 | 75 | 148 | 2711 | 2 | 42 | 0 | 0 |
| Bar | 167 | 1795 | 1425 | 2 | 16 | 0 | 512 | 1678 |
+--------+-------+-------+---------+------+-------+-------+---------+------+
| Total | 179 | 1870 | 1573 | 2713 | 18 | 42 | 512 | 1678 |
+--------+-------+-------+---------+------+-------+-------+---------+------+
Esta es una pregunta antigua, pero mi interés fue mayor, así que empecé a jugar intentando resolverlo. Esto no escupe un buen informe, pero coloca datos en un csv con las 3 columnas: file extension
, email of committer
, # lines this user has committed for this file type
. Esto tampoco da el espacio en blanco, comentario, líneas de código como cloc tampoco. Si tengo tiempo, intentaré hacer que todo funcione bien, pero pensé que podría ser una solución ''lo suficientemente buena'' o, al menos, que empiece en la dirección correcta.
#!/bin/bash
LIST_OF_GIT_FILES=/tmp/gitfiles.txt
GIT_BLAME_COMBINED_RESULTS=/tmp/git-blame.txt
OUTPUT=/tmp/git-blame-output.txt
SUMMARY=code-summary.csv
rm $GIT_BLAME_COMBINED_RESULTS
git ls-files > $LIST_OF_GIT_FILES
while read p; do
git blame -e -f $p >> $GIT_BLAME_COMBINED_RESULTS
done < $LIST_OF_GIT_FILES
awk -F '' '' ''{print $2 "," $3}'' $GIT_BLAME_COMBINED_RESULTS | tr -d ''(<>'' | awk -F '','' ''{n = split($1, a, "."); print a[n] "," $2}'' > $OUTPUT
sort $OUTPUT | uniq -c | sort -n | awk -F '' '' ''{print $2 "," $1}'' | sort > $SUMMARY
rm $GIT_BLAME_COMBINED_RESULTS
rm $LIST_OF_GIT_FILES
rm $OUTPUT