# HG changeset patch # User Dirkjan Ochtman # Date 2008-06-29 12:20:01 # Node ID b9d6ab1875231120c01fe804178aa2798e114d44 # Parent b4b7261164d5755b83ca281ddefbda91a959d36d streamclone yields chunks instead of accepting a file-like object diff --git a/mercurial/hgweb/protocol.py b/mercurial/hgweb/protocol.py --- a/mercurial/hgweb/protocol.py +++ b/mercurial/hgweb/protocol.py @@ -205,4 +205,5 @@ def unbundle(repo, req): def stream_out(repo, req): req.respond(HTTP_OK, HGTYPE) - streamclone.stream_out(repo, req, untrusted=True) + for chunk in streamclone.stream_out(repo, untrusted=True): + req.write(chunk) diff --git a/mercurial/sshserver.py b/mercurial/sshserver.py --- a/mercurial/sshserver.py +++ b/mercurial/sshserver.py @@ -204,4 +204,6 @@ class sshserver(object): os.unlink(tempname) def do_stream_out(self): - streamclone.stream_out(self.repo, self.fout) + for chunk in streamclone.stream_out(self.repo): + self.fout.write(chunk) + self.fout.flush() diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py --- a/mercurial/streamclone.py +++ b/mercurial/streamclone.py @@ -51,12 +51,12 @@ def walkrepo(root): # # server writes out raw file data. -def stream_out(repo, fileobj, untrusted=False): +def stream_out(repo, untrusted=False): '''stream out all metadata files in repository. writes to file-like object, must support write() and optional flush().''' if not repo.ui.configbool('server', 'uncompressed', untrusted=untrusted): - fileobj.write('1\n') + yield '1\n' return # get consistent snapshot of repo. lock during scan so lock not @@ -67,10 +67,10 @@ def stream_out(repo, fileobj, untrusted= repolock = repo.lock() except (lock.LockHeld, lock.LockUnavailable), inst: repo.ui.warn('locking the repository failed: %s\n' % (inst,)) - fileobj.write('2\n') + yield '2\n' return - fileobj.write('0\n') + yield '0\n' repo.ui.debug('scanning\n') entries = [] total_bytes = 0 @@ -83,11 +83,9 @@ def stream_out(repo, fileobj, untrusted= repo.ui.debug('%d files, %d bytes to transfer\n' % (len(entries), total_bytes)) - fileobj.write('%d %d\n' % (len(entries), total_bytes)) + yield '%d %d\n' % (len(entries), total_bytes) for name, size in entries: repo.ui.debug('sending %s (%d bytes)\n' % (name, size)) - fileobj.write('%s\0%d\n' % (name, size)) + yield '%s\0%d\n' % (name, size) for chunk in util.filechunkiter(repo.sopener(name), limit=size): - fileobj.write(chunk) - flush = getattr(fileobj, 'flush', None) - if flush: flush() + yield chunk