Як відобразити певні користувацькі зобов’язання у журналі svn?


161

Як відобразити певні користувацькі зобов'язання у svn? Я не знайшов для цього вимикачів для журналу svn.


10
Використовуйте --searchопцію з Subversion 1.8 або новішим клієнтом.
bahrep

Відповіді:


258

Ви можете скористатися цим:

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

Він покаже вам усі зобов’язання, здійснені вказаним користувачем (USERNAME).

ОНОВЛЕННЯ

Як запропонував @bahrep, субверсія 1.8 поставляється з --searchможливістю.


6
Це рішення ідеально. Я хотів би зрозуміти, що це робить, але я не зміг знайти нічого в документації, яка б це пояснювала. У кого-небудь є інформація про те, чому це працює?
Метт Халс

1
+1 працює і для мене. Як і vi, в Unix / Linux distros sed є, мабуть, більш повсюдною, ніж Python - і тому не потрібно турбуватися про встановлення.
therobyouknow

10
@MattHulse працює, тому що він використовує sed, щоб відповідати всім між двома заданими регулярними виразами (ім'ям користувача та тире), а потім повідомляє йому надрукувати це (the p).
Gijs

5
@therobyouknow Ні, вам не потрібно виконувати svn logробочу копію. Ви також можете вказати своє сховище, тобто svn log https://your-svn-repo.
MBober

4
Більше цього не потрібно робити. Використовуйте Subversion 1.8 або новіший клієнт, який підтримує --searchопцію.
bahrep

101

З Subversion 1.8 або пізнішої версії:

svn log --search johnsmith77 -l 50

Окрім авторських збігів, це також з’явиться SVN-комітети, які містять це ім’я користувача у повідомленні, що не повинно статися, якщо ваше ім’я користувача не є загальним словом.

-l 50Буде обмежити пошук останніх 50 записів.

--search ARG

Фільтри журналу повідомлень показують лише ті, що відповідають схемі пошуку ARG.

Повідомлення журналу відображаються лише в тому випадку, якщо наданий шаблон пошуку відповідає будь-якому автору, даті, тексту повідомлення журналу (якщо --quietне використовується) або, якщо --verboseопція також надана, зміненому контуру.

Якщо --searchнадано кілька варіантів, відображається повідомлення журналу, якщо воно відповідає будь-якому із наданих шаблонів пошуку.

Якщо --limitвикористовується, вона обмежує кількість пошукових повідомлень журналу, а не обмежує вихід на певну кількість відповідних повідомлень журналу.

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


1
@Izkata додано у SVN 1.8: svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html
bahrep

якщо ви хочете знайти більш одного учасника, 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

Це рішення можна використовувати і з --diff аргументом (щоб показати змінений код)
joro

Будь-який спосіб відфільтрувати поява у повідомленнях фіксації, якщо ім'я користувача є загальним (частиною) слова?
Тор

17

svn не має вбудованих параметрів для цього. У нього є svn log --xmlможливість, щоб ви могли самостійно проаналізувати результат і отримати цікаві частини.

Ви можете написати скрипт для його розбору, наприклад, у 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)

Якщо ви збережете вищезазначене як svnLogStripByAuthor.py, ви можете назвати це як:

svn log --xml other-options | svnLogStripByAuthor.py user

Тому я також додав тег 'bash'.
мімрок

Ви можете написати скрипт утиліти, щоб розібрати його - див. Мій приклад
Аві

У мене не встановлено python, але, поки моя проблема вирішується незв’язаним чином, я вважаю, що ваше рішення працює, дякую!
мімрок

3
Магія - це може. Пітон - Баш.
n611x007

13

Оскільки, схоже, всі схиляються до Linux (et al): Ось еквівалент Windows:

svn log [SVNPath]|find "USERNAME"

Дякую! Клієнт використовує Windows, щоб це справді допомогло. Це керована система, я не маю прав адміністратора і не можу встановити cygwin / perl / що завгодно ...
n13,

8
svn log | grep user

працює здебільшого.

Або якщо бути точнішим:

svn log | egrep 'r[0-9]+ \| user \|'

Дякую, але я не можу побачити повідомлення про фіксацію таким чином.
мімрок

@mimrock Правда. Можна -Aвідобразити контекст, але це число є статичним, тоді як повідомлення фіксації має різну довжину. Ви можете зробити рішення з sed або подібним, але це зусилля. : P
moinudin

Це також працює в Windows, якщо ви встановите розширення GIT ( code.google.com/p/gitextensions ) і запустите командний рядок GIT Bash.
Контанго

1
@marcog Для істинної повноти, візьміть цей список змін і зробити ще один дзвінок тільки з ними: | awk '{ print "-" $1 }' | xargs svn log
Izkata

5

Хоча рішення yvoyer прекрасно працює, ось один з використання XML-виводу SVN, аналіз його xmlstarlet.

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

Звідси ви можете перейти до більш вдосконалених XML-запитів.


3

Ось моє рішення за допомогою xslt. На жаль, xsltproc не є потоковим процесором, тому вам потрібно дати обмеження журналу. Приклад використання:

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>


1

Ви можете використовувати Perl для фільтрації журналу за іменем користувача та підтримки повідомлень про фіксацію. Просто встановіть $ / змінну, яка визначає, що являє собою "рядок" в Perl. Якщо ви встановите це для роздільника записів журналу SVN, Perl буде читати один запис за один раз, і тоді ви повинні мати змогу співставити ім'я користувача з усім записом. Дивись нижче:

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'

Цей працює, навіть якщо ви хочете знайти купу результатів журналу на основі імені файлу!
walmik

1

GET відрізняється разом із реєстрацією.

Отримайте ревізійні номери у файл:

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

Тепер прочитайте файл та виконання diff для кожної версії:

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

0

Я повинен був написати сценарій 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

і використовувати:

$ 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

Існуюча відповідь, яка використовує XML і правильно розбирає, буде більш надійною і гнучкою.
трійка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.