mercurial/hg.py
changeset 79 837d473d54d5
parent 78 85f1f87dc8ff
child 83 9fd5b35cfc45
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