Mercurial > evolve
view docs/test2rst.py @ 5544:0bb75a6c29b1
rewind: add a --dry-run flag
There are 3 cases handled separately in formatstatus():
- common-case rewind when we have X current successors rewinding to Y
predecessors
- rewinding with --as-divergence, when we don't obsolete current successors
- rewinding pruned commits, when we don't have current successors to show
In the common case, we might have sub-cases that change the output with
--dry-run (but not the way the rewind operates):
- more predecessors than successors (e.g. after a fold), in which case we
simply use successorsmap, which maps successors to a set of predecessors
- equal number of predecessors and successors, see the previous case
- more successors than predecessors (e.g. after a split), in which case we
use a reverse of successorsmap (rsm), which maps predecessors to a set of
successors and exists only for the sake of --dry-run functionality
These two dicts allow us to group rewind targets and output separate lines for
separate predecessors<->successors relations.
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Tue, 21 Jul 2020 01:04:43 +0800 |
parents | 16c1398b0063 |
children | 60ce376919c5 |
line wrap: on
line source
#!/usr/bin/env python import re import os import os.path as op import sys INDEX = ''' Mercurial tests =============== .. toctree:: :maxdepth: 1 ''' ignored_patterns = [ re.compile(r'^#if'), re.compile(r'^#else'), re.compile(r'^#endif'), re.compile(r'#rest-ignore$'), ] def rstify(orig, name): newlines = [] code_block_mode = False sphinx_directive_mode = False for line in orig.splitlines(): # Emtpy lines doesn't change output if not line: newlines.append(line) code_block_mode = False sphinx_directive_mode = False continue ignored = False for pattern in ignored_patterns: if pattern.search(line): ignored = True break if ignored: continue # Sphinx directives mode if line.startswith(' .. '): # Insert a empty line to makes sphinx happy newlines.append("") # And unindent the directive line = line[2:] sphinx_directive_mode = True # Code mode codeline = line.startswith(' ') if codeline and not sphinx_directive_mode: if code_block_mode is False: newlines.extend(['::', '']) code_block_mode = True newlines.append(line) return "\n".join(newlines) def main(base): if os.path.isdir(base): one_dir(base) else: one_file(base) def one_dir(base): index = INDEX # doc = lambda x: op.join(op.dirname(__file__), 'docs', x) for fn in sorted(os.listdir(base)): if not fn.endswith('.t'): continue name = os.path.splitext(fn)[0] content = one_file(op.join(base, fn)) target = op.join(base, name + '.rst') # with file(doc(name + '.rst'), 'w') as f: with open(target, 'w') as f: f.write(content) index += '\n ' + name # with file(doc('index.rst'), 'w') as f: # f.write(index) def one_file(path): name = os.path.basename(path)[:-2] return rstify(open(path).read(), name) if __name__ == '__main__': if len(sys.argv) != 2: print('Please supply a path to tests dir as parameter') sys.exit() main(sys.argv[1])