mercurial/manifest.py
changeset 39314 7f5e6d3e9032
parent 39246 61700d525a3b
child 39315 57c3864f3aad
equal deleted inserted replaced
39313:6f38284b23f4 39314:7f5e6d3e9032
  1244         if clear_persisted_data:
  1244         if clear_persisted_data:
  1245             self._dirty = True
  1245             self._dirty = True
  1246             self.write()
  1246             self.write()
  1247         self._read = False
  1247         self._read = False
  1248 
  1248 
  1249 class manifestrevlog(revlog.revlog):
  1249 @interfaceutil.implementer(repository.imanifeststorage)
       
  1250 class manifestrevlog(object):
  1250     '''A revlog that stores manifest texts. This is responsible for caching the
  1251     '''A revlog that stores manifest texts. This is responsible for caching the
  1251     full-text manifest contents.
  1252     full-text manifest contents.
  1252     '''
  1253     '''
  1253     def __init__(self, opener, tree='', dirlogcache=None, indexfile=None,
  1254     def __init__(self, opener, tree='', dirlogcache=None, indexfile=None,
  1254                  treemanifest=False):
  1255                  treemanifest=False):
  1289         if tree:
  1290         if tree:
  1290             self._dirlogcache = dirlogcache
  1291             self._dirlogcache = dirlogcache
  1291         else:
  1292         else:
  1292             self._dirlogcache = {'': self}
  1293             self._dirlogcache = {'': self}
  1293 
  1294 
  1294         super(manifestrevlog, self).__init__(opener, indexfile,
  1295         self._revlog = revlog.revlog(opener, indexfile,
  1295                                              # only root indexfile is cached
  1296                                      # only root indexfile is cached
  1296                                              checkambig=not bool(tree),
  1297                                      checkambig=not bool(tree),
  1297                                              mmaplargeindex=True)
  1298                                      mmaplargeindex=True)
       
  1299 
       
  1300         self.index = self._revlog.index
       
  1301         self.version = self._revlog.version
       
  1302         self._generaldelta = self._revlog._generaldelta
  1298 
  1303 
  1299     def _setupmanifestcachehooks(self, repo):
  1304     def _setupmanifestcachehooks(self, repo):
  1300         """Persist the manifestfulltextcache on lock release"""
  1305         """Persist the manifestfulltextcache on lock release"""
  1301         if not util.safehasattr(repo, '_lockref'):
  1306         if not util.safehasattr(repo, '_lockref'):
  1302             return
  1307             return
  1321     @property
  1326     @property
  1322     def fulltextcache(self):
  1327     def fulltextcache(self):
  1323         return self._fulltextcache
  1328         return self._fulltextcache
  1324 
  1329 
  1325     def clearcaches(self, clear_persisted_data=False):
  1330     def clearcaches(self, clear_persisted_data=False):
  1326         super(manifestrevlog, self).clearcaches()
  1331         self._revlog.clearcaches()
  1327         self._fulltextcache.clear(clear_persisted_data=clear_persisted_data)
  1332         self._fulltextcache.clear(clear_persisted_data=clear_persisted_data)
  1328         self._dirlogcache = {self._tree: self}
  1333         self._dirlogcache = {self._tree: self}
  1329 
  1334 
  1330     def dirlog(self, d):
  1335     def dirlog(self, d):
  1331         if d:
  1336         if d:
  1348             # combine the changed lists into one sorted iterator
  1353             # combine the changed lists into one sorted iterator
  1349             work = heapq.merge([(x, False) for x in added],
  1354             work = heapq.merge([(x, False) for x in added],
  1350                                [(x, True) for x in removed])
  1355                                [(x, True) for x in removed])
  1351 
  1356 
  1352             arraytext, deltatext = m.fastdelta(self.fulltextcache[p1], work)
  1357             arraytext, deltatext = m.fastdelta(self.fulltextcache[p1], work)
  1353             cachedelta = self.rev(p1), deltatext
  1358             cachedelta = self._revlog.rev(p1), deltatext
  1354             text = util.buffer(arraytext)
  1359             text = util.buffer(arraytext)
  1355             n = self.addrevision(text, transaction, link, p1, p2, cachedelta)
  1360             n = self._revlog.addrevision(text, transaction, link, p1, p2,
       
  1361                                          cachedelta)
  1356         else:
  1362         else:
  1357             # The first parent manifest isn't already loaded, so we'll
  1363             # The first parent manifest isn't already loaded, so we'll
  1358             # just encode a fulltext of the manifest and pass that
  1364             # just encode a fulltext of the manifest and pass that
  1359             # through to the revlog layer, and let it handle the delta
  1365             # through to the revlog layer, and let it handle the delta
  1360             # process.
  1366             # process.
  1364                 m2 = readtree(self._tree, p2)
  1370                 m2 = readtree(self._tree, p2)
  1365                 n = self._addtree(m, transaction, link, m1, m2, readtree)
  1371                 n = self._addtree(m, transaction, link, m1, m2, readtree)
  1366                 arraytext = None
  1372                 arraytext = None
  1367             else:
  1373             else:
  1368                 text = m.text()
  1374                 text = m.text()
  1369                 n = self.addrevision(text, transaction, link, p1, p2)
  1375                 n = self._revlog.addrevision(text, transaction, link, p1, p2)
  1370                 arraytext = bytearray(text)
  1376                 arraytext = bytearray(text)
  1371 
  1377 
  1372         if arraytext is not None:
  1378         if arraytext is not None:
  1373             self.fulltextcache[n] = arraytext
  1379             self.fulltextcache[n] = arraytext
  1374 
  1380 
  1393                 n = m1.node()
  1399                 n = m1.node()
  1394             elif text == m2.dirtext():
  1400             elif text == m2.dirtext():
  1395                 n = m2.node()
  1401                 n = m2.node()
  1396 
  1402 
  1397         if not n:
  1403         if not n:
  1398             n = self.addrevision(text, transaction, link, m1.node(), m2.node())
  1404             n = self._revlog.addrevision(text, transaction, link, m1.node(),
       
  1405                                          m2.node())
  1399 
  1406 
  1400         # Save nodeid so parent manifest can calculate its nodeid
  1407         # Save nodeid so parent manifest can calculate its nodeid
  1401         m.setnode(n)
  1408         m.setnode(n)
  1402         return n
  1409         return n
       
  1410 
       
  1411     def __len__(self):
       
  1412         return len(self._revlog)
       
  1413 
       
  1414     def __iter__(self):
       
  1415         return self._revlog.__iter__()
       
  1416 
       
  1417     def rev(self, node):
       
  1418         return self._revlog.rev(node)
       
  1419 
       
  1420     def node(self, rev):
       
  1421         return self._revlog.node(rev)
       
  1422 
       
  1423     def lookup(self, value):
       
  1424         return self._revlog.lookup(value)
       
  1425 
       
  1426     def parentrevs(self, rev):
       
  1427         return self._revlog.parentrevs(rev)
       
  1428 
       
  1429     def parents(self, node):
       
  1430         return self._revlog.parents(node)
       
  1431 
       
  1432     def linkrev(self, rev):
       
  1433         return self._revlog.linkrev(rev)
       
  1434 
       
  1435     def checksize(self):
       
  1436         return self._revlog.checksize()
       
  1437 
       
  1438     def revision(self, node, _df=None, raw=False):
       
  1439         return self._revlog.revision(node, _df=_df, raw=raw)
       
  1440 
       
  1441     def revdiff(self, rev1, rev2):
       
  1442         return self._revlog.revdiff(rev1, rev2)
       
  1443 
       
  1444     def cmp(self, node, text):
       
  1445         return self._revlog.cmp(node, text)
       
  1446 
       
  1447     def deltaparent(self, rev):
       
  1448         return self._revlog.deltaparent(rev)
       
  1449 
       
  1450     def emitrevisiondeltas(self, requests):
       
  1451         return self._revlog.emitrevisiondeltas(requests)
       
  1452 
       
  1453     def addgroup(self, deltas, linkmapper, transaction, addrevisioncb=None):
       
  1454         return self._revlog.addgroup(deltas, linkmapper, transaction,
       
  1455                                      addrevisioncb=addrevisioncb)
       
  1456 
       
  1457     def getstrippoint(self, minlink):
       
  1458         return self._revlog.getstrippoint(minlink)
       
  1459 
       
  1460     def strip(self, minlink, transaction):
       
  1461         return self._revlog.strip(minlink, transaction)
       
  1462 
       
  1463     def files(self):
       
  1464         return self._revlog.files()
       
  1465 
       
  1466     def clone(self, tr, destrevlog, **kwargs):
       
  1467         if not isinstance(destrevlog, manifestrevlog):
       
  1468             raise error.ProgrammingError('expected manifestrevlog to clone()')
       
  1469 
       
  1470         return self._revlog.clone(tr, destrevlog._revlog, **kwargs)
       
  1471 
       
  1472     @property
       
  1473     def indexfile(self):
       
  1474         return self._revlog.indexfile
       
  1475 
       
  1476     @indexfile.setter
       
  1477     def indexfile(self, value):
       
  1478         self._revlog.indexfile = value
       
  1479 
       
  1480     @property
       
  1481     def opener(self):
       
  1482         return self._revlog.opener
       
  1483 
       
  1484     @opener.setter
       
  1485     def opener(self, value):
       
  1486         self._revlog.opener = value
  1403 
  1487 
  1404 @interfaceutil.implementer(repository.imanifestlog)
  1488 @interfaceutil.implementer(repository.imanifestlog)
  1405 class manifestlog(object):
  1489 class manifestlog(object):
  1406     """A collection class representing the collection of manifest snapshots
  1490     """A collection class representing the collection of manifest snapshots
  1407     referenced by commits in the repository.
  1491     referenced by commits in the repository.