Mercurial > public > mercurial-scm > hg
comparison mercurial/unionrepo.py @ 43076:2372284d9457
formatting: blacken the codebase
This is using my patch to black
(https://github.com/psf/black/pull/826) so we don't un-wrap collection
literals.
Done with:
hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**"' | xargs black -S
# skip-blame mass-reformatting only
# no-check-commit reformats foo_bar functions
Differential Revision: https://phab.mercurial-scm.org/D6971
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 06 Oct 2019 09:45:02 -0400 |
parents | 853f70137437 |
children | 687b865b95ad |
comparison
equal
deleted
inserted
replaced
43075:57875cf423c9 | 43076:2372284d9457 |
---|---|
28 revlog, | 28 revlog, |
29 util, | 29 util, |
30 vfs as vfsmod, | 30 vfs as vfsmod, |
31 ) | 31 ) |
32 | 32 |
33 | |
33 class unionrevlog(revlog.revlog): | 34 class unionrevlog(revlog.revlog): |
34 def __init__(self, opener, indexfile, revlog2, linkmapper): | 35 def __init__(self, opener, indexfile, revlog2, linkmapper): |
35 # How it works: | 36 # How it works: |
36 # To retrieve a revision, we just need to know the node id so we can | 37 # To retrieve a revision, we just need to know the node id so we can |
37 # look it up in revlog2. | 38 # look it up in revlog2. |
42 revlog.revlog.__init__(self, opener, indexfile) | 43 revlog.revlog.__init__(self, opener, indexfile) |
43 self.revlog2 = revlog2 | 44 self.revlog2 = revlog2 |
44 | 45 |
45 n = len(self) | 46 n = len(self) |
46 self.repotiprev = n - 1 | 47 self.repotiprev = n - 1 |
47 self.bundlerevs = set() # used by 'bundle()' revset expression | 48 self.bundlerevs = set() # used by 'bundle()' revset expression |
48 for rev2 in self.revlog2: | 49 for rev2 in self.revlog2: |
49 rev = self.revlog2.index[rev2] | 50 rev = self.revlog2.index[rev2] |
50 # rev numbers - in revlog2, very different from self.rev | 51 # rev numbers - in revlog2, very different from self.rev |
51 _start, _csize, rsize, base, linkrev, p1rev, p2rev, node = rev | 52 _start, _csize, rsize, base, linkrev, p1rev, p2rev, node = rev |
52 flags = _start & 0xFFFF | 53 flags = _start & 0xFFFF |
53 | 54 |
54 if linkmapper is None: # link is to same revlog | 55 if linkmapper is None: # link is to same revlog |
55 assert linkrev == rev2 # we never link back | 56 assert linkrev == rev2 # we never link back |
56 link = n | 57 link = n |
57 else: # rev must be mapped from repo2 cl to unified cl by linkmapper | 58 else: # rev must be mapped from repo2 cl to unified cl by linkmapper |
58 link = linkmapper(linkrev) | 59 link = linkmapper(linkrev) |
59 | 60 |
60 if linkmapper is not None: # link is to same revlog | 61 if linkmapper is not None: # link is to same revlog |
61 base = linkmapper(base) | 62 base = linkmapper(base) |
62 | 63 |
63 if node in self.nodemap: | 64 if node in self.nodemap: |
64 # this happens for the common revlog revisions | 65 # this happens for the common revlog revisions |
65 self.bundlerevs.add(self.nodemap[node]) | 66 self.bundlerevs.add(self.nodemap[node]) |
68 p1node = self.revlog2.node(p1rev) | 69 p1node = self.revlog2.node(p1rev) |
69 p2node = self.revlog2.node(p2rev) | 70 p2node = self.revlog2.node(p2rev) |
70 | 71 |
71 # TODO: it's probably wrong to set compressed length to None, but | 72 # TODO: it's probably wrong to set compressed length to None, but |
72 # I have no idea if csize is valid in the base revlog context. | 73 # I have no idea if csize is valid in the base revlog context. |
73 e = (flags, None, rsize, base, | 74 e = ( |
74 link, self.rev(p1node), self.rev(p2node), node) | 75 flags, |
76 None, | |
77 rsize, | |
78 base, | |
79 link, | |
80 self.rev(p1node), | |
81 self.rev(p2node), | |
82 node, | |
83 ) | |
75 self.index.append(e) | 84 self.index.append(e) |
76 self.nodemap[node] = n | 85 self.nodemap[node] = n |
77 self.bundlerevs.add(n) | 86 self.bundlerevs.add(n) |
78 n += 1 | 87 n += 1 |
79 | 88 |
85 def revdiff(self, rev1, rev2): | 94 def revdiff(self, rev1, rev2): |
86 """return or calculate a delta between two revisions""" | 95 """return or calculate a delta between two revisions""" |
87 if rev1 > self.repotiprev and rev2 > self.repotiprev: | 96 if rev1 > self.repotiprev and rev2 > self.repotiprev: |
88 return self.revlog2.revdiff( | 97 return self.revlog2.revdiff( |
89 self.revlog2.rev(self.node(rev1)), | 98 self.revlog2.rev(self.node(rev1)), |
90 self.revlog2.rev(self.node(rev2))) | 99 self.revlog2.rev(self.node(rev2)), |
100 ) | |
91 elif rev1 <= self.repotiprev and rev2 <= self.repotiprev: | 101 elif rev1 <= self.repotiprev and rev2 <= self.repotiprev: |
92 return super(unionrevlog, self).revdiff(rev1, rev2) | 102 return super(unionrevlog, self).revdiff(rev1, rev2) |
93 | 103 |
94 return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2)) | 104 return mdiff.textdiff(self.rawdata(rev1), self.rawdata(rev2)) |
95 | 105 |
109 func = super(unionrevlog, self)._revisiondata | 119 func = super(unionrevlog, self)._revisiondata |
110 return func(node, _df=_df, raw=raw) | 120 return func(node, _df=_df, raw=raw) |
111 | 121 |
112 def addrevision(self, text, transaction, link, p1=None, p2=None, d=None): | 122 def addrevision(self, text, transaction, link, p1=None, p2=None, d=None): |
113 raise NotImplementedError | 123 raise NotImplementedError |
114 def addgroup(self, deltas, linkmapper, transaction, addrevisioncb=None, | 124 |
115 maybemissingparents=False): | 125 def addgroup( |
116 raise NotImplementedError | 126 self, |
127 deltas, | |
128 linkmapper, | |
129 transaction, | |
130 addrevisioncb=None, | |
131 maybemissingparents=False, | |
132 ): | |
133 raise NotImplementedError | |
134 | |
117 def strip(self, minlink, transaction): | 135 def strip(self, minlink, transaction): |
118 raise NotImplementedError | 136 raise NotImplementedError |
137 | |
119 def checksize(self): | 138 def checksize(self): |
120 raise NotImplementedError | 139 raise NotImplementedError |
140 | |
121 | 141 |
122 class unionchangelog(unionrevlog, changelog.changelog): | 142 class unionchangelog(unionrevlog, changelog.changelog): |
123 def __init__(self, opener, opener2): | 143 def __init__(self, opener, opener2): |
124 changelog.changelog.__init__(self, opener) | 144 changelog.changelog.__init__(self, opener) |
125 linkmapper = None | 145 linkmapper = None |
126 changelog2 = changelog.changelog(opener2) | 146 changelog2 = changelog.changelog(opener2) |
127 unionrevlog.__init__(self, opener, self.indexfile, changelog2, | 147 unionrevlog.__init__( |
128 linkmapper) | 148 self, opener, self.indexfile, changelog2, linkmapper |
149 ) | |
150 | |
129 | 151 |
130 class unionmanifest(unionrevlog, manifest.manifestrevlog): | 152 class unionmanifest(unionrevlog, manifest.manifestrevlog): |
131 def __init__(self, opener, opener2, linkmapper): | 153 def __init__(self, opener, opener2, linkmapper): |
132 manifest.manifestrevlog.__init__(self, opener) | 154 manifest.manifestrevlog.__init__(self, opener) |
133 manifest2 = manifest.manifestrevlog(opener2) | 155 manifest2 = manifest.manifestrevlog(opener2) |
134 unionrevlog.__init__(self, opener, self.indexfile, manifest2, | 156 unionrevlog.__init__( |
135 linkmapper) | 157 self, opener, self.indexfile, manifest2, linkmapper |
158 ) | |
159 | |
136 | 160 |
137 class unionfilelog(filelog.filelog): | 161 class unionfilelog(filelog.filelog): |
138 def __init__(self, opener, path, opener2, linkmapper, repo): | 162 def __init__(self, opener, path, opener2, linkmapper, repo): |
139 filelog.filelog.__init__(self, opener, path) | 163 filelog.filelog.__init__(self, opener, path) |
140 filelog2 = filelog.filelog(opener2, path) | 164 filelog2 = filelog.filelog(opener2, path) |
141 self._revlog = unionrevlog(opener, self.indexfile, | 165 self._revlog = unionrevlog( |
142 filelog2._revlog, linkmapper) | 166 opener, self.indexfile, filelog2._revlog, linkmapper |
167 ) | |
143 self._repo = repo | 168 self._repo = repo |
144 self.repotiprev = self._revlog.repotiprev | 169 self.repotiprev = self._revlog.repotiprev |
145 self.revlog2 = self._revlog.revlog2 | 170 self.revlog2 = self._revlog.revlog2 |
146 | 171 |
147 def iscensored(self, rev): | 172 def iscensored(self, rev): |
149 if rev <= self.repotiprev: | 174 if rev <= self.repotiprev: |
150 return filelog.filelog.iscensored(self, rev) | 175 return filelog.filelog.iscensored(self, rev) |
151 node = self.node(rev) | 176 node = self.node(rev) |
152 return self.revlog2.iscensored(self.revlog2.rev(node)) | 177 return self.revlog2.iscensored(self.revlog2.rev(node)) |
153 | 178 |
179 | |
154 class unionpeer(localrepo.localpeer): | 180 class unionpeer(localrepo.localpeer): |
155 def canpush(self): | 181 def canpush(self): |
156 return False | 182 return False |
157 | 183 |
184 | |
158 class unionrepository(object): | 185 class unionrepository(object): |
159 """Represents the union of data in 2 repositories. | 186 """Represents the union of data in 2 repositories. |
160 | 187 |
161 Instances are not usable if constructed directly. Use ``instance()`` | 188 Instances are not usable if constructed directly. Use ``instance()`` |
162 or ``makeunionrepository()`` to create a usable instance. | 189 or ``makeunionrepository()`` to create a usable instance. |
163 """ | 190 """ |
191 | |
164 def __init__(self, repo2, url): | 192 def __init__(self, repo2, url): |
165 self.repo2 = repo2 | 193 self.repo2 = repo2 |
166 self._url = url | 194 self._url = url |
167 | 195 |
168 self.ui.setconfig('phases', 'publish', False, 'unionrepo') | 196 self.ui.setconfig('phases', 'publish', False, 'unionrepo') |
171 def changelog(self): | 199 def changelog(self): |
172 return unionchangelog(self.svfs, self.repo2.svfs) | 200 return unionchangelog(self.svfs, self.repo2.svfs) |
173 | 201 |
174 @localrepo.unfilteredpropertycache | 202 @localrepo.unfilteredpropertycache |
175 def manifestlog(self): | 203 def manifestlog(self): |
176 rootstore = unionmanifest(self.svfs, self.repo2.svfs, | 204 rootstore = unionmanifest( |
177 self.unfiltered()._clrev) | 205 self.svfs, self.repo2.svfs, self.unfiltered()._clrev |
178 return manifest.manifestlog(self.svfs, self, rootstore, | 206 ) |
179 self.narrowmatch()) | 207 return manifest.manifestlog( |
208 self.svfs, self, rootstore, self.narrowmatch() | |
209 ) | |
180 | 210 |
181 def _clrev(self, rev2): | 211 def _clrev(self, rev2): |
182 """map from repo2 changelog rev to temporary rev in self.changelog""" | 212 """map from repo2 changelog rev to temporary rev in self.changelog""" |
183 node = self.repo2.changelog.node(rev2) | 213 node = self.repo2.changelog.node(rev2) |
184 return self.changelog.rev(node) | 214 return self.changelog.rev(node) |
185 | 215 |
186 def url(self): | 216 def url(self): |
187 return self._url | 217 return self._url |
188 | 218 |
189 def file(self, f): | 219 def file(self, f): |
190 return unionfilelog(self.svfs, f, self.repo2.svfs, | 220 return unionfilelog( |
191 self.unfiltered()._clrev, self) | 221 self.svfs, f, self.repo2.svfs, self.unfiltered()._clrev, self |
222 ) | |
192 | 223 |
193 def close(self): | 224 def close(self): |
194 self.repo2.close() | 225 self.repo2.close() |
195 | 226 |
196 def cancopy(self): | 227 def cancopy(self): |
198 | 229 |
199 def peer(self): | 230 def peer(self): |
200 return unionpeer(self) | 231 return unionpeer(self) |
201 | 232 |
202 def getcwd(self): | 233 def getcwd(self): |
203 return encoding.getcwd() # always outside the repo | 234 return encoding.getcwd() # always outside the repo |
235 | |
204 | 236 |
205 def instance(ui, path, create, intents=None, createopts=None): | 237 def instance(ui, path, create, intents=None, createopts=None): |
206 if create: | 238 if create: |
207 raise error.Abort(_('cannot create new union repository')) | 239 raise error.Abort(_('cannot create new union repository')) |
208 parentpath = ui.config("bundle", "mainreporoot") | 240 parentpath = ui.config("bundle", "mainreporoot") |
218 if parentpath == cwd: | 250 if parentpath == cwd: |
219 parentpath = '' | 251 parentpath = '' |
220 else: | 252 else: |
221 cwd = pathutil.normasprefix(cwd) | 253 cwd = pathutil.normasprefix(cwd) |
222 if parentpath.startswith(cwd): | 254 if parentpath.startswith(cwd): |
223 parentpath = parentpath[len(cwd):] | 255 parentpath = parentpath[len(cwd) :] |
224 if path.startswith('union:'): | 256 if path.startswith('union:'): |
225 s = path.split(":", 1)[1].split("+", 1) | 257 s = path.split(":", 1)[1].split("+", 1) |
226 if len(s) == 1: | 258 if len(s) == 1: |
227 repopath, repopath2 = parentpath, s[0] | 259 repopath, repopath2 = parentpath, s[0] |
228 else: | 260 else: |
230 else: | 262 else: |
231 repopath, repopath2 = parentpath, path | 263 repopath, repopath2 = parentpath, path |
232 | 264 |
233 return makeunionrepository(ui, repopath, repopath2) | 265 return makeunionrepository(ui, repopath, repopath2) |
234 | 266 |
267 | |
235 def makeunionrepository(ui, repopath1, repopath2): | 268 def makeunionrepository(ui, repopath1, repopath2): |
236 """Make a union repository object from 2 local repo paths.""" | 269 """Make a union repository object from 2 local repo paths.""" |
237 repo1 = localrepo.instance(ui, repopath1, create=False) | 270 repo1 = localrepo.instance(ui, repopath1, create=False) |
238 repo2 = localrepo.instance(ui, repopath2, create=False) | 271 repo2 = localrepo.instance(ui, repopath2, create=False) |
239 | 272 |
240 url = 'union:%s+%s' % (util.expandpath(repopath1), | 273 url = 'union:%s+%s' % ( |
241 util.expandpath(repopath2)) | 274 util.expandpath(repopath1), |
275 util.expandpath(repopath2), | |
276 ) | |
242 | 277 |
243 class derivedunionrepository(unionrepository, repo1.__class__): | 278 class derivedunionrepository(unionrepository, repo1.__class__): |
244 pass | 279 pass |
245 | 280 |
246 repo = repo1 | 281 repo = repo1 |