1 2 from svn import fs, repos, core, delta 3 import difflib 4 5 def cat(path, rev, fs_ptr, taskpool): 6 """dump the contents of a file""" 7 contents = '' 8 root = fs.revision_root(fs_ptr, rev, taskpool) 9 if not len(path): 10 print "You must supply a file path." 11 return contents 12 kind = fs.check_path(root, path, taskpool) 13 if kind == core.svn_node_none: 14 print "Path '%s' does not exist." % path 15 return contents 16 if kind == core.svn_node_dir: 17 print "Path '%s' is not a file." % path 18 return contents 19 20 filelen = fs.file_length(root, path, taskpool) 21 stream = fs.file_contents(root, path, taskpool) 22 read = 0 23 while read < filelen: 24 contents += core.svn_stream_read(stream, int(core.SVN_STREAM_CHUNK_SIZE)) 25 read += len(contents) 26 contents += core.svn_stream_read(stream, int(filelen)) 27 return contents 28 29 def diff(text1, text2): 30 result = difflib.unified_diff(text1.splitlines(1), text2.splitlines(1)) 31 return ''.join(result) 32 33 def get_diff(rev, fs_ptr, pool): 34 root = fs.revision_root(fs_ptr, rev, pool) 35 editor = repos.RevisionChangeCollector(fs_ptr, rev, pool) 36 e_ptr, e_baton = delta.make_editor(editor, pool) 37 repos.svn_repos_replay(root, e_ptr, e_baton, pool) 38 39 changes = [] 40 for path, change in editor.changes.items(): 41 changes.append([path, change.base_rev]) 42 changes.sort() 43 44 final_diff = '' 45 for path, base_rev in changes: 46 text1 = cat(path, base_rev, fs_ptr, pool) 47 text2 = ccat(path, rev, fs_ptr, pool) 48 final_diff += diff(text1, text2) 49 50 return final_diff 51 52 def main(pool): 53 54 # customize this 55 repos_path = '/path/to/repository/' 56 revision = 3 57 58 repos_ptr = repos.svn_repos_open(repos_path, pool) 59 fs_ptr = repos.svn_repos_fs(repos_ptr) 60 61 print get_diff(revision, fs_ptr, pool) 62 63 core.run_app(main)
You need to create an account or log in to post comments to this site.