# HG changeset patch # User Yuya Nishihara # Date 1416023015 -32400 # Node ID 000cfc8b3913b8eac263a9ff1aa6e4b7b5238d11 # Parent d716b1cec5cf08ad46d73130bcc170905d81c7e3 cmdserver: use given streams as pipe channels like other commands Because commandserver itself is an hg subcommand, it shouldn't use stdio directly in principle. diff -r d716b1cec5cf -r 000cfc8b3913 mercurial/commandserver.py --- a/mercurial/commandserver.py Fri Nov 14 16:38:58 2014 -0800 +++ b/mercurial/commandserver.py Sat Nov 15 12:43:35 2014 +0900 @@ -7,7 +7,7 @@ from i18n import _ import struct -import sys, os, errno, traceback, SocketServer +import os, errno, traceback, SocketServer import dispatch, encoding, util logfile = None @@ -250,7 +250,7 @@ class pipeservice(object): def __init__(self, ui, repo, opts): - self.server = server(ui, repo, sys.stdin, sys.stdout) + self.server = server(ui, repo, ui.fin, ui.fout) def init(self): pass diff -r d716b1cec5cf -r 000cfc8b3913 tests/test-commandserver.t --- a/tests/test-commandserver.t Fri Nov 14 16:38:58 2014 -0800 +++ b/tests/test-commandserver.t Sat Nov 15 12:43:35 2014 +0900 @@ -524,6 +524,27 @@ prompt: 5678 +run commandserver in commandserver, which is silly but should work: + + >>> import cStringIO + >>> from hgclient import readchannel, runcommand, check + >>> @check + ... def nested(server): + ... print '%c, %r' % readchannel(server) + ... class nestedserver(object): + ... stdin = cStringIO.StringIO('getencoding\n') + ... stdout = cStringIO.StringIO() + ... runcommand(server, ['serve', '--cmdserver', 'pipe'], + ... output=nestedserver.stdout, input=nestedserver.stdin) + ... nestedserver.stdout.seek(0) + ... print '%c, %r' % readchannel(nestedserver) # hello + ... print '%c, %r' % readchannel(nestedserver) # getencoding + o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) + *** runcommand serve --cmdserver pipe + o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) + r, '*' (glob) + + start without repository: $ cd ..