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