changeset 31756:2133437dad17

revlog: fix _cache usage in revision() As documented at revlog.__init__, revlog._cache stores raw text. The current read and write usage of "_cache" in revlog.revision lacks of raw=True check. This patch fixes that by adding check about raw, and storing rawtext explicitly in _cache. Note: it may slow down cache hit code path when raw=False and flags=0. That performance issue will be fixed in a later patch. test-revlog-raw now points us to a new problem.
author Jun Wu <quark@fb.com>
date Thu, 30 Mar 2017 15:34:08 -0700
parents f319981c24c9
children f424fb180fea
files mercurial/revlog.py tests/test-revlog-raw.py.out
diffstat 2 files changed, 5 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlog.py	Thu Mar 30 14:56:09 2017 -0700
+++ b/mercurial/revlog.py	Thu Mar 30 15:34:08 2017 -0700
@@ -1267,7 +1267,9 @@
             return ""
         if self._cache:
             if self._cache[0] == node:
-                return self._cache[2]
+                # _cache only stores rawtext
+                if raw:
+                    return self._cache[2]
             cachedrev = self._cache[1]
 
         # look up what we need to read
@@ -1294,7 +1296,7 @@
         if validatehash:
             self.checkhash(text, node, rev=rev)
 
-        self._cache = (node, rev, text)
+        self._cache = (node, rev, rawtext)
         return text
 
     def hash(self, text, p1, p2):
--- a/tests/test-revlog-raw.py.out	Thu Mar 30 14:56:09 2017 -0700
+++ b/tests/test-revlog-raw.py.out	Thu Mar 30 15:34:08 2017 -0700
@@ -1,1 +1,1 @@
-abort: rev 5: wrong text
+abort: crashed: integrity check failed on _testrevlog.i:11