Mercurial > public > mercurial-scm > hg
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): |