diff hgext/largefiles/remotestore.py @ 29218:fd288d118074

largefiles: send statlfile remote calls only for nonexisting locally files Files that are already in local store should be checked locally. The problem with this implementation is how difference in messages between local and remote checks should look like. For now local errors for file missing and content corrupted looks like this: 'changeset cset: filename references missing storepath\n' 'changeset cset: filename references corrupted storepath\n' for remote it looks like: 'changeset cset: filename missing\n' 'changeset cset: filename: contents differ\n' Contents differ error for remote calls is never raised currently - for now statlfile implementation lacks checking file content.
author liscju <piotr.listkiewicz@gmail.com>
date Mon, 09 May 2016 10:05:32 +0200
parents 305f9c36a0f5
children 0ccab84f9630
line wrap: on
line diff
--- a/hgext/largefiles/remotestore.py	Mon May 16 21:18:59 2016 +0000
+++ b/hgext/largefiles/remotestore.py	Mon May 09 10:05:32 2016 +0200
@@ -14,11 +14,13 @@
 
 import lfutil
 import basestore
+import localstore
 
 class remotestore(basestore.basestore):
     '''a largefile store accessed over a network'''
     def __init__(self, ui, repo, url):
         super(remotestore, self).__init__(ui, repo, url)
+        self._lstore = localstore.localstore(self.ui, self.repo, self.repo)
 
     def put(self, source, hash):
         if self.sendfile(source, hash):
@@ -65,27 +67,42 @@
 
         return lfutil.copyandhash(chunks, tmpfile)
 
+    def _hashesavailablelocally(self, hashes):
+        existslocallymap = self._lstore.exists(hashes)
+        localhashes = [hash for hash in hashes if existslocallymap[hash]]
+        return localhashes
+
     def _verifyfiles(self, contents, filestocheck):
         failed = False
         expectedhashes = [expectedhash
                           for cset, filename, expectedhash in filestocheck]
-        stats = self._stat(expectedhashes)
+        localhashes = self._hashesavailablelocally(expectedhashes)
+        stats = self._stat([expectedhash for expectedhash in expectedhashes
+                            if expectedhash not in localhashes])
+
         for cset, filename, expectedhash in filestocheck:
-            stat = stats[expectedhash]
-            if stat:
-                if stat == 1:
-                    self.ui.warn(
-                        _('changeset %s: %s: contents differ\n')
-                        % (cset, filename))
+            if expectedhash in localhashes:
+                filetocheck = (cset, filename, expectedhash)
+                verifyresult = self._lstore._verifyfiles(contents,
+                                                         [filetocheck])
+                if verifyresult:
                     failed = True
-                elif stat == 2:
-                    self.ui.warn(
-                        _('changeset %s: %s missing\n')
-                        % (cset, filename))
-                    failed = True
-                else:
-                    raise RuntimeError('verify failed: unexpected response '
-                                       'from statlfile (%r)' % stat)
+            else:
+                stat = stats[expectedhash]
+                if stat:
+                    if stat == 1:
+                        self.ui.warn(
+                            _('changeset %s: %s: contents differ\n')
+                            % (cset, filename))
+                        failed = True
+                    elif stat == 2:
+                        self.ui.warn(
+                            _('changeset %s: %s missing\n')
+                            % (cset, filename))
+                        failed = True
+                    else:
+                        raise RuntimeError('verify failed: unexpected response '
+                                           'from statlfile (%r)' % stat)
         return failed
 
     def batch(self):