debugcmdserver.py
50 lines
| 1.2 KiB
| text/x-python
|
PythonLexer
/ contrib / debugcmdserver.py
Gregory Szorc
|
r46434 | #!/usr/bin/env python3 | ||
Idan Kamara
|
r15259 | # | ||
# 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' | ||||
Pulkit Goyal
|
r28353 | import struct | ||
import sys | ||||
Idan Kamara
|
r15259 | |||
if len(sys.argv) != 2: | ||||
Pulkit Goyal
|
r28353 | print('usage: debugcmdserver.py FILE') | ||
Idan Kamara
|
r15259 | sys.exit(1) | ||
outputfmt = '>cI' | ||||
outputfmtsize = struct.calcsize(outputfmt) | ||||
if sys.argv[1] == '-': | ||||
log = sys.stderr | ||||
else: | ||||
log = open(sys.argv[1], 'a') | ||||
Augie Fackler
|
r43346 | |||
Idan Kamara
|
r15259 | def read(size): | ||
data = sys.stdin.read(size) | ||||
if not data: | ||||
Brodie Rao
|
r16687 | raise EOFError | ||
Idan Kamara
|
r15259 | sys.stdout.write(data) | ||
sys.stdout.flush() | ||||
return data | ||||
Augie Fackler
|
r43346 | |||
Idan Kamara
|
r15259 | 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() | ||||