2009-11-18 92 views
3

如何可能的話,我怎樣才能獲得有關在pysvn中運行svn update時添加,刪除,更新了哪些文件的信息?我想將這些信息寫入日誌文件。log pysvn update

回答

2

您可以保存原始和更新版本,然後使用diff_summarize獲取更新的文件。 (見pysvn Programmer's reference

這裏有一個例子:

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 
+0

'總結=客戶端。 diff_summarize(url,pysvn.Revision(pysvn.opt_revision_kind.committed),url,pysvn.Revision(pysvn.opt_revision_kind.previous))'can diff_summarize可以像上面那樣在兩個不在工作路徑上的url上使用? – slee 2013-07-21 08:08:10

1

當你創建你的客戶對象,添加notify callback。回調函數需要一個關於事件的信息dict

import pysvn 
import pprint 

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

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

# Perform actions with client 
1

我知道這是舊的,但還沒有一個公認的答案,我通過它絆倒而尋找屬於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] 

我使用事務以類似的方式在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