~svn/ubuntu/oneiric/subversion/ppa

« back to all changes in this revision

Viewing changes to tools/examples/blame.py

  • Committer: Bazaar Package Importer
  • Author(s): Adam Conrad
  • Date: 2005-12-05 01:26:14 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051205012614-qom4xfypgtsqc2xq
Tags: 1.2.3dfsg1-3ubuntu1
Merge with the final Debian release of 1.2.3dfsg1-3, bringing in
fixes to the clean target, better documentation of the libdb4.3
upgrade and build fixes to work with swig1.3_1.3.27.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
#
 
3
# USAGE: blame.py [-r REV] repos-path file
 
4
#
 
5
 
 
6
import sys
 
7
import os
 
8
import getopt
 
9
import difflib
 
10
from svn import fs, core, repos
 
11
 
 
12
CHUNK_SIZE = 100000
 
13
 
 
14
def getfile(pool, path, filename, rev=None):
 
15
  
 
16
  annotresult = {}
 
17
  if path[-1] == "/":
 
18
     path = path[:-1]
 
19
 
 
20
  repos_ptr = repos.open(path, pool)
 
21
  fsob = repos.fs(repos_ptr)
 
22
 
 
23
  if rev is None:
 
24
    rev = fs.youngest_rev(fsob, pool)
 
25
  filedata = '' 
 
26
  for i in xrange(0, rev+1):
 
27
    root = fs.revision_root(fsob, i, pool)
 
28
    if fs.check_path(root, filename, pool) != core.svn_node_none:
 
29
      first = i
 
30
      break
 
31
  print "First revision is %d" % first
 
32
  print "Last revision is %d" % rev
 
33
  for i in xrange(first, rev+1):
 
34
    previousroot = root
 
35
    root = fs.revision_root(fsob, i, pool)
 
36
    if i != first:
 
37
      if not fs.contents_changed(root, filename, previousroot, filename, pool):
 
38
        continue
 
39
      
 
40
    file = fs.file_contents(root, filename, pool)
 
41
    previousdata = filedata
 
42
    filedata = ''
 
43
    while 1:
 
44
      data = core.svn_stream_read(file, CHUNK_SIZE)
 
45
      if not data:
 
46
        break
 
47
      filedata = filedata + data
 
48
 
 
49
    print "Current revision is %d" % i
 
50
    diffresult = difflib.ndiff(previousdata.splitlines(1),
 
51
                               filedata.splitlines(1))
 
52
    #    print ''.join(diffresult)
 
53
    k = 0    
 
54
    for j in diffresult:
 
55
      if j[0] == ' ':
 
56
        if annotresult.has_key (k):
 
57
          k = k + 1
 
58
          continue
 
59
        else:
 
60
          annotresult[k] = (i, j[2:])
 
61
          k = k + 1
 
62
          continue
 
63
      elif j[0] == '?':
 
64
        continue
 
65
      annotresult[k] = (i, j[2:])
 
66
      if j[0] != '-':
 
67
        k = k + 1
 
68
#    print ''.join(diffresult)
 
69
#  print annotresult 
 
70
  for x in xrange(len(annotresult.keys())):
 
71
     sys.stdout.write("Line %d (rev %d):%s" % (x,
 
72
                                               annotresult[x][0],
 
73
                                               annotresult[x][1]))
 
74
 
 
75
def usage():
 
76
  print "USAGE: blame.py [-r REV] repos-path file"
 
77
  sys.exit(1)
 
78
 
 
79
def main():
 
80
  opts, args = getopt.getopt(sys.argv[1:], 'r:')
 
81
  if len(args) != 2:
 
82
    usage()
 
83
  rev = None
 
84
  for name, value in opts:
 
85
    if name == '-r':
 
86
      rev = int(value)
 
87
  core.run_app(getfile, args[0], args[1], rev)
 
88
 
 
89
if __name__ == '__main__':
 
90
  main()