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