largefiles: move protocol conversion into getlfile and make it an iterable
Avoid the intermediate limitreader and filechunkiter between getlfile and
copyandhash - return the right protocol and put the complexity where it better
can be managed.
--- a/hgext/largefiles/proto.py Mon Apr 15 23:47:04 2013 +0200
+++ b/hgext/largefiles/proto.py Tue Apr 16 01:46:39 2013 +0200
@@ -114,6 +114,7 @@
_('putlfile failed (unexpected response):'), ret)
def getlfile(self, sha):
+ """returns an iterable with the chunks of the file with sha sha"""
stream = self._callstream("getlfile", sha=sha)
length = stream.readline()
try:
@@ -121,7 +122,12 @@
except ValueError:
self._abort(error.ResponseError(_("unexpected response:"),
length))
- return (length, stream)
+
+ # Mercurial doesn't close SSH connections after writing a stream
+ infile = lfutil.limitreader(stream, length)
+ for chunk in util.filechunkiter(infile, 128 * 1024):
+ yield chunk
+ infile.close()
@batchable
def statlfile(self, sha):
--- a/hgext/largefiles/remotestore.py Mon Apr 15 23:47:04 2013 +0200
+++ b/hgext/largefiles/remotestore.py Tue Apr 16 01:46:39 2013 +0200
@@ -58,7 +58,7 @@
'statlfile (%r)' % stat)
try:
- length, infile = self._get(hash)
+ chunks = self._get(hash)
except urllib2.HTTPError, e:
# 401s get converted to util.Aborts; everything else is fine being
# turned into a StoreError
@@ -71,14 +71,7 @@
except IOError, e:
raise basestore.StoreError(filename, hash, self.url, str(e))
- # Mercurial does not close its SSH connections after writing a stream
- if length is not None:
- infile = lfutil.limitreader(infile, length)
- try:
- return lfutil.copyandhash(util.filechunkiter(infile, 128 * 1024),
- tmpfile)
- finally:
- infile.close()
+ return lfutil.copyandhash(chunks, tmpfile)
def _verifyfile(self, cctx, cset, contents, standin, verified):
filename = lfutil.splitstandin(standin)