contrib/debugcmdserver.py
author Matt Harbison <matt_harbison@yahoo.com>
Sun, 10 Dec 2017 22:45:35 -0500
changeset 35399 5feb782c7a95
parent 28353 cd03fbd5ab57
child 43076 2372284d9457
permissions -rwxr-xr-x
check-code: drop the rules for adding (glob) for Windows paths I'll probably resurrect at least some of these as replacement patterns to switch '\' to '/' when creating tests at some point. But since this subset of globs isn't needed anymore after dfae14354660, and the rules are blocking the glob removal, just drop them for now. It probably isn't worth turning them into checks for unnecessary globs being present.

#!/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()