contrib/debugcmdserver.py
author Augie Fackler <augie@google.com>
Fri, 13 Oct 2017 15:58:54 -0400
changeset 34707 6cd8d8203204
parent 28353 cd03fbd5ab57
child 43076 2372284d9457
permissions -rwxr-xr-x
tweakdefaults: make commands.update.check be `noconflict` This is the second-safest option we have to offer in `updatecheck`, with `abort` being the safest and `linear` being the default. At the sprint we discussed how much `none` and `linear` make us all uncomfortable, and how we'd like to move the default behavior if we can. I'm not sure we can get away with actually changing the out of the box default behavior, but we can at *least* do this. Differential Revision: https://phab.mercurial-scm.org/D1062

#!/usr/bin/env python
#
# Dumps output generated by Mercurial's command server in a formatted style to a
# given file or stderr if '-' is specified. Output is also written in its raw
# format to stdout.
#
# $ ./hg serve --cmds pipe | ./contrib/debugcmdserver.py -
# o, 52   -> 'capabilities: getencoding runcommand\nencoding: UTF-8'

from __future__ import absolute_import, print_function
import struct
import sys

if len(sys.argv) != 2:
    print('usage: debugcmdserver.py FILE')
    sys.exit(1)

outputfmt = '>cI'
outputfmtsize = struct.calcsize(outputfmt)

if sys.argv[1] == '-':
    log = sys.stderr
else:
    log = open(sys.argv[1], 'a')

def read(size):
    data = sys.stdin.read(size)
    if not data:
        raise EOFError
    sys.stdout.write(data)
    sys.stdout.flush()
    return data

try:
    while True:
        header = read(outputfmtsize)
        channel, length = struct.unpack(outputfmt, header)
        log.write('%s, %-4d' % (channel, length))
        if channel in 'IL':
            log.write(' -> waiting for input\n')
        else:
            data = read(length)
            log.write(' -> %r\n' % data)
        log.flush()
except EOFError:
    pass
finally:
    if log != sys.stderr:
        log.close()