¿Cómo obtener una lista de todos los nombres de usuario de autor de commits de Subversion?


Estoy buscando una manera eficiente de obtener la lista de autores de commits únicos para un repositorio SVN como un todo, o para una ruta de recurso dada. No he sido capaz de encontrar un comando SVN específicamente para esto (y no esperes uno), pero espero que pueda haber una mejor manera que lo que he intentado hasta ahora en Terminal (en OS X):

svn log --quiet | grep "^r" | awk '{print $3}'

svn log --quiet --xml | grep author | sed -E "s:</?author>::g"

Cualquiera de estos me dará un nombre de autor por línea, pero ambos requieren filtrar una buena cantidad de información adicional. Tampoco manejan duplicados del mismo nombre de autor, por lo que para muchos commits de pocos autores, hay toneladas de redundancia fluyendo sobre el cable. La mayoría de las veces solo quiero ver los nombres de usuario únicos del autor. (En realidad podría ser útil inferir el recuento de confirmaciones para cada autor en ocasiones, pero incluso en estos casos sería mejor si los datos agregados se enviaran en su lugar.)

Generalmente trabajo con acceso solo para clientes, por lo que los comandos svnadmin son menos útiles, pero si es necesario, podría ser capaz de pedir un favor especial al administrador del repositorio si es estrictamente necesario o mucho más eficiente. Los repositorios con los que estoy trabajando tienen decenas de miles de commits y muchos usuarios activos, y no quiero molestar a nadie.

Author: Quinn Taylor, 2010-03-22

7 answers

Para filtrar duplicados, tome su salida y canalice a través de: sort | uniq. Así:

svn log --quiet | grep "^r" | awk '{print $3}' | sort | uniq

No me sorprendería si esta es la manera de hacer lo que pides. Las herramientas Unix a menudo esperan que el usuario realice un procesamiento y análisis de lujo con otras herramientas.

P.d. Ahora que lo pienso, puedes combinar grep y awk...

svn log --quiet | awk '/^r/ {print $3}' | sort | uniq
[10] P. P. S. Por Kevin Reid...
svn log --quiet | awk '/^r/ {print $3}' | sort -u

P3.S. Per kan, utilizando las barras verticales en lugar de espacios como separadores de campo, para manejar nombres con espacios (también se actualizaron los ejemplos de Python)...

svn log --quiet | awk -F ' \\\\|' '/^r/ {print $2}' | sort -u

Para ser más eficiente, podrías hacer un Perl one-liner. No conozco a Perl tan bien, así que terminaría haciéndolo en Python:

#!/usr/bin/env python
import sys
authors = set()
for line in sys.stdin:
    if line[0] == 'r':
        authors.add(line.split('|')[1].strip())
for author in sorted(authors):
    print(author)

O, si quieres cuenta:

#!/usr/bin/env python
from __future__ import print_function # Python 2.6/2.7
import sys
authors = {}
for line in sys.stdin:
    if line[0] != 'r':
        continue
    author = line.split('|')[1].strip()
    authors.setdefault(author, 0)
    authors[author] += 1
for author in sorted(authors):
    print(author, authors[author])

Entonces correrías:

svn log --quiet | ./authorfilter.py
 73
Author: Mike DeSimone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-25 03:32:58

En PowerShell, establezca su ubicación en la copia de trabajo y utilice este comando.

svn.exe log --quiet |
? { $_ -notlike '-*' } |
% { ($_ -split ' \| ')[1] } |
Sort -Unique

El formato de salida de svn.exe log --quiet se ve así:

r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)
------------------------------------------------------------------------
r20208 | dispy | 2013-12-04 16:33:53 +0000 (Wed, 04 Dec 2013)
------------------------------------------------------------------------
r20207 | lala | 2013-12-04 16:28:15 +0000 (Wed, 04 Dec 2013)
------------------------------------------------------------------------
r20206 | po | 2013-12-04 14:34:32 +0000 (Wed, 04 Dec 2013)
------------------------------------------------------------------------
r20205 | tinkywinky | 2013-12-04 14:07:54 +0000 (Wed, 04 Dec 2013)

Filtra las reglas horizontales con ? { $_ -notlike '-*' }.

r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)
r20208 | dispy | 2013-12-04 16:33:53 +0000 (Wed, 04 Dec 2013)
r20207 | lala | 2013-12-04 16:28:15 +0000 (Wed, 04 Dec 2013)
r20206 | po | 2013-12-04 14:34:32 +0000 (Wed, 04 Dec 2013)
r20205 | tinkywinky | 2013-12-04 14:07:54 +0000 (Wed, 04 Dec 2013)

Dividido por ' \| ' para convertir un registro en una matriz.

$ 'r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)' -split ' \| '
r20209
tinkywinky
2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)

El segundo elemento es el nombre.

Haga una matriz de cada línea y seleccione el segundo elemento con % { ($_ -split ' \| ')[1] }.

tinkywinky
dispy
lala
po
tinkywinky

Devuelve ocurrencias únicas con Sort -Unique. Esto ordena la salida como un efecto secundario.

dispy
lala
po
tinkywinky
 40
Author: Iain Samuel McLean Elder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-05 10:39:13

Tuve que hacer esto en Windows, así que usé el puerto de Windows de Super Sed ( http://www.pement.org/sed / ) - y reemplazó las órdenes AWK & GREP:

svn log --quiet --xml | sed -n -e "s/<\/\?author>//g" -e "/[<>]/!p" | sort | sed "$!N; /^\(.*\)\n\1$/!P; D" > USERS.txt

Esto usa windows "sort" que podría no estar presente en todas las máquinas.

 9
Author: Adam Rofer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-17 23:35:27
svn log  path-to-repo | grep '^r' | grep '|' | awk '{print $3}' | sort | uniq > committers.txt

Este comando tiene el adicional grep '|' que elimina los valores falsos. De lo contrario, se incluyen confirmaciones aleatorias que comienzan con 'r' y, por lo tanto, se devuelven las palabras de los mensajes de confirmación.

 2
Author: crankparty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-27 13:58:40

Powershell admite XML, lo que elimina la necesidad de analizar la salida de cadena.

Aquí hay un script rápido que utilicé en un mac para obtener una lista única de usuarios en varios repositorios.

#!/usr/bin/env pwsh

$repos = @(
    'Common/'
    'Database/'
    'Integration/'
    'Reporting/'
    'Tools/'
    'Web/'
    'Webservices/'
)

foreach ($repo in $repos) {
    $url = "https://svn.example.com:8443/svn/$repo"
    $users += ([Xml](svn log $url --xml)).log.logentry.author | Sort-Object -Unique
}

$users | Sort-Object -Unique
 0
Author: Jason C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-06 16:05:19

Uno un repositorio remoto que puede usar:

 svn log --quiet https://url/svn/project/ | grep "^r" | awk '{print $3}' | sort | uniq
 0
Author: lvthillo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-27 12:51:08

Una alternativa más simple:

find . -name "*cpp" -exec svn log -q {} \;|grep -v "\-\-"|cut -d "|" -f 2|sort|uniq -c|sort -n
 -2
Author: user1822088,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-06 18:00:52