streamclone: move wire protocol status code from wireproto command
authorGregory Szorc <gregory.szorc@gmail.com>
Sun, 24 Dec 2017 11:46:13 -0700
changeset 35491 ded3a63f305b
parent 35490 784a85c87c22
child 35492 3ad582b2895c
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
mercurial/streamclone.py
mercurial/wireproto.py
--- 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):