streamclone: move wire protocol status code from wireproto command
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.
Differential Revision: https://phab.mercurial-scm.org/D1754
--- a/mercurial/streamclone.py Fri Dec 22 15:25:34 2017 -0600
+++ b/mercurial/streamclone.py Sun Dec 24 11:46:13 2017 -0700
@@ -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
--- a/mercurial/wireproto.py Fri Dec 22 15:25:34 2017 -0600
+++ b/mercurial/wireproto.py Sun Dec 24 11:46:13 2017 -0700
@@ -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):