Patchwork [07,of,13,sparse,V2] sparse: refactor sparsechecksum()

login
register
mail settings
Submitter Gregory Szorc
Date July 6, 2017, 7:36 p.m.
Message ID <c31af7dfe7370ade61a5.1499369793@ubuntu-vm-main>
Download mbox | patch
Permalink /patch/22036/
State Accepted
Headers show

Comments

Gregory Szorc - July 6, 2017, 7:36 p.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1498935399 25200
#      Sat Jul 01 11:56:39 2017 -0700
# Node ID c31af7dfe7370ade61a54c2c8191329083b7d7a2
# Parent  9d59302d25b9d53a8e72fbd110fb12d4aa52cf3f
sparse: refactor sparsechecksum()

This was relying on garbage collection to close the opened
file, which is a bug. Both callers simply called into self.vfs
to resolve the path. So refactor to use the vfs layer.

While we're here, rename the method to reflect it is internal
and to break anyone relying on the old behavior.

Patch

diff --git a/hgext/sparse.py b/hgext/sparse.py
--- a/hgext/sparse.py
+++ b/hgext/sparse.py
@@ -493,9 +493,9 @@  def _wraprepo(ui, repo):
             # resolve and can be slow.
             return self.filectx(profile, changeid=changeid).data()
 
-        def sparsechecksum(self, filepath):
-            fh = open(filepath)
-            return hashlib.sha1(fh.read()).hexdigest()
+        def _sparsechecksum(self, path):
+            data = self.vfs.read(path)
+            return hashlib.sha1(data).hexdigest()
 
         def _sparsesignature(self, includetemp=True):
             """Returns the signature string representing the contents of the
@@ -511,8 +511,7 @@  def _wraprepo(ui, repo):
             if signature is None or (includetemp and tempsignature is None):
                 signature = 0
                 try:
-                    sparsepath = self.vfs.join('sparse')
-                    signature = self.sparsechecksum(sparsepath)
+                    signature = self._sparsechecksum('sparse')
                 except (OSError, IOError):
                     pass
                 signaturecache['signature'] = signature
@@ -520,8 +519,7 @@  def _wraprepo(ui, repo):
                 tempsignature = 0
                 if includetemp:
                     try:
-                        tempsparsepath = self.vfs.join('tempsparse')
-                        tempsignature = self.sparsechecksum(tempsparsepath)
+                        tempsignature = self._sparsechecksum('tempsparse')
                     except (OSError, IOError):
                         pass
                     signaturecache['tempsignature'] = tempsignature