Mercurial > hg
view contrib/debugcmdserver.py @ 25185:bf6b476f3b36
treemanifest: cache directory logs and manifests
Since manifests instances are cached on the manifest log instance, we
can cache directory manifests by caching the directory manifest
logs. The directory manifest log cache is a plain dict, so it never
expires; we assume that we can keep all the directories in memory.
The cache is kept on the root manifestlog, so access to directory
manifest logs now has to go through the root manifest log.
The caching will soon not be only an optimization. When we start
lazily loading directory manifests, we need to make sure we don't
create multiple instances of the log objects. The caching takes care
of that problem.
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Fri, 10 Apr 2015 23:12:33 -0700 |
parents | e34106fa0dc3 |
children | cd03fbd5ab57 |
line wrap: on
line source
#!/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' import sys, struct 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()