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()