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. |