diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -1659,6 +1659,15 @@ if p1 is None and p2 is None: p1, p2 = self.parents(node) if node != self.hash(text, p1, p2): + # Clear the revision cache on hash failure. The revision cache + # only stores the raw revision and clearing the cache does have + # the side-effect that we won't have a cache hit when the raw + # revision data is accessed. But this case should be rare and + # it is extra work to teach the cache about the hash + # verification state. + if self._revisioncache and self._revisioncache[0] == node: + self._revisioncache = None + revornode = rev if revornode is None: revornode = templatefilters.short(hex(node)) diff --git a/mercurial/testing/storage.py b/mercurial/testing/storage.py --- a/mercurial/testing/storage.py +++ b/mercurial/testing/storage.py @@ -881,13 +881,14 @@ with self.assertRaises(error.StorageError): f.revision(node1) - # revision(raw=True) still verifies hashes. - # TODO this is buggy because of cache interaction. - self.assertEqual(f.revision(node1, raw=True), fulltext1) + # raw=True still verifies because there are no special storage + # settings. + with self.assertRaises(error.StorageError): + f.revision(node1, raw=True) # read() behaves like revision(). - # TODO this is buggy because of cache interaction. - f.read(node1) + with self.assertRaises(error.StorageError): + f.read(node1) # We can't test renamed() here because some backends may not require # reading/validating the fulltext to return rename metadata. @@ -931,8 +932,8 @@ with self.assertRaises(error.StorageError): f.read(node1) - # TODO this should raise error.StorageError. - f.read(node1) + with self.assertRaises(error.StorageError): + f.read(node1) def testbadnodedelta(self): f = self._makefilefn() @@ -986,7 +987,8 @@ with self.assertRaises(error.CensoredNodeError): f.revision(1) - self.assertEqual(f.revision(1, raw=True), stored1) + with self.assertRaises(error.CensoredNodeError): + f.revision(1, raw=True) with self.assertRaises(error.CensoredNodeError): f.read(1)