mercurial/revlog.py
changeset 47148 a07d5cb03a85
parent 47145 c6b8d5d91e73
child 47149 396442cd7e6a
equal deleted inserted replaced
47147:8a1a51d31e85 47148:a07d5cb03a85
   321             datafile = indexfile[:-2] + b".d"
   321             datafile = indexfile[:-2] + b".d"
   322             if postfix is not None:
   322             if postfix is not None:
   323                 datafile = b'%s.%s' % (datafile, postfix)
   323                 datafile = b'%s.%s' % (datafile, postfix)
   324         if postfix is not None:
   324         if postfix is not None:
   325             indexfile = b'%s.%s' % (indexfile, postfix)
   325             indexfile = b'%s.%s' % (indexfile, postfix)
   326         self.indexfile = indexfile
   326         self._indexfile = indexfile
   327         self.datafile = datafile
   327         self.datafile = datafile
   328         self.nodemap_file = None
   328         self.nodemap_file = None
   329         self.postfix = postfix
   329         self.postfix = postfix
   330         if persistentnodemap:
   330         if persistentnodemap:
   331             self.nodemap_file = nodemaputil.get_nodemap_file(
   331             self.nodemap_file = nodemaputil.get_nodemap_file(
   332                 opener, self.indexfile
   332                 opener, self._indexfile
   333             )
   333             )
   334 
   334 
   335         self.opener = opener
   335         self.opener = opener
   336         assert target[0] in ALL_KINDS
   336         assert target[0] in ALL_KINDS
   337         assert len(target) == 2
   337         assert len(target) == 2
   488 
   488 
   489         if fmt == REVLOGV0:
   489         if fmt == REVLOGV0:
   490             if flags:
   490             if flags:
   491                 raise error.RevlogError(
   491                 raise error.RevlogError(
   492                     _(b'unknown flags (%#04x) in version %d revlog %s')
   492                     _(b'unknown flags (%#04x) in version %d revlog %s')
   493                     % (flags >> 16, fmt, self.indexfile)
   493                     % (flags >> 16, fmt, self._indexfile)
   494                 )
   494                 )
   495 
   495 
   496             self._inline = False
   496             self._inline = False
   497             self._generaldelta = False
   497             self._generaldelta = False
   498 
   498 
   499         elif fmt == REVLOGV1:
   499         elif fmt == REVLOGV1:
   500             if flags & ~REVLOGV1_FLAGS:
   500             if flags & ~REVLOGV1_FLAGS:
   501                 raise error.RevlogError(
   501                 raise error.RevlogError(
   502                     _(b'unknown flags (%#04x) in version %d revlog %s')
   502                     _(b'unknown flags (%#04x) in version %d revlog %s')
   503                     % (flags >> 16, fmt, self.indexfile)
   503                     % (flags >> 16, fmt, self._indexfile)
   504                 )
   504                 )
   505 
   505 
   506             self._inline = versionflags & FLAG_INLINE_DATA
   506             self._inline = versionflags & FLAG_INLINE_DATA
   507             self._generaldelta = versionflags & FLAG_GENERALDELTA
   507             self._generaldelta = versionflags & FLAG_GENERALDELTA
   508 
   508 
   509         elif fmt == REVLOGV2:
   509         elif fmt == REVLOGV2:
   510             if flags & ~REVLOGV2_FLAGS:
   510             if flags & ~REVLOGV2_FLAGS:
   511                 raise error.RevlogError(
   511                 raise error.RevlogError(
   512                     _(b'unknown flags (%#04x) in version %d revlog %s')
   512                     _(b'unknown flags (%#04x) in version %d revlog %s')
   513                     % (flags >> 16, fmt, self.indexfile)
   513                     % (flags >> 16, fmt, self._indexfile)
   514                 )
   514                 )
   515 
   515 
   516             # There is a bug in the transaction handling when going from an
   516             # There is a bug in the transaction handling when going from an
   517             # inline revlog to a separate index and data file. Turn it off until
   517             # inline revlog to a separate index and data file. Turn it off until
   518             # it's fixed, since v2 revlogs sometimes get rewritten on exchange.
   518             # it's fixed, since v2 revlogs sometimes get rewritten on exchange.
   521             # generaldelta implied by version 2 revlogs.
   521             # generaldelta implied by version 2 revlogs.
   522             self._generaldelta = True
   522             self._generaldelta = True
   523 
   523 
   524         else:
   524         else:
   525             raise error.RevlogError(
   525             raise error.RevlogError(
   526                 _(b'unknown version (%d) in revlog %s') % (fmt, self.indexfile)
   526                 _(b'unknown version (%d) in revlog %s') % (fmt, self._indexfile)
   527             )
   527             )
   528 
   528 
   529         self.nodeconstants = sha1nodeconstants
   529         self.nodeconstants = sha1nodeconstants
   530         self.nullid = self.nodeconstants.nullid
   530         self.nullid = self.nodeconstants.nullid
   531 
   531 
   576                         # no changelog tampering
   576                         # no changelog tampering
   577                         self._nodemap_docket = docket
   577                         self._nodemap_docket = docket
   578                         index.update_nodemap_data(*nodemap_data)
   578                         index.update_nodemap_data(*nodemap_data)
   579         except (ValueError, IndexError):
   579         except (ValueError, IndexError):
   580             raise error.RevlogError(
   580             raise error.RevlogError(
   581                 _(b"index %s is corrupted") % self.indexfile
   581                 _(b"index %s is corrupted") % self._indexfile
   582             )
   582             )
   583         self.index, self._chunkcache = d
   583         self.index, self._chunkcache = d
   584         if not self._chunkcache:
   584         if not self._chunkcache:
   585             self._chunkclear()
   585             self._chunkclear()
   586         # revnum -> (chain-length, sum-delta-length)
   586         # revnum -> (chain-length, sum-delta-length)
   602         args = {'mode': mode}
   602         args = {'mode': mode}
   603         if mode != b'r':
   603         if mode != b'r':
   604             args['checkambig'] = self._checkambig
   604             args['checkambig'] = self._checkambig
   605         if mode == b'w':
   605         if mode == b'w':
   606             args['atomictemp'] = True
   606             args['atomictemp'] = True
   607         return self.opener(self.indexfile, **args)
   607         return self.opener(self._indexfile, **args)
   608 
   608 
   609     def _datafp(self, mode=b'r'):
   609     def _datafp(self, mode=b'r'):
   610         """file object for the revlog's data file"""
   610         """file object for the revlog's data file"""
   611         return self.opener(self.datafile, mode=mode)
   611         return self.opener(self.datafile, mode=mode)
   612 
   612 
   727             if (
   727             if (
   728                 node == self.nodeconstants.wdirid
   728                 node == self.nodeconstants.wdirid
   729                 or node in self.nodeconstants.wdirfilenodeids
   729                 or node in self.nodeconstants.wdirfilenodeids
   730             ):
   730             ):
   731                 raise error.WdirUnsupported
   731                 raise error.WdirUnsupported
   732             raise error.LookupError(node, self.indexfile, _(b'no node'))
   732             raise error.LookupError(node, self._indexfile, _(b'no node'))
   733 
   733 
   734     # Accessors for index entries.
   734     # Accessors for index entries.
   735 
   735 
   736     # First tuple entry is 8 bytes. First 6 bytes are offset. Last 2 bytes
   736     # First tuple entry is 8 bytes. First 6 bytes are offset. Last 2 bytes
   737     # are flags.
   737     # are flags.
  1391         except error.RevlogError:
  1391         except error.RevlogError:
  1392             # parsers.c radix tree lookup gave multiple matches
  1392             # parsers.c radix tree lookup gave multiple matches
  1393             # fast path: for unfiltered changelog, radix tree is accurate
  1393             # fast path: for unfiltered changelog, radix tree is accurate
  1394             if not getattr(self, 'filteredrevs', None):
  1394             if not getattr(self, 'filteredrevs', None):
  1395                 raise error.AmbiguousPrefixLookupError(
  1395                 raise error.AmbiguousPrefixLookupError(
  1396                     id, self.indexfile, _(b'ambiguous identifier')
  1396                     id, self._indexfile, _(b'ambiguous identifier')
  1397                 )
  1397                 )
  1398             # fall through to slow path that filters hidden revisions
  1398             # fall through to slow path that filters hidden revisions
  1399         except (AttributeError, ValueError):
  1399         except (AttributeError, ValueError):
  1400             # we are pure python, or key was too short to search radix tree
  1400             # we are pure python, or key was too short to search radix tree
  1401             pass
  1401             pass
  1417                 if len(nl) > 0:
  1417                 if len(nl) > 0:
  1418                     if len(nl) == 1 and not maybewdir:
  1418                     if len(nl) == 1 and not maybewdir:
  1419                         self._pcache[id] = nl[0]
  1419                         self._pcache[id] = nl[0]
  1420                         return nl[0]
  1420                         return nl[0]
  1421                     raise error.AmbiguousPrefixLookupError(
  1421                     raise error.AmbiguousPrefixLookupError(
  1422                         id, self.indexfile, _(b'ambiguous identifier')
  1422                         id, self._indexfile, _(b'ambiguous identifier')
  1423                     )
  1423                     )
  1424                 if maybewdir:
  1424                 if maybewdir:
  1425                     raise error.WdirUnsupported
  1425                     raise error.WdirUnsupported
  1426                 return None
  1426                 return None
  1427             except TypeError:
  1427             except TypeError:
  1437             return n
  1437             return n
  1438         n = self._partialmatch(id)
  1438         n = self._partialmatch(id)
  1439         if n:
  1439         if n:
  1440             return n
  1440             return n
  1441 
  1441 
  1442         raise error.LookupError(id, self.indexfile, _(b'no match found'))
  1442         raise error.LookupError(id, self._indexfile, _(b'no match found'))
  1443 
  1443 
  1444     def shortest(self, node, minlength=1):
  1444     def shortest(self, node, minlength=1):
  1445         """Find the shortest unambiguous prefix that matches node."""
  1445         """Find the shortest unambiguous prefix that matches node."""
  1446 
  1446 
  1447         def isvalid(prefix):
  1447         def isvalid(prefix):
  1451                 return False
  1451                 return False
  1452             except error.WdirUnsupported:
  1452             except error.WdirUnsupported:
  1453                 # single 'ff...' match
  1453                 # single 'ff...' match
  1454                 return True
  1454                 return True
  1455             if matchednode is None:
  1455             if matchednode is None:
  1456                 raise error.LookupError(node, self.indexfile, _(b'no node'))
  1456                 raise error.LookupError(node, self._indexfile, _(b'no node'))
  1457             return True
  1457             return True
  1458 
  1458 
  1459         def maybewdir(prefix):
  1459         def maybewdir(prefix):
  1460             return all(c == b'f' for c in pycompat.iterbytestr(prefix))
  1460             return all(c == b'f' for c in pycompat.iterbytestr(prefix))
  1461 
  1461 
  1472             try:
  1472             try:
  1473                 length = max(self.index.shortest(node), minlength)
  1473                 length = max(self.index.shortest(node), minlength)
  1474                 return disambiguate(hexnode, length)
  1474                 return disambiguate(hexnode, length)
  1475             except error.RevlogError:
  1475             except error.RevlogError:
  1476                 if node != self.nodeconstants.wdirid:
  1476                 if node != self.nodeconstants.wdirid:
  1477                     raise error.LookupError(node, self.indexfile, _(b'no node'))
  1477                     raise error.LookupError(
       
  1478                         node, self._indexfile, _(b'no node')
       
  1479                     )
  1478             except AttributeError:
  1480             except AttributeError:
  1479                 # Fall through to pure code
  1481                 # Fall through to pure code
  1480                 pass
  1482                 pass
  1481 
  1483 
  1482         if node == self.nodeconstants.wdirid:
  1484         if node == self.nodeconstants.wdirid:
  1543                     _(
  1545                     _(
  1544                         b'partial read of revlog %s; expected %d bytes from '
  1546                         b'partial read of revlog %s; expected %d bytes from '
  1545                         b'offset %d, got %d'
  1547                         b'offset %d, got %d'
  1546                     )
  1548                     )
  1547                     % (
  1549                     % (
  1548                         self.indexfile if self._inline else self.datafile,
  1550                         self._indexfile if self._inline else self.datafile,
  1549                         length,
  1551                         length,
  1550                         realoffset,
  1552                         realoffset,
  1551                         len(d) - startoffset,
  1553                         len(d) - startoffset,
  1552                     )
  1554                     )
  1553                 )
  1555                 )
  1559                 _(
  1561                 _(
  1560                     b'partial read of revlog %s; expected %d bytes from offset '
  1562                     b'partial read of revlog %s; expected %d bytes from offset '
  1561                     b'%d, got %d'
  1563                     b'%d, got %d'
  1562                 )
  1564                 )
  1563                 % (
  1565                 % (
  1564                     self.indexfile if self._inline else self.datafile,
  1566                     self._indexfile if self._inline else self.datafile,
  1565                     length,
  1567                     length,
  1566                     offset,
  1568                     offset,
  1567                     len(d),
  1569                     len(d),
  1568                 )
  1570                 )
  1569             )
  1571             )
  1930                 revornode = rev
  1932                 revornode = rev
  1931                 if revornode is None:
  1933                 if revornode is None:
  1932                     revornode = templatefilters.short(hex(node))
  1934                     revornode = templatefilters.short(hex(node))
  1933                 raise error.RevlogError(
  1935                 raise error.RevlogError(
  1934                     _(b"integrity check failed on %s:%s")
  1936                     _(b"integrity check failed on %s:%s")
  1935                     % (self.indexfile, pycompat.bytestr(revornode))
  1937                     % (self._indexfile, pycompat.bytestr(revornode))
  1936                 )
  1938                 )
  1937         except error.RevlogError:
  1939         except error.RevlogError:
  1938             if self._censorable and storageutil.iscensoredtext(text):
  1940             if self._censorable and storageutil.iscensoredtext(text):
  1939                 raise error.CensoredNodeError(self.indexfile, node, text)
  1941                 raise error.CensoredNodeError(self._indexfile, node, text)
  1940             raise
  1942             raise
  1941 
  1943 
  1942     def _enforceinlinesize(self, tr, fp=None):
  1944     def _enforceinlinesize(self, tr, fp=None):
  1943         """Check if the revlog is too big for inline and convert if so.
  1945         """Check if the revlog is too big for inline and convert if so.
  1944 
  1946 
  1951             not self._inline
  1953             not self._inline
  1952             or (self.start(tiprev) + self.length(tiprev)) < _maxinline
  1954             or (self.start(tiprev) + self.length(tiprev)) < _maxinline
  1953         ):
  1955         ):
  1954             return
  1956             return
  1955 
  1957 
  1956         troffset = tr.findoffset(self.indexfile)
  1958         troffset = tr.findoffset(self._indexfile)
  1957         if troffset is None:
  1959         if troffset is None:
  1958             raise error.RevlogError(
  1960             raise error.RevlogError(
  1959                 _(b"%s not found in the transaction") % self.indexfile
  1961                 _(b"%s not found in the transaction") % self._indexfile
  1960             )
  1962             )
  1961         trindex = 0
  1963         trindex = 0
  1962         tr.add(self.datafile, 0)
  1964         tr.add(self.datafile, 0)
  1963 
  1965 
  1964         if fp:
  1966         if fp:
  1986                 fp.write(e)
  1988                 fp.write(e)
  1987 
  1989 
  1988             # the temp file replace the real index when we exit the context
  1990             # the temp file replace the real index when we exit the context
  1989             # manager
  1991             # manager
  1990 
  1992 
  1991         tr.replace(self.indexfile, trindex * self.index.entry_size)
  1993         tr.replace(self._indexfile, trindex * self.index.entry_size)
  1992         nodemaputil.setup_persistent_nodemap(tr, self)
  1994         nodemaputil.setup_persistent_nodemap(tr, self)
  1993         self._chunkclear()
  1995         self._chunkclear()
  1994 
  1996 
  1995     def _nodeduplicatecallback(self, transaction, node):
  1997     def _nodeduplicatecallback(self, transaction, node):
  1996         """called when trying to add a node already stored."""
  1998         """called when trying to add a node already stored."""
  2022         deltacomputer - an optional deltacomputer instance shared between
  2024         deltacomputer - an optional deltacomputer instance shared between
  2023             multiple calls
  2025             multiple calls
  2024         """
  2026         """
  2025         if link == nullrev:
  2027         if link == nullrev:
  2026             raise error.RevlogError(
  2028             raise error.RevlogError(
  2027                 _(b"attempted to add linkrev -1 to %s") % self.indexfile
  2029                 _(b"attempted to add linkrev -1 to %s") % self._indexfile
  2028             )
  2030             )
  2029 
  2031 
  2030         if sidedata is None:
  2032         if sidedata is None:
  2031             sidedata = {}
  2033             sidedata = {}
  2032         elif sidedata and not self.hassidedata:
  2034         elif sidedata and not self.hassidedata:
  2047         if len(rawtext) > _maxentrysize:
  2049         if len(rawtext) > _maxentrysize:
  2048             raise error.RevlogError(
  2050             raise error.RevlogError(
  2049                 _(
  2051                 _(
  2050                     b"%s: size of %d bytes exceeds maximum revlog storage of 2GiB"
  2052                     b"%s: size of %d bytes exceeds maximum revlog storage of 2GiB"
  2051                 )
  2053                 )
  2052                 % (self.indexfile, len(rawtext))
  2054                 % (self._indexfile, len(rawtext))
  2053             )
  2055             )
  2054 
  2056 
  2055         node = node or self.hash(rawtext, p1, p2)
  2057         node = node or self.hash(rawtext, p1, p2)
  2056         rev = self.index.get_rev(node)
  2058         rev = self.index.get_rev(node)
  2057         if rev is not None:
  2059         if rev is not None:
  2218         - rawtext is optional (can be None); if not set, cachedelta must be set.
  2220         - rawtext is optional (can be None); if not set, cachedelta must be set.
  2219           if both are set, they must correspond to each other.
  2221           if both are set, they must correspond to each other.
  2220         """
  2222         """
  2221         if node == self.nullid:
  2223         if node == self.nullid:
  2222             raise error.RevlogError(
  2224             raise error.RevlogError(
  2223                 _(b"%s: attempt to add null revision") % self.indexfile
  2225                 _(b"%s: attempt to add null revision") % self._indexfile
  2224             )
  2226             )
  2225         if (
  2227         if (
  2226             node == self.nodeconstants.wdirid
  2228             node == self.nodeconstants.wdirid
  2227             or node in self.nodeconstants.wdirfilenodeids
  2229             or node in self.nodeconstants.wdirfilenodeids
  2228         ):
  2230         ):
  2229             raise error.RevlogError(
  2231             raise error.RevlogError(
  2230                 _(b"%s: attempt to add wdir revision") % self.indexfile
  2232                 _(b"%s: attempt to add wdir revision") % self._indexfile
  2231             )
  2233             )
  2232 
  2234 
  2233         if self._inline:
  2235         if self._inline:
  2234             fh = ifh
  2236             fh = ifh
  2235         else:
  2237         else:
  2245         if self._concurrencychecker:
  2247         if self._concurrencychecker:
  2246             if self._inline:
  2248             if self._inline:
  2247                 # offset is "as if" it were in the .d file, so we need to add on
  2249                 # offset is "as if" it were in the .d file, so we need to add on
  2248                 # the size of the entry metadata.
  2250                 # the size of the entry metadata.
  2249                 self._concurrencychecker(
  2251                 self._concurrencychecker(
  2250                     ifh, self.indexfile, offset + curr * self.index.entry_size
  2252                     ifh, self._indexfile, offset + curr * self.index.entry_size
  2251                 )
  2253                 )
  2252             else:
  2254             else:
  2253                 # Entries in the .i are a consistent size.
  2255                 # Entries in the .i are a consistent size.
  2254                 self._concurrencychecker(
  2256                 self._concurrencychecker(
  2255                     ifh, self.indexfile, curr * self.index.entry_size
  2257                     ifh, self._indexfile, curr * self.index.entry_size
  2256                 )
  2258                 )
  2257                 self._concurrencychecker(dfh, self.datafile, offset)
  2259                 self._concurrencychecker(dfh, self.datafile, offset)
  2258 
  2260 
  2259         p1r, p2r = self.rev(p1), self.rev(p2)
  2261         p1r, p2r = self.rev(p1), self.rev(p2)
  2260 
  2262 
  2367             dfh.seek(0, os.SEEK_END)
  2369             dfh.seek(0, os.SEEK_END)
  2368 
  2370 
  2369         curr = len(self) - 1
  2371         curr = len(self) - 1
  2370         if not self._inline:
  2372         if not self._inline:
  2371             transaction.add(self.datafile, offset)
  2373             transaction.add(self.datafile, offset)
  2372             transaction.add(self.indexfile, curr * len(entry))
  2374             transaction.add(self._indexfile, curr * len(entry))
  2373             if data[0]:
  2375             if data[0]:
  2374                 dfh.write(data[0])
  2376                 dfh.write(data[0])
  2375             dfh.write(data[1])
  2377             dfh.write(data[1])
  2376             if sidedata:
  2378             if sidedata:
  2377                 dfh.write(sidedata)
  2379                 dfh.write(sidedata)
  2378             ifh.write(entry)
  2380             ifh.write(entry)
  2379         else:
  2381         else:
  2380             offset += curr * self.index.entry_size
  2382             offset += curr * self.index.entry_size
  2381             transaction.add(self.indexfile, offset)
  2383             transaction.add(self._indexfile, offset)
  2382             ifh.write(entry)
  2384             ifh.write(entry)
  2383             ifh.write(data[0])
  2385             ifh.write(data[0])
  2384             ifh.write(data[1])
  2386             ifh.write(data[1])
  2385             if sidedata:
  2387             if sidedata:
  2386                 ifh.write(sidedata)
  2388                 ifh.write(sidedata)
  2415         if r:
  2417         if r:
  2416             end = self.end(r - 1)
  2418             end = self.end(r - 1)
  2417         ifh = self._indexfp(b"a+")
  2419         ifh = self._indexfp(b"a+")
  2418         isize = r * self.index.entry_size
  2420         isize = r * self.index.entry_size
  2419         if self._inline:
  2421         if self._inline:
  2420             transaction.add(self.indexfile, end + isize)
  2422             transaction.add(self._indexfile, end + isize)
  2421             dfh = None
  2423             dfh = None
  2422         else:
  2424         else:
  2423             transaction.add(self.indexfile, isize)
  2425             transaction.add(self._indexfile, isize)
  2424             transaction.add(self.datafile, end)
  2426             transaction.add(self.datafile, end)
  2425             dfh = self._datafp(b"a+")
  2427             dfh = self._datafp(b"a+")
  2426 
  2428 
  2427         def flush():
  2429         def flush():
  2428             if dfh:
  2430             if dfh:
  2450                     continue
  2452                     continue
  2451 
  2453 
  2452                 for p in (p1, p2):
  2454                 for p in (p1, p2):
  2453                     if not self.index.has_node(p):
  2455                     if not self.index.has_node(p):
  2454                         raise error.LookupError(
  2456                         raise error.LookupError(
  2455                             p, self.indexfile, _(b'unknown parent')
  2457                             p, self._indexfile, _(b'unknown parent')
  2456                         )
  2458                         )
  2457 
  2459 
  2458                 if not self.index.has_node(deltabase):
  2460                 if not self.index.has_node(deltabase):
  2459                     raise error.LookupError(
  2461                     raise error.LookupError(
  2460                         deltabase, self.indexfile, _(b'unknown delta base')
  2462                         deltabase, self._indexfile, _(b'unknown delta base')
  2461                     )
  2463                     )
  2462 
  2464 
  2463                 baserev = self.rev(deltabase)
  2465                 baserev = self.rev(deltabase)
  2464 
  2466 
  2465                 if baserev != nullrev and self.iscensored(baserev):
  2467                 if baserev != nullrev and self.iscensored(baserev):
  2468                     hlen = struct.calcsize(b">lll")
  2470                     hlen = struct.calcsize(b">lll")
  2469                     oldlen = self.rawsize(baserev)
  2471                     oldlen = self.rawsize(baserev)
  2470                     newlen = len(delta) - hlen
  2472                     newlen = len(delta) - hlen
  2471                     if delta[:hlen] != mdiff.replacediffheader(oldlen, newlen):
  2473                     if delta[:hlen] != mdiff.replacediffheader(oldlen, newlen):
  2472                         raise error.CensoredBaseError(
  2474                         raise error.CensoredBaseError(
  2473                             self.indexfile, self.node(baserev)
  2475                             self._indexfile, self.node(baserev)
  2474                         )
  2476                         )
  2475 
  2477 
  2476                 if not flags and self._peek_iscensored(baserev, delta, flush):
  2478                 if not flags and self._peek_iscensored(baserev, delta, flush):
  2477                     flags |= REVIDX_ISCENSORED
  2479                     flags |= REVIDX_ISCENSORED
  2478 
  2480 
  2573             transaction.add(self.datafile, end)
  2575             transaction.add(self.datafile, end)
  2574             end = rev * self.index.entry_size
  2576             end = rev * self.index.entry_size
  2575         else:
  2577         else:
  2576             end += rev * self.index.entry_size
  2578             end += rev * self.index.entry_size
  2577 
  2579 
  2578         transaction.add(self.indexfile, end)
  2580         transaction.add(self._indexfile, end)
  2579 
  2581 
  2580         # then reset internal state in memory to forget those revisions
  2582         # then reset internal state in memory to forget those revisions
  2581         self._revisioncache = None
  2583         self._revisioncache = None
  2582         self._chaininfocache = util.lrucachedict(500)
  2584         self._chaininfocache = util.lrucachedict(500)
  2583         self._chunkclear()
  2585         self._chunkclear()
  2606             if inst.errno != errno.ENOENT:
  2608             if inst.errno != errno.ENOENT:
  2607                 raise
  2609                 raise
  2608             dd = 0
  2610             dd = 0
  2609 
  2611 
  2610         try:
  2612         try:
  2611             f = self.opener(self.indexfile)
  2613             f = self.opener(self._indexfile)
  2612             f.seek(0, io.SEEK_END)
  2614             f.seek(0, io.SEEK_END)
  2613             actual = f.tell()
  2615             actual = f.tell()
  2614             f.close()
  2616             f.close()
  2615             s = self.index.entry_size
  2617             s = self.index.entry_size
  2616             i = max(0, actual // s)
  2618             i = max(0, actual // s)
  2627             di = 0
  2629             di = 0
  2628 
  2630 
  2629         return (dd, di)
  2631         return (dd, di)
  2630 
  2632 
  2631     def files(self):
  2633     def files(self):
  2632         res = [self.indexfile]
  2634         res = [self._indexfile]
  2633         if not self._inline:
  2635         if not self._inline:
  2634             res.append(self.datafile)
  2636             res.append(self.datafile)
  2635         return res
  2637         return res
  2636 
  2638 
  2637     def emitrevisions(
  2639     def emitrevisions(
  2845                         self, sidedata_helpers, sidedata, rev
  2847                         self, sidedata_helpers, sidedata, rev
  2846                     )
  2848                     )
  2847                     flags = flags | new_flags[0] & ~new_flags[1]
  2849                     flags = flags | new_flags[0] & ~new_flags[1]
  2848 
  2850 
  2849                 ifh = destrevlog.opener(
  2851                 ifh = destrevlog.opener(
  2850                     destrevlog.indexfile, b'a+', checkambig=False
  2852                     destrevlog._indexfile, b'a+', checkambig=False
  2851                 )
  2853                 )
  2852                 dfh = None
  2854                 dfh = None
  2853                 if not destrevlog._inline:
  2855                 if not destrevlog._inline:
  2854                     dfh = destrevlog.opener(destrevlog.datafile, b'a+')
  2856                     dfh = destrevlog.opener(destrevlog.datafile, b'a+')
  2855                 try:
  2857                 try:
  2897         # This is a bit dangerous. We could easily have a mismatch of state.
  2899         # This is a bit dangerous. We could easily have a mismatch of state.
  2898         newrl = revlog(
  2900         newrl = revlog(
  2899             self.opener,
  2901             self.opener,
  2900             target=self.target,
  2902             target=self.target,
  2901             postfix=b'tmpcensored',
  2903             postfix=b'tmpcensored',
  2902             indexfile=self.indexfile,
  2904             indexfile=self._indexfile,
  2903             censorable=True,
  2905             censorable=True,
  2904         )
  2906         )
  2905         newrl._format_version = self._format_version
  2907         newrl._format_version = self._format_version
  2906         newrl._format_flags = self._format_flags
  2908         newrl._format_flags = self._format_flags
  2907         newrl._generaldelta = self._generaldelta
  2909         newrl._generaldelta = self._generaldelta
  2950 
  2952 
  2951             newrl.addrawrevision(
  2953             newrl.addrawrevision(
  2952                 rawtext, tr, self.linkrev(rev), p1, p2, node, self.flags(rev)
  2954                 rawtext, tr, self.linkrev(rev), p1, p2, node, self.flags(rev)
  2953             )
  2955             )
  2954 
  2956 
  2955         tr.addbackup(self.indexfile, location=b'store')
  2957         tr.addbackup(self._indexfile, location=b'store')
  2956         if not self._inline:
  2958         if not self._inline:
  2957             tr.addbackup(self.datafile, location=b'store')
  2959             tr.addbackup(self.datafile, location=b'store')
  2958 
  2960 
  2959         self.opener.rename(newrl.indexfile, self.indexfile)
  2961         self.opener.rename(newrl._indexfile, self._indexfile)
  2960         if not self._inline:
  2962         if not self._inline:
  2961             self.opener.rename(newrl.datafile, self.datafile)
  2963             self.opener.rename(newrl.datafile, self.datafile)
  2962 
  2964 
  2963         self.clearcaches()
  2965         self.clearcaches()
  2964         self._loadindex()
  2966         self._loadindex()
  2979 
  2981 
  2980         # The verifier tells us what version revlog we should be.
  2982         # The verifier tells us what version revlog we should be.
  2981         if version != state[b'expectedversion']:
  2983         if version != state[b'expectedversion']:
  2982             yield revlogproblem(
  2984             yield revlogproblem(
  2983                 warning=_(b"warning: '%s' uses revlog format %d; expected %d")
  2985                 warning=_(b"warning: '%s' uses revlog format %d; expected %d")
  2984                 % (self.indexfile, version, state[b'expectedversion'])
  2986                 % (self._indexfile, version, state[b'expectedversion'])
  2985             )
  2987             )
  2986 
  2988 
  2987         state[b'skipread'] = set()
  2989         state[b'skipread'] = set()
  2988         state[b'safe_renamed'] = set()
  2990         state[b'safe_renamed'] = set()
  2989 
  2991 
  3077         storedsize=False,
  3079         storedsize=False,
  3078     ):
  3080     ):
  3079         d = {}
  3081         d = {}
  3080 
  3082 
  3081         if exclusivefiles:
  3083         if exclusivefiles:
  3082             d[b'exclusivefiles'] = [(self.opener, self.indexfile)]
  3084             d[b'exclusivefiles'] = [(self.opener, self._indexfile)]
  3083             if not self._inline:
  3085             if not self._inline:
  3084                 d[b'exclusivefiles'].append((self.opener, self.datafile))
  3086                 d[b'exclusivefiles'].append((self.opener, self.datafile))
  3085 
  3087 
  3086         if sharedfiles:
  3088         if sharedfiles:
  3087             d[b'sharedfiles'] = []
  3089             d[b'sharedfiles'] = []