comparison mercurial/unionrepo.py @ 19630:bb67f630b335

unionrevlog: extract 'baserevision' and 'baserevdiff' methods This makes possible to use unionrevlog class with subclasses of revlog that override revlog's 'revision' and 'revdiff' methods. In particular this change is necessary to implement manifest compression, as it allows extension to replace manifest class and override 'revision' amd 'revdiff' methods there.
author Wojciech Lopata <lopek@fb.com>
date Mon, 26 Aug 2013 17:11:01 -0700
parents a9c443b3b240
children 49f2d5644f04
comparison
equal deleted inserted replaced
19629:81241f978fd2 19630:bb67f630b335
68 if rev1 > self.repotiprev and rev2 > self.repotiprev: 68 if rev1 > self.repotiprev and rev2 > self.repotiprev:
69 return self.revlog2.revdiff( 69 return self.revlog2.revdiff(
70 self.revlog2.rev(self.node(rev1)), 70 self.revlog2.rev(self.node(rev1)),
71 self.revlog2.rev(self.node(rev2))) 71 self.revlog2.rev(self.node(rev2)))
72 elif rev1 <= self.repotiprev and rev2 <= self.repotiprev: 72 elif rev1 <= self.repotiprev and rev2 <= self.repotiprev:
73 return revlog.revlog.revdiff(self, rev1, rev2) 73 return self.baserevdiff(rev1, rev2)
74 74
75 return mdiff.textdiff(self.revision(self.node(rev1)), 75 return mdiff.textdiff(self.revision(self.node(rev1)),
76 self.revision(self.node(rev2))) 76 self.revision(self.node(rev2)))
77 77
78 def revision(self, nodeorrev): 78 def revision(self, nodeorrev):
91 91
92 if rev > self.repotiprev: 92 if rev > self.repotiprev:
93 text = self.revlog2.revision(node) 93 text = self.revlog2.revision(node)
94 self._cache = (node, rev, text) 94 self._cache = (node, rev, text)
95 else: 95 else:
96 text = revlog.revlog.revision(self, rev) 96 text = self.baserevision(rev)
97 # already cached 97 # already cached
98 return text 98 return text
99
100 def baserevision(self, nodeorrev):
101 # Revlog subclasses may override 'revision' method to modify format of
102 # content retrieved from revlog. To use unionrevlog with such class one
103 # needs to override 'baserevision' and make more specific call here.
104 return revlog.revlog.revision(self, nodeorrev)
105
106 def baserevdiff(self, rev1, rev2):
107 # Exists for the same purpose as baserevision.
108 return revlog.revlog.revdiff(self, rev1, rev2)
99 109
100 def addrevision(self, text, transaction, link, p1=None, p2=None, d=None): 110 def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
101 raise NotImplementedError 111 raise NotImplementedError
102 def addgroup(self, revs, linkmapper, transaction): 112 def addgroup(self, revs, linkmapper, transaction):
103 raise NotImplementedError 113 raise NotImplementedError
112 linkmapper = None 122 linkmapper = None
113 changelog2 = changelog.changelog(opener2) 123 changelog2 = changelog.changelog(opener2)
114 unionrevlog.__init__(self, opener, self.indexfile, changelog2, 124 unionrevlog.__init__(self, opener, self.indexfile, changelog2,
115 linkmapper) 125 linkmapper)
116 126
127 def baserevision(self, nodeorrev):
128 # Although changelog doesn't override 'revision' method, some extensions
129 # may replace this class with another that does. Same story with
130 # manifest and filelog classes.
131 return changelog.changelog.revision(self, nodeorrev)
132
133 def baserevdiff(self, rev1, rev2):
134 return changelog.changelog.revdiff(self, rev1, rev2)
135
117 class unionmanifest(unionrevlog, manifest.manifest): 136 class unionmanifest(unionrevlog, manifest.manifest):
118 def __init__(self, opener, opener2, linkmapper): 137 def __init__(self, opener, opener2, linkmapper):
119 manifest.manifest.__init__(self, opener) 138 manifest.manifest.__init__(self, opener)
120 manifest2 = manifest.manifest(opener2) 139 manifest2 = manifest.manifest(opener2)
121 unionrevlog.__init__(self, opener, self.indexfile, manifest2, 140 unionrevlog.__init__(self, opener, self.indexfile, manifest2,
122 linkmapper) 141 linkmapper)
142
143 def baserevision(self, nodeorrev):
144 return manifest.manifest.revision(self, nodeorrev)
145
146 def baserevdiff(self, rev1, rev2):
147 return manifest.manifest.revdiff(self, rev1, rev2)
123 148
124 class unionfilelog(unionrevlog, filelog.filelog): 149 class unionfilelog(unionrevlog, filelog.filelog):
125 def __init__(self, opener, path, opener2, linkmapper, repo): 150 def __init__(self, opener, path, opener2, linkmapper, repo):
126 filelog.filelog.__init__(self, opener, path) 151 filelog.filelog.__init__(self, opener, path)
127 filelog2 = filelog.filelog(opener2, path) 152 filelog2 = filelog.filelog(opener2, path)
128 unionrevlog.__init__(self, opener, self.indexfile, filelog2, 153 unionrevlog.__init__(self, opener, self.indexfile, filelog2,
129 linkmapper) 154 linkmapper)
130 self._repo = repo 155 self._repo = repo
156
157 def baserevision(self, nodeorrev):
158 return filelog.filelog.revision(self, nodeorrev)
159
160 def baserevdiff(self, rev1, rev2):
161 return filelog.filelog.revdiff(self, rev1, rev2)
131 162
132 def _file(self, f): 163 def _file(self, f):
133 self._repo.file(f) 164 self._repo.file(f)
134 165
135 class unionpeer(localrepo.localpeer): 166 class unionpeer(localrepo.localpeer):