largefiles: always use filechunkiter when iterating files
Before, we would sometimes use the default iterator over large files. That
iterator is line based and would add extra buffering and use odd chunk sizes
which could give some overhead.
copyandhash can't just apply a filechunkiter as it sometimes is passed a
genuine generator when downloading remotely.
--- a/hgext/largefiles/lfutil.py Fri Oct 14 23:33:00 2016 +0900
+++ b/hgext/largefiles/lfutil.py Wed Oct 12 12:22:18 2016 +0200
@@ -231,7 +231,8 @@
# don't use atomic writes in the working copy.
with open(path, 'rb') as srcfd:
with wvfs(filename, 'wb') as destfd:
- gothash = copyandhash(srcfd, destfd)
+ gothash = copyandhash(
+ util.filechunkiter(srcfd), destfd)
if gothash != hash:
repo.ui.warn(_('%s: data corruption in %s with hash %s\n')
% (filename, path, gothash))
--- a/hgext/largefiles/localstore.py Fri Oct 14 23:33:00 2016 +0900
+++ b/hgext/largefiles/localstore.py Wed Oct 12 12:22:18 2016 +0200
@@ -10,6 +10,7 @@
from __future__ import absolute_import
from mercurial.i18n import _
+from mercurial import util
from . import (
basestore,
@@ -42,7 +43,8 @@
raise basestore.StoreError(filename, hash, self.url,
_("can't get file locally"))
with open(path, 'rb') as fd:
- return lfutil.copyandhash(fd, tmpfile)
+ return lfutil.copyandhash(
+ util.filechunkiter(fd), tmpfile)
def _verifyfiles(self, contents, filestocheck):
failed = False
--- a/hgext/largefiles/remotestore.py Fri Oct 14 23:33:00 2016 +0900
+++ b/hgext/largefiles/remotestore.py Wed Oct 12 12:22:18 2016 +0200
@@ -118,7 +118,7 @@
raise NotImplementedError('abstract method')
def _get(self, hash):
- '''Get file with the given hash from the remote store.'''
+ '''Get a iterator for content with the given hash.'''
raise NotImplementedError('abstract method')
def _stat(self, hashes):