Patchwork revlog: merge hash checking subfunctions

login
register
mail settings
Submitter Remi Chaintron
Date Dec. 13, 2016, 2:25 p.m.
Message ID <d34c04da52a8f2eb61b5.1481639150@iphonesleepsort.dhcp.thefacebook.com>
Download mbox | patch
Permalink /patch/17891/
State Accepted
Headers show

Comments

Remi Chaintron - Dec. 13, 2016, 2:25 p.m.
# HG changeset patch
# User Remi Chaintron <remi@fb.com>
# Date 1481638896 0
#      Tue Dec 13 14:21:36 2016 +0000
# Branch stable
# Node ID d34c04da52a8f2eb61b51bb0aa9cedf1e4b43474
# Parent  7817df5585db1d87d3f6c7f496085c86d87e2e9a
revlog: merge hash checking subfunctions

This patch factors the behavior of both methods into 'checkhash'.
Pierre-Yves David - Dec. 14, 2016, 2:26 a.m.
On 12/13/2016 03:25 PM, Remi Chaintron wrote:
> # HG changeset patch
> # User Remi Chaintron <remi@fb.com>
> # Date 1481638896 0
> #      Tue Dec 13 14:21:36 2016 +0000
> # Branch stable
> # Node ID d34c04da52a8f2eb61b51bb0aa9cedf1e4b43474
> # Parent  7817df5585db1d87d3f6c7f496085c86d87e2e9a
> revlog: merge hash checking subfunctions
>
> This patch factors the behavior of both methods into 'checkhash'.

Pushed, thanks.

Patch

diff --git a/contrib/perf.py b/contrib/perf.py
--- a/contrib/perf.py
+++ b/contrib/perf.py
@@ -861,7 +861,7 @@ 
     def dohash(text):
         if not cache:
             r.clearcaches()
-        r._checkhash(text, node, rev)
+        r.checkhash(text, node, rev=rev)
 
     def dorevision():
         if not cache:
diff --git a/mercurial/bundlerepo.py b/mercurial/bundlerepo.py
--- a/mercurial/bundlerepo.py
+++ b/mercurial/bundlerepo.py
@@ -147,7 +147,7 @@ 
             delta = self._chunk(chain.pop())
             text = mdiff.patches(text, [delta])
 
-        self._checkhash(text, node, rev)
+        self.checkhash(text, node, rev=rev)
         self._cache = (node, rev, text)
         return text
 
diff --git a/mercurial/filelog.py b/mercurial/filelog.py
--- a/mercurial/filelog.py
+++ b/mercurial/filelog.py
@@ -104,9 +104,9 @@ 
 
         return True
 
-    def checkhash(self, text, p1, p2, node, rev=None):
+    def checkhash(self, text, node, p1=None, p2=None, rev=None):
         try:
-            super(filelog, self).checkhash(text, p1, p2, node, rev=rev)
+            super(filelog, self).checkhash(text, node, p1=p1, p2=p2, rev=rev)
         except error.RevlogError:
             if _censoredtext(text):
                 raise error.CensoredNodeError(self.indexfile, node, text)
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -1221,9 +1221,7 @@ 
             bins = bins[1:]
 
         text = mdiff.patches(text, bins)
-
-        text = self._checkhash(text, node, rev)
-
+        self.checkhash(text, node, rev=rev)
         self._cache = (node, rev, text)
         return text
 
@@ -1235,12 +1233,14 @@ 
         """
         return hash(text, p1, p2)
 
-    def _checkhash(self, text, node, rev):
-        p1, p2 = self.parents(node)
-        self.checkhash(text, p1, p2, node, rev)
-        return text
+    def checkhash(self, text, node, p1=None, p2=None, rev=None):
+        """Check node hash integrity.
 
-    def checkhash(self, text, p1, p2, node, rev=None):
+        Available as a function so that subclasses can extend hash mismatch
+        behaviors as needed.
+        """
+        if p1 is None and p2 is None:
+            p1, p2 = self.parents(node)
         if node != self.hash(text, p1, p2):
             revornode = rev
             if revornode is None:
@@ -1415,7 +1415,7 @@ 
                 basetext = self.revision(self.node(baserev), _df=fh)
                 btext[0] = mdiff.patch(basetext, delta)
             try:
-                self.checkhash(btext[0], p1, p2, node)
+                self.checkhash(btext[0], node, p1=p1, p2=p2)
                 if flags & REVIDX_ISCENSORED:
                     raise RevlogError(_('node %s is not censored') % node)
             except CensoredNodeError: