Mercurial > hg > mercurial-crew-with-dirclash
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 |