Comments
Patch
@@ -525,9 +525,10 @@ class _requesthandler(SocketServer.Strea
os.setpgid(0, 0)
ui = self.server.ui
repo = self.server.repo
- sv = chgcmdserver(ui, repo, self.rfile, self.wfile, self.connection,
- self.server.hashstate, self.server.baseaddress)
+ sv = None
try:
+ sv = chgcmdserver(ui, repo, self.rfile, self.wfile, self.connection,
+ self.server.hashstate, self.server.baseaddress)
try:
sv.serve()
# handle exceptions that may be raised by command server. most of
@@ -544,7 +545,11 @@ class _requesthandler(SocketServer.Strea
except: # re-raises
# also write traceback to error channel. otherwise client cannot
# see it because it is written to server's stderr by default.
- traceback.print_exc(file=sv.cerr)
+ if sv:
+ cerr = sv.cerr
+ else:
+ cerr = commandserver.channeledoutput(self.wfile, 'e')
+ traceback.print_exc(file=cerr)
raise
def _tempaddress(address):
@@ -338,8 +338,9 @@ class _requesthandler(SocketServer.Strea
def handle(self):
ui = self.server.ui
repo = self.server.repo
- sv = server(ui, repo, self.rfile, self.wfile)
+ sv = None
try:
+ sv = server(ui, repo, self.rfile, self.wfile)
try:
sv.serve()
# handle exceptions that may be raised by command server. most of
@@ -354,7 +355,11 @@ class _requesthandler(SocketServer.Strea
except: # re-raises
# also write traceback to error channel. otherwise client cannot
# see it because it is written to server's stderr by default.
- traceback.print_exc(file=sv.cerr)
+ if sv:
+ cerr = sv.cerr
+ else:
+ cerr = channeledoutput(self.wfile, 'e')
+ traceback.print_exc(file=cerr)
raise
class unixservice(object):
@@ -717,6 +717,35 @@ unix domain socket:
listening at .hg/server.sock
abort: unknown command unknowncommand
killed!
+ $ rm .hg/server.log
+
+ if server crashed before hello, traceback will be sent to 'e' channel as
+ last ditch:
+
+ $ cat <<EOF >> .hg/hgrc
+ > [cmdserver]
+ > log = inexistent/path.log
+ > EOF
+ >>> from hgclient import unixserver, readchannel, check
+ >>> server = unixserver('.hg/server.sock', '.hg/server.log')
+ >>> def earlycrash(conn):
+ ... while True:
+ ... try:
+ ... ch, data = readchannel(conn)
+ ... if not data.startswith(' '):
+ ... print '%c, %r' % (ch, data)
+ ... except EOFError:
+ ... break
+ >>> check(earlycrash, server.connect)
+ e, 'Traceback (most recent call last):\n'
+ e, "IOError: *" (glob)
+ >>> server.shutdown()
+
+ $ cat .hg/server.log | grep -v '^ '
+ listening at .hg/server.sock
+ Traceback (most recent call last):
+ IOError: * (glob)
+ killed!
#endif
#if no-unix-socket