who vscode example git blame cloc git-blame

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):

  1. Primero genere un archivo de culpa para cada archivo en el directorio (no es necesario explícito).
  2. Ejecute grep con algo como grep "^[^(]*([^)]*)" para capturar la lista de todos los usuarios y recuperar los únicos con sort y uniq .
  3. 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.
  4. Ejecutar cloc en la instantánea.
  5. 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