обновление журнала pysvn - PullRequest
       7

обновление журнала pysvn

3 голосов
/ 18 ноября 2009

Как я могу, если возможно, получить информацию о том, какие файлы были добавлены, удалены, обновлены и т. Д. При запуске обновления svn в pysvn? Я хочу записать эту информацию в файл журнала.

Ответы [ 3 ]

2 голосов
/ 08 сентября 2010

вы можете сохранить исходную и обновленную ревизию, а затем использовать diff_summarize для получения обновленных файлов. (см. pysvn Справочник программиста )

вот пример:

import time
import pysvn

work_path = '.'

client = pysvn.Client()

entry = client.info(work_path)
old_rev = entry.revision.number

revs = client.update(work_path)
new_rev = revs[-1].number
print 'updated from %s to %s.\n' % (old_rev, new_rev)

head = pysvn.Revision(pysvn.opt_revision_kind.number, old_rev)
end = pysvn.Revision(pysvn.opt_revision_kind.number, new_rev)

log_messages = client.log(work_path, revision_start=head, revision_end=end,
        limit=0)
for log in log_messages:
    timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(log.date))
    print '[%s]\t%s\t%s\n  %s\n' % (log.revision.number, timestamp,
            log.author, log.message)
print

FILE_CHANGE_INFO = {
        pysvn.diff_summarize_kind.normal: ' ',
        pysvn.diff_summarize_kind.modified: 'M',
        pysvn.diff_summarize_kind.delete: 'D',
        pysvn.diff_summarize_kind.added: 'A',
        }

print 'file changed:'
summary = client.diff_summarize(work_path, head, work_path, end)
for info in summary:
    path = info.path
    if info.node_kind == pysvn.node_kind.dir:
        path += '/'
    file_changed = FILE_CHANGE_INFO[info.summarize_kind]
    prop_changed = ' '
    if info.prop_changed:
        prop_changed = 'M'
    print file_changed + prop_changed, path
print
1 голос
/ 26 марта 2014

Я знаю, что это старый, но нет принятого ответа, и я наткнулся на него при поиске информации, относящейся к node_kind.

import pysvn

tmpFile = open('your.log', 'w')

repository = sys.argv[1]
transactionId = sys.argv[2]
transaction = pysvn.Transaction(repository, transactionId)

#
#   transaction.changed()
#
#   {
#       u'some.file': ('R', <node_kind.file>, 1, 0),
#       u'another.file': ('R', <node_kind.file>, 1, 0),
#       u'aDirectory/a.file': ('R', <node_kind.file>, 1, 0),
#       u'anotherDirectory': ('A', <node_kind.dir>, 0, 0),
#       u'junk.file': ('D', <node_kind.file>, 0, 0)
#   }
#

for changedFile in transaction.changed():
    tmpFile.writelines(transaction.cat(changedFile))

    # if you need to check data in the .changed() dict...
    # if ('A' or 'R') in transaction.changed()[changedFile][0]

Я использую Transaction аналогично описанному выше в скрипте хука pre-commit SVN.

См. Документацию для подробностей словаря:
http://pysvn.tigris.org/docs/pysvn_prog_ref.html#pysvn_transaction
http://pysvn.tigris.org/docs/pysvn_prog_ref.html#pysvn_transaction_changed

Кроме того, хотя я не использовал метод list () транзакции, который также может представлять интерес:
http://pysvn.tigris.org/docs/pysvn_prog_ref.html#pysvn_transaction

1 голос
/ 08 сентября 2010

Когда вы создаете свой клиентский объект, добавьте ответный вызов notify . Обратный вызов - это функция, которая получает dict информации о событии.

import pysvn
import pprint

def notify(event_dict):
    pprint.pprint(event_dict)

client = pysvn.Client()
client.callback_notify = notify

# Perform actions with client
...