File: cmd.py

package info (click to toggle)
python-changelog 0.6.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 216 kB
  • sloc: python: 994; makefile: 2
file content (100 lines) | stat: -rw-r--r-- 3,131 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import argparse
import os
import re
import shutil
import sys
import tempfile

from . import mdwriter


def release_notes_into_changelog_file(target_filename, version, release_date):
    """Read changelog fragment files and render them into a single .rst file.

    remove the fragment files afterwards using git rm.

    The fragment files are located by looking for ':include_notes_from:'
    directives in the given changelog file.

    """
    output = tempfile.NamedTemporaryFile(
        mode="w", delete=False, encoding="utf-8"
    )
    with open(target_filename) as handle:
        for line in handle:
            m = re.match(r".*:version: %s" % version, line)
            if m:
                output.write(line)
                output.write("    :released: %s\n" % release_date)
                continue

            m = re.match(r".*:include_notes_from: (.+)", line)
            if m:
                notes_dir = os.path.join(
                    os.path.dirname(target_filename), m.group(1)
                )
                for fname in os.listdir(notes_dir):
                    if not fname.endswith(".rst"):
                        continue
                    fname_path = os.path.join(notes_dir, fname)
                    output.write("\n")
                    with open(fname_path) as inner:
                        for inner_line in inner:
                            output.write(("    " + inner_line).rstrip() + "\n")
                    os.system("git rm %s" % fname_path)
            else:
                output.write(line)
    output.close()
    shutil.move(output.name, target_filename)


def main(argv=None):
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    subparser = subparsers.add_parser(
        "release-notes", help="Merge notes files into changelog and git rm"
    )
    subparser.add_argument("filename", help="target changelog filename")
    subparser.add_argument(
        "version", help="version string as it appears in changelog"
    )
    subparser.add_argument("date", help="full text of datestamp to insert")
    subparser.set_defaults(
        cmd=(
            release_notes_into_changelog_file,
            ["filename", "version", "date"],
        )
    )

    subparser = subparsers.add_parser(
        "generate-md", help="Generate file into markdown"
    )
    subparser.add_argument("filename", help="target changelog filename")
    subparser.add_argument("-c", "--config", help="path to conf.py")
    subparser.add_argument(
        "-v",
        "--version",
        type=str,
        help="render changelog only for version given",
    )
    subparser.add_argument(
        "-s",
        "--sections-only",
        action="store_true",
        help="render changelogs as top level sections",
    )
    subparser.set_defaults(
        cmd=(
            mdwriter.render_changelog_as_md,
            ["filename", "config", "version", "sections_only"],
        )
    )

    options = parser.parse_args(argv)
    fn, argnames = options.cmd
    fn(*[getattr(options, name) for name in argnames])


if __name__ == "__main__":
    main(sys.argv)