view docs/test2rst.py @ 6889:a66cf9008781

obslog: also display patch for rebased changesets This applies the same logic that is used for "merge-diff" to rebased changesets. The successors' content is compared to the content of the predecessors rebased in-memory on the new parents. This highlights the changes that were actually introduced while rebasing (like conflict resolution or API adjustment). As a side effect, obslog now also outputs slightly more diffs for splits, showing what parts of the original big changeset were moved to the smaller split components (but for now it only works for the first few changesets).
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sun, 22 Sep 2024 02:58:54 +0200
parents 1d80cda7fe93
children
line wrap: on
line source

#!/usr/bin/env python3

import argparse
import os
import re


ignored_patterns = [
    re.compile(r'^#if'),
    re.compile(r'^#else'),
    re.compile(r'^#endif'),
    re.compile(r'#rest-ignore$'),
]


def rstify(orig):
    """Take contents of a .t file and produce reStructuredText"""
    newlines = []

    code_block_mode = False
    sphinx_directive_mode = False

    for line in orig.splitlines():

        # Empty 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():
    ap = argparse.ArgumentParser()
    ap.add_argument('testfile', help='.t file to transform')

    opts = ap.parse_args()

    with open(opts.testfile) as f:
        content = f.read()
    rst = rstify(content)
    target = os.path.splitext(opts.testfile)[0] + '.rst'
    with open(target, 'w') as f:
        f.write(rst)


if __name__ == '__main__':
    main()