87 votes

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

Je suis à la recherche d'un moyen efficace pour obtenir la liste unique de commettre des auteurs pour un dépôt SVN dans son ensemble, ou pour une ressource donnée chemin. Je n'ai pas été en mesure de trouver une commande SVN spécialement pour cela (et n'en attends pas) mais j'espère que il peut y avoir une meilleure façon que j'ai essayé jusqu'à présent dans le Terminal (sous OS X):

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

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

L'un de ces va me donner un nom d'auteur par ligne, mais ils ont tous deux besoin de filtrage d'une bonne quantité d'informations supplémentaires. Ils ont également ne pas gérer les doublons du même nom de l'auteur, donc, pour beaucoup de validations par quelques auteurs, il y a des tonnes de redondance qui coule sur le fil. Plus souvent que pas, je veux juste voir l'unique auteur des noms d'utilisateurs. (En fait, il pourrait être utile d'en déduire la validation de comptage pour chaque auteur, à l'occasion, mais même dans ces cas, il serait mieux si les données agrégées ont été envoyés sur place.)

Je suis généralement avec des client-seulement l'accès, svnadmin des commandes sont moins utiles, mais si nécessaire, je pourrais peut-être demander une faveur spéciale du référentiel admin si strictement nécessaire ou beaucoup plus efficace. Les dépôts, je travaille avec des dizaines de milliers de livraisons et de nombreux d'utilisateurs actifs, et je ne veux pas déranger personne.

101voto

Mike DeSimone Points 20059

Pour filtrer les doublons, prenez votre sortie et le tuyau à travers: sort | uniq. Donc:

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

Je woud pas être surpris si c'est la façon de faire ce que vous demandez. Des outils Unix s'attendent souvent à l'utilisateur de faire de fantaisie de traitement et d'analyse avec d'autres outils.

P. S. Venez pour penser à elle, vous pouvez fusionner l' 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

Pour plus d'efficacité, vous pourriez faire un Perl one-liner. Je ne sais pas Perl que bien, alors je serais le vent jusqu'à 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()[2])
for author in sorted(authors):
    print author

Ou, si vous vouliez compte:

#!/usr/bin/env python
import sys
authors = {}
for line in sys.stdin:
    if line[0] != 'r':
        continue
    author = line.split()[2]
    if author not in authors:
        authors[author] = 0
    authors[author] += 1
for author in sorted(authors):
    print author, authors[author]

Vous devez alors exécuter:

svn log --quiet | ./authorfilter.py

53voto

Iain Elder Points 2672

Dans PowerShell, définissez l'emplacement de la copie de travail et d'utiliser cette commande.

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

Le format de sortie de l' 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)

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

Divisé en ' \| ' à son tour un enregistrement dans un 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.

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

tinkywinky
dispy
lala
po
tinkywinky

Retour événements uniques avec Sort -Unique. Il trie la sortie comme un effet secondaire.

dispy
lala
po
tinkywinky

10voto

Adam Rofer Points 71

Comme je devais le faire sous Windows, j’ai donc 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.

-2voto

user1822088 Points 1

Une alternative plus simple:

 find . -name "*cpp" -exec svn log -q {} \;|grep -v "\-\-"|cut -d "|" -f 2|sort|uniq -c|sort -n
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X