hgext/largefiles/remotestore.py
changeset 29218 fd288d118074
parent 29068 305f9c36a0f5
child 29313 0ccab84f9630
--- 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):