Enumerar los files que poseo en subversión

Entonces tengo un problema. Trabajo para una pequeña empresa emergente (aproximadamente 8 desarrolladores) y mi jefe recientemente decidió que tenemos que poner al propietario de cada file en la documentation. Así que he tratado de escribir algo usando svn culpa y file para recorrer todos los files php y ver qué files tienen mi nombre de usuario en más de 15 líneas, pero no he sido capaz de hacerlo bien.

Lo que realmente me gustaría es un proyecto de una sola línea (o simple bash) que enumerará todos los files en un repository de subversión y el nombre de usuario que editó la mayoría de las líneas por última vez. ¿Algunas ideas?

Bien, esto es lo que se me ocurrió:

#!/bin/bash set -e for file in `svn ls -R`; do if [ -f $file ]; then owner=`svn blame $file | tr -s " " " " | cut -d" " -f3 | sort | uniq -c | sort -nr | head -1 | tr -s " " " " | cut -d" " -f3` if [ $owner ]; then echo $file $owner fi fi done 

Utiliza svn ls para determinar cada file en el repository, luego para cada file, se examina la salida de svn blame :

  • tr -s " " " " exprime múltiples espacios en un espacio
  • cut -d" " -f3 obtiene el tercer campo delimitado por espacios, que es el nombre de usuario
  • sort clasifica la salida para que todas las líneas editadas por última vez por un usuario estén juntas
  • uniq -c obtiene todas las líneas y resultados únicos el recuento de cuántas veces apareció cada línea
  • sort -nr ordera numéricamente, en order inverso (para que el nombre de usuario que apareció más se ordere primero)
  • head -1 devuelve la primera línea
  • tr -s " " " " | cut -d" " -f3 tr -s " " " " | cut -d" " -f3 igual que antes, aprieta espacios y devuelve el tercer nombre de campo que es usuario.

Tardará un time en ejecutarse, pero al final tendrá una list de <filename> <most prevalent author> de <filename> <most prevalent author>

Advertencias:

  • La comprobación de errores no se realiza para asegurarse de que se llama al script desde una copy de trabajo de SVN
  • Si se llama desde más profundo que la raíz de un WC, solo se considerarán los files de ese nivel y más profundo
  • Como se mencionó en los comentarios, es posible que desee tener en count la date de revisión (si la mayoría de los loggings se realizaron hace 10 años, es posible que desee descontarlos para determinar el propietario)
  • Cualquier cambio de copy de trabajo que no esté registrado no se aplicará
 for f in $(find . -name .svn -prune -o -type f); do echo $f $(svn blame $f | awk '{ print $2 }' | sort | uniq -c | sort -nr | head -n 1 | cut -f 1) done