##// END OF EJS Templates
revlog: add a _datareadfp context manager for data access needs...
Boris Feld -
r35991:4d66993b default
parent child Browse files
Show More
@@ -15,6 +15,7 b' from __future__ import absolute_import'
15 15
16 16 import binascii
17 17 import collections
18 import contextlib
18 19 import errno
19 20 import hashlib
20 21 import heapq
@@ -694,6 +695,19 b' class revlog(object):'
694 695 """file object for the revlog's data file"""
695 696 return self.opener(self.datafile, mode=mode)
696 697
698 @contextlib.contextmanager
699 def _datareadfp(self, existingfp=None):
700 """file object suitable to read data"""
701 if existingfp is not None:
702 yield existingfp
703 else:
704 if self._inline:
705 func = self._indexfp
706 else:
707 func = self._datafp
708 with func() as fp:
709 yield fp
710
697 711 def tip(self):
698 712 return self.node(len(self.index) - 2)
699 713 def __contains__(self, rev):
@@ -1502,15 +1516,6 b' class revlog(object):'
1502 1516
1503 1517 Returns a str or buffer of raw byte data.
1504 1518 """
1505 if df is not None:
1506 closehandle = False
1507 else:
1508 if self._inline:
1509 df = self._indexfp()
1510 else:
1511 df = self._datafp()
1512 closehandle = True
1513
1514 1519 # Cache data both forward and backward around the requested
1515 1520 # data, in a fixed size window. This helps speed up operations
1516 1521 # involving reading the revlog backwards.
@@ -1518,10 +1523,9 b' class revlog(object):'
1518 1523 realoffset = offset & ~(cachesize - 1)
1519 1524 reallength = (((offset + length + cachesize) & ~(cachesize - 1))
1520 1525 - realoffset)
1526 with self._datareadfp(df) as df:
1521 1527 df.seek(realoffset)
1522 1528 d = df.read(reallength)
1523 if closehandle:
1524 df.close()
1525 1529 self._cachesegment(realoffset, d)
1526 1530 if offset != realoffset or reallength != length:
1527 1531 return util.buffer(d, offset - realoffset, length)
General Comments 0
You need to be logged in to leave comments. Login now