comparison mercurial/hg.py @ 79:837d473d54d5

Add basic annotation support filelog.annotate() will get the change number on each line. Singed-Off-by: Christopher Li<hg@chrisli.org>
author mpm@selenic.com
date Tue, 17 May 2005 01:12:30 -0800
parents 85f1f87dc8ff
children 9fd5b35cfc45
comparison
equal deleted inserted replaced
78:85f1f87dc8ff 79:837d473d54d5
8 import sys, struct, sha, socket, os, time, base64, re, urllib2 8 import sys, struct, sha, socket, os, time, base64, re, urllib2
9 import urllib 9 import urllib
10 from mercurial import byterange 10 from mercurial import byterange
11 from mercurial.transaction import * 11 from mercurial.transaction import *
12 from mercurial.revlog import * 12 from mercurial.revlog import *
13 from difflib import SequenceMatcher
13 14
14 class filelog(revlog): 15 class filelog(revlog):
15 def __init__(self, opener, path): 16 def __init__(self, opener, path):
16 s = self.encodepath(path) 17 s = self.encodepath(path)
17 revlog.__init__(self, opener, os.path.join("data", s + "i"), 18 revlog.__init__(self, opener, os.path.join("data", s + "i"),
62 63
63 def merge(self, other, transaction, linkseq, link): 64 def merge(self, other, transaction, linkseq, link):
64 """perform a merge and resolve resulting heads""" 65 """perform a merge and resolve resulting heads"""
65 (o, n) = self.mergedag(other, transaction, linkseq) 66 (o, n) = self.mergedag(other, transaction, linkseq)
66 return self.resolvedag(o, n, transaction, link) 67 return self.resolvedag(o, n, transaction, link)
68
69 def annotate(self, node):
70 revs = []
71 while node != nullid:
72 revs.append(node)
73 node = self.parents(node)[0]
74 revs.reverse()
75 prev = []
76 annotate = []
77 for node in revs:
78 curr = self.read(node).splitlines(1)
79 linkrev = self.linkrev(node)
80 sm = SequenceMatcher(None, prev, curr)
81 offset = 0
82 for o, m, n, s, t in sm.get_opcodes():
83 if o in ('insert','replace'):
84 annotate[m+offset:n+offset] = \
85 [ (linkrev, l) for l in curr[s:t]]
86 if o == 'insert':
87 offset += m-n
88 elif o == 'delete':
89 del annotate[m+offset:n+offset]
90 offset -= m-n
91 assert len(annotate) == len(curr)
92 prev = curr
93 return annotate
67 94
68 class manifest(revlog): 95 class manifest(revlog):
69 def __init__(self, opener): 96 def __init__(self, opener):
70 self.mapcache = None 97 self.mapcache = None
71 self.listcache = None 98 self.listcache = None