From patchwork Sun Dec 24 18:47:10 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D1754: streamclone: move wire protocol status code from wireproto command From: phabricator X-Patchwork-Id: 26428 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Sun, 24 Dec 2017 18:47:10 +0000 indygreg created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers. REVISION SUMMARY This consolidates the code for the streaming clone wire protocol format into streamclone.py. It also eliminates a generator wrapper, which might make streaming clones slightly faster. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D1754 AFFECTED FILES mercurial/streamclone.py mercurial/wireproto.py CHANGE DETAILS To: indygreg, #hg-reviewers Cc: mercurial-devel diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py --- a/mercurial/wireproto.py +++ b/mercurial/wireproto.py @@ -954,21 +954,7 @@ capability with a value representing the version and flags of the repo it is serving. Client checks to see if it understands the format. ''' - if not streamclone.allowservergeneration(repo): - return '1\n' - - def getstream(it): - yield '0\n' - for chunk in it: - yield chunk - - try: - # LockError may be raised before the first result is yielded. Don't - # emit output until we're sure we got the lock successfully. - it = streamclone.generatev1wireproto(repo) - return streamres(gen=getstream(it)) - except error.LockError: - return '2\n' + return streamres(streamclone.generatev1wireproto(repo)) @wireprotocommand('unbundle', 'heads') def unbundle(repo, proto, heads): diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py --- a/mercurial/streamclone.py +++ b/mercurial/streamclone.py @@ -235,10 +235,26 @@ def generatev1wireproto(repo): """Emit content for version 1 of streaming clone suitable for the wire. - This is the data output from ``generatev1()`` with a header line - indicating file count and byte size. + This is the data output from ``generatev1()`` with 2 header lines. The + first line indicates overall success. The 2nd contains the file count and + byte size of payload. + + The success line contains "0" for success, "1" for stream generation not + allowed, and "2" for error locking the repository (possibly indicating + a permissions error for the server process). """ - filecount, bytecount, it = generatev1(repo) + if not allowservergeneration(repo): + yield '1\n' + return + + try: + filecount, bytecount, it = generatev1(repo) + except error.LockError: + yield '2\n' + return + + # Indicates successful response. + yield '0\n' yield '%d %d\n' % (filecount, bytecount) for chunk in it: yield chunk