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])