Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 35968:91b3b11565e5
revlog: move index file opening in a method
Having file operation centralized into a single spot help to factor common
logic out (eg: special flag handling according to the mode).
It is also the first step to simplify file handling during batch operation
(eg: revlog cloning). However, that part does not seems to be a hotspot yet.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Mon, 05 Feb 2018 17:22:13 +0100 |
parents | 61326dd7cb8d |
children | 1f2b8a644dd4 |
comparison
equal
deleted
inserted
replaced
35967:61326dd7cb8d | 35968:91b3b11565e5 |
---|---|
619 'of 2') % self._chunkcachesize) | 619 'of 2') % self._chunkcachesize) |
620 | 620 |
621 indexdata = '' | 621 indexdata = '' |
622 self._initempty = True | 622 self._initempty = True |
623 try: | 623 try: |
624 f = self.opener(self.indexfile) | 624 f = self._indexfp() |
625 if (mmapindexthreshold is not None and | 625 if (mmapindexthreshold is not None and |
626 self.opener.fstat(f).st_size >= mmapindexthreshold): | 626 self.opener.fstat(f).st_size >= mmapindexthreshold): |
627 indexdata = util.buffer(util.mmapread(f)) | 627 indexdata = util.buffer(util.mmapread(f)) |
628 else: | 628 else: |
629 indexdata = f.read() | 629 indexdata = f.read() |
679 self._decompressors = {} | 679 self._decompressors = {} |
680 | 680 |
681 @util.propertycache | 681 @util.propertycache |
682 def _compressor(self): | 682 def _compressor(self): |
683 return util.compengines[self._compengine].revlogcompressor() | 683 return util.compengines[self._compengine].revlogcompressor() |
684 | |
685 def _indexfp(self, mode='r'): | |
686 """file object for the revlog's index file""" | |
687 args = {r'mode': mode} | |
688 if mode != 'r': | |
689 args[r'checkambig'] = self._checkambig | |
690 if mode == 'w': | |
691 args[r'atomictemp'] = True | |
692 return self.opener(self.indexfile, **args) | |
684 | 693 |
685 def _datafp(self, mode='r'): | 694 def _datafp(self, mode='r'): |
686 """file object for the revlog's data file""" | 695 """file object for the revlog's data file""" |
687 return self.opener(self.datafile, mode=mode) | 696 return self.opener(self.datafile, mode=mode) |
688 | 697 |
1496 """ | 1505 """ |
1497 if df is not None: | 1506 if df is not None: |
1498 closehandle = False | 1507 closehandle = False |
1499 else: | 1508 else: |
1500 if self._inline: | 1509 if self._inline: |
1501 df = self.opener(self.indexfile) | 1510 df = self._indexfp() |
1502 else: | 1511 else: |
1503 df = self._datafp() | 1512 df = self._datafp() |
1504 closehandle = True | 1513 closehandle = True |
1505 | 1514 |
1506 # Cache data both forward and backward around the requested | 1515 # Cache data both forward and backward around the requested |
1856 for r in self: | 1865 for r in self: |
1857 df.write(self._getsegmentforrevs(r, r)[1]) | 1866 df.write(self._getsegmentforrevs(r, r)[1]) |
1858 finally: | 1867 finally: |
1859 df.close() | 1868 df.close() |
1860 | 1869 |
1861 fp = self.opener(self.indexfile, 'w', atomictemp=True, | 1870 fp = self._indexfp('w') |
1862 checkambig=self._checkambig) | |
1863 self.version &= ~FLAG_INLINE_DATA | 1871 self.version &= ~FLAG_INLINE_DATA |
1864 self._inline = False | 1872 self._inline = False |
1865 for i in self: | 1873 for i in self: |
1866 e = self._io.packentry(self.index[i], self.node, self.version, i) | 1874 e = self._io.packentry(self.index[i], self.node, self.version, i) |
1867 fp.write(e) | 1875 fp.write(e) |
1926 over wire, or read from an external bundle). | 1934 over wire, or read from an external bundle). |
1927 """ | 1935 """ |
1928 dfh = None | 1936 dfh = None |
1929 if not self._inline: | 1937 if not self._inline: |
1930 dfh = self._datafp("a+") | 1938 dfh = self._datafp("a+") |
1931 ifh = self.opener(self.indexfile, "a+", checkambig=self._checkambig) | 1939 ifh = self._indexfp("a+") |
1932 try: | 1940 try: |
1933 return self._addrevision(node, rawtext, transaction, link, p1, p2, | 1941 return self._addrevision(node, rawtext, transaction, link, p1, p2, |
1934 flags, cachedelta, ifh, dfh, | 1942 flags, cachedelta, ifh, dfh, |
1935 deltacomputer=deltacomputer) | 1943 deltacomputer=deltacomputer) |
1936 finally: | 1944 finally: |
2155 | 2163 |
2156 r = len(self) | 2164 r = len(self) |
2157 end = 0 | 2165 end = 0 |
2158 if r: | 2166 if r: |
2159 end = self.end(r - 1) | 2167 end = self.end(r - 1) |
2160 ifh = self.opener(self.indexfile, "a+", checkambig=self._checkambig) | 2168 ifh = self._indexfp("a+") |
2161 isize = r * self._io.size | 2169 isize = r * self._io.size |
2162 if self._inline: | 2170 if self._inline: |
2163 transaction.add(self.indexfile, end + isize, r) | 2171 transaction.add(self.indexfile, end + isize, r) |
2164 dfh = None | 2172 dfh = None |
2165 else: | 2173 else: |
2227 if not dfh and not self._inline: | 2235 if not dfh and not self._inline: |
2228 # addrevision switched from inline to conventional | 2236 # addrevision switched from inline to conventional |
2229 # reopen the index | 2237 # reopen the index |
2230 ifh.close() | 2238 ifh.close() |
2231 dfh = self._datafp("a+") | 2239 dfh = self._datafp("a+") |
2232 ifh = self.opener(self.indexfile, "a+", | 2240 ifh = self._indexfp("a+") |
2233 checkambig=self._checkambig) | |
2234 finally: | 2241 finally: |
2235 if dfh: | 2242 if dfh: |
2236 dfh.close() | 2243 dfh.close() |
2237 ifh.close() | 2244 ifh.close() |
2238 | 2245 |