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 |