Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Get diffs of a changeset using pysvn (See related posts)

   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.


Click here to browse all 5309 code snippets

Related Posts