Mercurial > public > mercurial-scm > hg
comparison mercurial/manifest.py @ 30221:f2c5b9d48b29 stable
manifest: make treemanifestctx store the repo
Same as in the last commit, the old treemanifestctx stored a reference to the
revlog. If the inmemory revlog became invalid, the ctx now held an old copy and
would be incorrect. To fix this, we need the ctx to go through the manifestlog
for each access.
This is the same pattern that changectx already uses (it stores the repo, and
accesses commit data through self._repo.changelog).
author | Durham Goode <durham@fb.com> |
---|---|
date | Tue, 18 Oct 2016 17:44:42 -0700 |
parents | acc8885a6450 |
children | 1a0c1ad57833 |
comparison
equal
deleted
inserted
replaced
30220:acc8885a6450 | 30221:f2c5b9d48b29 |
---|---|
1272 if (isinstance(cachemf, manifestctx) or | 1272 if (isinstance(cachemf, manifestctx) or |
1273 isinstance(cachemf, treemanifestctx)): | 1273 isinstance(cachemf, treemanifestctx)): |
1274 return cachemf | 1274 return cachemf |
1275 | 1275 |
1276 if self._treeinmem: | 1276 if self._treeinmem: |
1277 m = treemanifestctx(self._revlog, '', node) | 1277 m = treemanifestctx(self._repo, '', node) |
1278 else: | 1278 else: |
1279 m = manifestctx(self._repo, node) | 1279 m = manifestctx(self._repo, node) |
1280 if node != revlog.nullid: | 1280 if node != revlog.nullid: |
1281 self._mancache[node] = m | 1281 self._mancache[node] = m |
1282 return m | 1282 return m |
1342 r = revlog.rev(self._node) | 1342 r = revlog.rev(self._node) |
1343 d = mdiff.patchtext(revlog.revdiff(revlog.deltaparent(r), r)) | 1343 d = mdiff.patchtext(revlog.revdiff(revlog.deltaparent(r), r)) |
1344 return manifestdict(d) | 1344 return manifestdict(d) |
1345 | 1345 |
1346 class treemanifestctx(object): | 1346 class treemanifestctx(object): |
1347 def __init__(self, revlog, dir, node): | 1347 def __init__(self, repo, dir, node): |
1348 revlog = revlog.dirlog(dir) | 1348 self._repo = repo |
1349 self._revlog = revlog | |
1350 self._dir = dir | 1349 self._dir = dir |
1351 self._data = None | 1350 self._data = None |
1352 | 1351 |
1353 self._node = node | 1352 self._node = node |
1354 | 1353 |
1357 # have on disk. | 1356 # have on disk. |
1358 #self.p1, self.p2 = revlog.parents(node) | 1357 #self.p1, self.p2 = revlog.parents(node) |
1359 #rev = revlog.rev(node) | 1358 #rev = revlog.rev(node) |
1360 #self.linkrev = revlog.linkrev(rev) | 1359 #self.linkrev = revlog.linkrev(rev) |
1361 | 1360 |
1361 def _revlog(self): | |
1362 return self._repo.manifestlog._revlog.dirlog(self._dir) | |
1363 | |
1362 def read(self): | 1364 def read(self): |
1363 if not self._data: | 1365 if not self._data: |
1366 rl = self._revlog() | |
1364 if self._node == revlog.nullid: | 1367 if self._node == revlog.nullid: |
1365 self._data = treemanifest() | 1368 self._data = treemanifest() |
1366 elif self._revlog._treeondisk: | 1369 elif rl._treeondisk: |
1367 m = treemanifest(dir=self._dir) | 1370 m = treemanifest(dir=self._dir) |
1368 def gettext(): | 1371 def gettext(): |
1369 return self._revlog.revision(self._node) | 1372 return rl.revision(self._node) |
1370 def readsubtree(dir, subm): | 1373 def readsubtree(dir, subm): |
1371 return treemanifestctx(self._revlog, dir, subm).read() | 1374 return treemanifestctx(self._repo, dir, subm).read() |
1372 m.read(gettext, readsubtree) | 1375 m.read(gettext, readsubtree) |
1373 m.setnode(self._node) | 1376 m.setnode(self._node) |
1374 self._data = m | 1377 self._data = m |
1375 else: | 1378 else: |
1376 text = self._revlog.revision(self._node) | 1379 text = revlog.revision(self._node) |
1377 arraytext = array.array('c', text) | 1380 arraytext = array.array('c', text) |
1378 self._revlog.fulltextcache[self._node] = arraytext | 1381 rl.fulltextcache[self._node] = arraytext |
1379 self._data = treemanifest(dir=self._dir, text=text) | 1382 self._data = treemanifest(dir=self._dir, text=text) |
1380 | 1383 |
1381 return self._data | 1384 return self._data |
1382 | 1385 |
1383 def node(self): | 1386 def node(self): |
1384 return self._node | 1387 return self._node |
1385 | 1388 |
1386 def readdelta(self): | 1389 def readdelta(self): |
1387 # Need to perform a slow delta | 1390 # Need to perform a slow delta |
1388 revlog = self._revlog | 1391 revlog = self._revlog() |
1389 r0 = revlog.deltaparent(revlog.rev(self._node)) | 1392 r0 = revlog.deltaparent(revlog.rev(self._node)) |
1390 m0 = treemanifestctx(revlog, self._dir, revlog.node(r0)).read() | 1393 m0 = treemanifestctx(self._repo, self._dir, revlog.node(r0)).read() |
1391 m1 = self.read() | 1394 m1 = self.read() |
1392 md = treemanifest(dir=self._dir) | 1395 md = treemanifest(dir=self._dir) |
1393 for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems(): | 1396 for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems(): |
1394 if n1: | 1397 if n1: |
1395 md[f] = n1 | 1398 md[f] = n1 |
1396 if fl1: | 1399 if fl1: |
1397 md.setflag(f, fl1) | 1400 md.setflag(f, fl1) |
1398 return md | 1401 return md |
1399 | 1402 |
1400 def readfast(self): | 1403 def readfast(self): |
1401 rl = self._revlog | 1404 rl = self._revlog() |
1402 r = rl.rev(self._node) | 1405 r = rl.rev(self._node) |
1403 deltaparent = rl.deltaparent(r) | 1406 deltaparent = rl.deltaparent(r) |
1404 if deltaparent != revlog.nullrev and deltaparent in rl.parentrevs(r): | 1407 if deltaparent != revlog.nullrev and deltaparent in rl.parentrevs(r): |
1405 return self.readdelta() | 1408 return self.readdelta() |
1406 return self.read() | 1409 return self.read() |