#! /usr/bin/python3 import argparse import os import re import subprocess import tempfile TRANSFORM = { "rhbz": "https://bugzilla.redhat.com/{id}", "issue": "https://github.com/rpm-software-management/mock/issues/{id}", "PR": "https://github.com/rpm-software-management/mock/pull/{id}", "commit": "https://github.com/rpm-software-management/mock/commit/{id}", "copr_issue": "https://github.com/fedora-copr/copr/issues/{id}", } TEMP_FILE = ".Release-Notes-Next.md" def _arg_parser(): parser = argparse.ArgumentParser() parser.add_argument("--use-version", dest="version") group = parser.add_mutually_exclusive_group() group.add_argument("--config-only", action="store_true") group.add_argument("--mock-only", action="store_true") return parser def _limited_config(opts): if not opts.config_only and not opts.mock_only: return [] with tempfile.NamedTemporaryFile(delete=False, dir=".") as config_fd: opts.temp_config = config_fd.name with open("pyproject.toml", "rb") as fd: for line in fd.readlines(): if b'{ name' not in line: config_fd.write(line) continue # skip non-config files if opts.config_only and b"config" not in line: continue # skip config files if opts.mock_only and b"config" in line: continue config_fd.write(line) return ["--config", opts.temp_config] def _main(): options = _arg_parser().parse_args() options.temp_config = None tc_opts = _limited_config(options) if not options.version: options.version = "Next" tc_opts.append("--keep") else: tc_opts.append("--yes") output_file = os.path.join(f"docs/Release-Notes-{options.version}.md") found = set() pattern = "|".join(TRANSFORM.keys()) issues_re = re.compile(r"\[(" + pattern + r")#([0-9a-f]+)\]") cmd = ["towncrier", "build", "--version", options.version] + tc_opts print(f"Calling {cmd}") subprocess.check_call(cmd) with open(output_file, "w", encoding="utf8") as fdout: fdout.write(f"""--- layout: default title: Release Notes - Mock {options.version} --- """) if options.version == "Next": fdout.write("""\ # Pre-release Mock changelog Every change in Mock or `mock-core-configs` that deserves some promotion needs to be mentioned in release notes. This generated page provides a set of changes that will land the future version of Mock. See [how to add entries](Release-Notes-New-Entry). """) with open(TEMP_FILE, encoding="utf8") as fdorig: for line in fdorig: fdout.write(line) findings = re.findall(issues_re, line) if not findings: continue for finding in findings: found.add(finding) fdout.write("\n") for (key, value) in found: fdout.write(f"[{key}#{value}]: {TRANSFORM[key].format(id=value)}\n") if options.version != "Next": subprocess.check_call(["git", "add", output_file]) if __name__ == "__main__": # go top-level os.chdir(os.path.join(os.path.dirname(__file__), '..')) try: _main() finally: try: os.unlink(TEMP_FILE) subprocess.check_call(["git", "rm", "-f", TEMP_FILE]) except FileNotFoundError: pass