36 revs.append(node) |
36 revs.append(node) |
37 node = self.parents(node)[0] |
37 node = self.parents(node)[0] |
38 revs.reverse() |
38 revs.reverse() |
39 prev = [] |
39 prev = [] |
40 annotate = [] |
40 annotate = [] |
|
41 |
41 for node in revs: |
42 for node in revs: |
42 curr = self.read(node).splitlines(1) |
43 curr = self.read(node).splitlines(1) |
43 linkrev = self.linkrev(node) |
44 linkrev = self.linkrev(node) |
44 sm = SequenceMatcher(None, prev, curr) |
45 sm = SequenceMatcher(None, prev, curr) |
45 offset = 0 |
46 new = [] |
46 for o, m, n, s, t in sm.get_opcodes(): |
47 for o, m, n, s, t in sm.get_opcodes(): |
47 if o in ('insert','replace'): |
48 if o == 'equal': |
48 annotate[m+offset:n+offset] = \ |
49 new += annotate[m:n] |
49 [ (linkrev, l) for l in curr[s:t]] |
50 else: |
50 if o == 'insert': |
51 new += [(linkrev, l) for l in curr[s:t]] |
51 offset += m-n |
52 annotate, prev = new, curr |
52 elif o == 'delete': |
|
53 del annotate[m+offset:n+offset] |
|
54 offset -= m-n |
|
55 assert len(annotate) == len(curr) |
|
56 prev = curr |
|
57 return annotate |
53 return annotate |
58 |
54 |
59 class manifest(revlog): |
55 class manifest(revlog): |
60 def __init__(self, opener): |
56 def __init__(self, opener): |
61 self.mapcache = None |
57 self.mapcache = None |