web-dev-qa-db-fra.com

Comment obtenir une liste de tous les noms d'utilisateur des auteurs des commits Subversion?

Je recherche un moyen efficace d'obtenir la liste des auteurs de validation uniques pour un référentiel SVN dans son ensemble ou pour un chemin de ressource donné. Je n'ai pas été en mesure de trouver une commande SVN spécifiquement pour cela (et n'en attendez pas une), mais j'espère qu'il y aura peut-être un meilleur moyen que ce que j'ai déjà essayé dans Terminal (sous OS X):

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

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

L'une ou l'autre de ces méthodes me donnera un nom d'auteur par ligne, mais elles requièrent le filtrage d'une quantité non négligeable d'informations supplémentaires. De plus, ils ne gèrent pas les doublons du même nom d'auteur. Par conséquent, pour de nombreux commits écrits par quelques auteurs, il y a des tonnes de redondance qui circulent sur le réseau. Plus souvent qu'autrement, je veux juste voir les noms d'utilisateurs uniques. (Il est en fait pourrait être pratique pour déduire le compte de validation de chaque auteur à l'occasion, mais même dans ces cas, il serait préférable que les données agrégées soient envoyées à la place.)

Je travaille généralement avec un accès client uniquement. Les commandes svnadmin sont donc moins utiles, mais si nécessaire, je pourrais peut-être demander une faveur spéciale à l’administrateur du référentiel si cela était strictement nécessaire ou beaucoup plus efficace. Les référentiels avec lesquels je travaille ont des dizaines de milliers de commits et de nombreux utilisateurs actifs, et je ne veux déranger personne.

64
Quinn Taylor

Pour filtrer les doublons, examinez votre sortie et passez à travers: sort | uniq. Ainsi:

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

Je ne serais pas surpris si c'est le moyen de faire ce que vous demandez. Les outils Unix attendent souvent de l'utilisateur qu'il effectue un traitement et une analyse sophistiqués avec d'autres outils.

P.S. À bien y penser, vous pouvez fusionner les grep et awk...

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

P.P.S. Par Kevin Reid ...

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

P3.S. Par kan, en utilisant les barres verticales au lieu d'espaces comme séparateurs de champs, pour gérer correctement les noms avec espaces (également mis à jour les exemples Python) ...

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

Pour plus d'efficacité, vous pouvez faire un Perl one-liner. Je ne connais pas très bien Perl, alors je finirais par le faire 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)

Ou, si tu voulais compte:

#!/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])

Ensuite, vous courriez:

svn log --quiet | ./authorfilter.py
78
Mike DeSimone

Dans PowerShell, définissez votre emplacement sur la copie de travail et utilisez cette commande.

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

Le format de sortie de svn.exe log --quiet ressemble à ceci:

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)

Filtrez les règles horizontales avec ? { $_ -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)

Diviser par ' \| ' pour transformer un enregistrement en tableau.

$ '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)

Le deuxième élément est le nom.

Faites un tableau de chaque ligne et sélectionnez le deuxième élément avec % { ($_ -split ' \| ')[1] }.

tinkywinky
dispy
lala
po
tinkywinky

Renvoie des occurrences uniques avec Sort -Unique. Cela trie la sortie comme un effet secondaire.

dispy
lala
po
tinkywinky
41

Comme je devais le faire sous Windows, j'ai utilisé le port Windows de Super Sed ( http://www.pement.org/sed/ ) - et remplacé les commandes AWK & GREP:

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

Ceci utilise des fenêtres "triées" qui pourraient ne pas être présentes sur toutes les machines.

9
Adam Rofer
svn log  path-to-repo | grep '^r' | grep '|' | awk '{print $3}' | sort | uniq > committers.txt

Cette commande a le grep '|' supplémentaire qui élimine les fausses valeurs ..__ sinon, les validations aléatoires commençant par 'r' sont incluses et les mots des messages de validation sont renvoyés.

2
crankparty

Powershell prend en charge XML, ce qui élimine le besoin d'analyser la sortie de chaîne.

Voici un script rapide que j'ai utilisé sur un Mac pour obtenir une liste unique d'utilisateurs sur plusieurs référentiels.

#!/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
Jason C

Un référentiel distant que vous pouvez utiliser:

 svn log --quiet https://url/svn/project/ | grep "^r" | awk '{print $3}' | sort | uniq
0
lvthillo