Como exibir confirmações de um usuário específico no svn log?

161

Como exibir confirmações de um usuário específico no svn? Não encontrei nenhuma opção para isso para o svn log.

mimrock
fonte
10
Use a --searchopção com o Subversion 1.8 ou cliente mais recente.
bahrep

Respostas:

258

Você poderia usar isto:

svn log | sed -n '/USERNAME/,/-----$/ p' 

Ele mostrará todas as confirmações feitas pelo usuário especificado (USERNAME).

ATUALIZAR

Como sugerido por @bahrep, o subversion 1.8 vem com uma --searchopção.

yvoyer
fonte
6
Esta solução é perfeita. Gostaria de entender o que está fazendo, mas não consegui encontrar nada na documentação sed que o explique. Alguém tem alguma informação sobre por que isso funciona?
precisa
1
+1 Funciona para mim também. Como o vi, no Unix / Linux, distros sed é talvez mais onipresente que Python - e, portanto, não é necessário se preocupar com a instalação.
Therobyouknow 20/07
10
O @MattHulse funciona porque usa sed para corresponder a tudo entre duas expressões regulares especificadas (o nome de usuário e os traços) e, em seguida, diz para imprimir (the p).
Gijs
5
@therobyouknow Não, você não precisa executar svn logem uma cópia de trabalho. Você também pode especificar seu repositório, ie svn log https://your-svn-repo.
precisa saber é o seguinte
4
Não há mais necessidade de fazer isso. Use o Subversion 1.8 ou cliente mais recente que ofereça suporte à --searchopção.
bahrep
101

Com o Subversion 1.8 ou posterior:

svn log --search johnsmith77 -l 50

Além das correspondências dos autores, isso também exibirá confirmações SVN que contêm esse nome de usuário na mensagem de confirmação, o que não deve acontecer se seu nome de usuário não for uma palavra comum.

O -l 50vai limitar a pesquisa às últimas 50 entradas.

--search ARG

Filtra as mensagens de log para mostrar apenas aquelas que correspondem ao padrão de pesquisa ARG.

As mensagens de log são exibidas apenas se o padrão de pesquisa fornecido corresponder a qualquer autor, data, texto da mensagem de log (a menos que --quietseja usado) ou, se a --verboseopção também for fornecida, um caminho alterado.

Se várias --searchopções forem fornecidas, uma mensagem de log será mostrada se corresponder a algum dos padrões de pesquisa fornecidos.

Se --limitfor usado, ele restringe o número de mensagens de log pesquisadas, em vez de restringir a saída a um número específico de mensagens de log correspondentes.

http://svnbook.red-bean.com/en/1.8/svn.ref.svn.html#svn.ref.svn.sw.search

Michael Butler
fonte
1
@Izkata adicionado no SVN 1.8: svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html
bahrep
se você deseja pesquisar mais de um autor svn log --search foo --search bar -l 30,. If multiple --search options are provided, a log message is shown if it matches any of the provided search patterns.
Zhuguowei 17/03/16
Esta solução poderia ser usado com o argumento --diff também (para mostrar código alterado)
Joro
Alguma maneira de filtrar aparências em mensagens de confirmação, se o nome de usuário for uma palavra comum (parte de)?
Tor Klingberg
17

O svn não vem com opções embutidas para isso. Ele tem uma svn log --xmlopção, para permitir que você analise a saída por conta própria e obtenha as partes interessantes.

Você pode escrever um script para analisá-lo, por exemplo, no Python 2.6:

import sys
from xml.etree.ElementTree import iterparse, dump

author = sys.argv[1]
iparse = iterparse(sys.stdin, ['start', 'end'])

for event, elem in iparse:
    if event == 'start' and elem.tag == 'log':
        logNode = elem
        break

logentries = (elem for event, elem in iparse
                   if event == 'end' and elem.tag == 'logentry')

for logentry in logentries:
    if logentry.find('author').text == author:
        dump(logentry)
    logNode.remove(logentry)

Se você salvar o acima como svnLogStripByAuthor.py, poderá chamá-lo como:

svn log --xml other-options | svnLogStripByAuthor.py user
Avi
fonte
Por isso também adicionei a tag 'bash'.
21410 mimitock
Você poderia escrever um script utilitário para analisá-lo - veja meu exemplo
Avi
Não tenho o python instalado, mas enquanto o meu problema é resolvido de forma não relacionada, presumo que sua solução esteja funcionando, obrigado!
21410 mimrock
3
Magia é poder. Python é Bash.
N611x007
13

Como todos parecem estar inclinados para o Linux (et al): Aqui está o equivalente do Windows:

svn log [SVNPath]|find "USERNAME"
user2197169
fonte
Obrigado! Um cliente está usando o Windows, o que realmente ajudou. Este é um sistema gerenciado, eu não tenho direitos de administrador e não pode instalar o cygwin / perl / whatever ...
n13
8
svn log | grep user

funciona na maior parte.

Ou, para ser mais preciso:

svn log | egrep 'r[0-9]+ \| user \|'
moinudin
fonte
Obrigado, mas não consigo ver as mensagens de confirmação dessa maneira.
mimrock
@mimrock True. Você pode usar grep -Apara exibir o contexto, mas esse número é estático, enquanto a mensagem de confirmação é de tamanho variável. Você pode fazer uma solução com sed ou similar, mas isso é esforço. : P
moinudin
Isso também funciona no Windows, se você instalar extensões GIT ( code.google.com/p/gitextensions ) e iniciar um prompt de comando do GIT Bash.
Contango 14/01
1
@marcog Para a verdadeira integridade, tomar essa lista de revisões e fazer outra chamada com apenas deles: | awk '{ print "-" $1 }' | xargs svn log
Izkata
5

Enquanto a solução do yvoyer funciona bem, aqui está uma que utiliza a saída XML do SVN, analisando-a xmlstarlet.

svn log --xml | xmlstarlet sel -t -m 'log/logentry' \
  --if "author = '<AUTHOR>'" \
  -v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n

A partir daqui, você pode entrar em consultas XML mais avançadas.

mxgr
fonte
3

Aqui está a minha solução usando xslt. Infelizmente, o xsltproc não é um processador de streaming, portanto, você precisa dar um limite ao log. Exemplo de uso:

svn log -v --xml --limit=500  | xsltproc --stringparam author yonran /path/to/svnLogFilter.xslt  - | xsltproc /path/to/svnLogText.xslt  - | less

svnLogFilter.xslt

<!--
svnLogFilter.xslt

Usage: (note: use double dashes; I can't do double dashes in a XML comment)
svn log -xml | xsltproc -stringparam author yonran svnLogFilter.xslt -
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="author" select="''"/>
  <xsl:strip-space elements="log"/>
  <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
  <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
  <xsl:variable name="lowercaseAuthor" select="translate($author, $uppercase, $lowercase)"/>

<xsl:template match="/log">
  <xsl:copy>
    <xsl:apply-templates name="entrymatcher"/>
  </xsl:copy>
</xsl:template>

<xsl:template name="entrymatcher" match="logentry">
  <xsl:variable name="lowercaseChangeAuthor" select="translate(author, $uppercase, $lowercase)"/>
  <xsl:choose>
    <xsl:when test="contains($lowercaseChangeAuthor, $lowercaseAuthor)">
      <xsl:call-template name="insideentry"/>
    </xsl:when>
    <!--Filter out-->
    <xsl:otherwise/>
  </xsl:choose>
</xsl:template>


<xsl:template name="insideentry" match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

svnLogText.xslt

<!--
svnLogText.xslt

Usage: (note: use double dashes; I can't do double dashes in a XML comment)
svn log -xml -limit=1000 | xsltproc svnLogText.xslt -
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="author" select="''"/>
  <xsl:param name="xml" select="false()"/>
  <xsl:output method="text"/>

<xsl:template match="/log">
  <xsl:apply-templates name="entrymatcher"/>
  <xsl:text>------------------------------------------------------------------------&#xa;</xsl:text>
</xsl:template>

<xsl:template name="entrymatcher" match="logentry">
  <xsl:text>------------------------------------------------------------------------&#xa;</xsl:text>
  <xsl:text>r</xsl:text><xsl:value-of select="@revision"/>
  <xsl:text> | </xsl:text>
  <xsl:value-of select="author"/>
  <xsl:text> | </xsl:text>
  <xsl:value-of select="date"/>
  <xsl:text>&#xa;&#xa;</xsl:text>
  <xsl:if test="paths">
    <xsl:text>Changed paths:&#xa;</xsl:text>
    <xsl:for-each select="paths/path">
      <xsl:text>   </xsl:text>
      <xsl:value-of select="@action"/>
      <xsl:text> </xsl:text>
      <xsl:value-of select="."/>
      <xsl:text>&#xa;</xsl:text>
    </xsl:for-each>
  </xsl:if>
  <xsl:text>&#xa;</xsl:text>
  <xsl:value-of select="msg"/>
  <xsl:text>&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>
yonran
fonte
1

Você pode usar o Perl para filtrar o log por nome de usuário e manter as mensagens de confirmação. Basta definir a variável $ / que decide o que constitui uma "linha" no Perl. Se você definir isso como separador das entradas do log SVN, o Perl lerá um registro por vez e, em seguida, você poderá corresponder ao nome de usuário em todo o registro. Ver abaixo:

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
Stathis Sideris
fonte
Este funciona mesmo se você quiser encontrar vários resultados de log com base no nome de um arquivo!
walmik
1

Para obter diferenças, juntamente com o check-in.

Coloque os números de revisão em um arquivo:

svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r" 

Agora leia o arquivo e execute o diff para cada revisão:

while read p; do   svn log -v"$p" --diff ; done < Revisions.txt 
user668958
fonte
0

Eu tinha escrito um script por Python:

#!/usr/bin/python
# coding:utf-8

import sys

argv_len = len(sys.argv)


def help():
    print 'Filter svnlog by user or date!       '
    print 'USEAGE: svnlog [ARGs]                '
    print 'ARGs:                                '
    print '    -n[=name]:                       '
    print '      filter by the special [=name]\n'
    print '    -t[=date]:                       '
    print '      filter by the special [=date]  '
    print 'EXP:                                 '
    print '1. Filter ruikye\'s commit log       \n'
    print '     svn log -l 50 | svnlog -n=ruikye\n'


if not argv_len - 1:
    help()
    quit()

author = ''
date = ''

for index in range(1, argv_len):
    argv = sys.argv[index]
    if argv.startswith('-n='):
        author = argv.replace('-n=', '')
    elif argv.startswith('-t='):
        date = argv.replace('-t=', '')
    else:
        help()
        quit()

if author == '' and date == '':
    help()
    quit()


SPLIT_LINE =
    '------------------------------------------------------------------------'
src = ''.join(sys.stdin.readlines()).replace('\n\n', '\n')
lines = src.split(SPLIT_LINE)

for line in lines:
    if author in line and date in line:
        print SPLIT_LINE, line

if len(lines):
    print SPLIT_LINE

E use:

$ mv svnlog.py svnlog          

$ chmod a+x svnlog             

$ cd /usr/local/bin
$ ln -s ~/mycmd/svnlog filter 

$ svn log | filter -n=ruikye -t=2015-03-04
ruikye
fonte
A resposta existente que usa XML e analisa corretamente será mais robusta e flexível.
Tripleee 6/03/2015