diff options
author | eldritch horrors <pennae@lix.systems> | 2024-03-26 18:32:25 +0100 |
---|---|---|
committer | eldritch horrors <pennae@lix.systems> | 2024-03-27 03:09:14 +0000 |
commit | 279e30e7ef4cae96d1f5fcbc5fc02ebb4779199b (patch) | |
tree | 045935b89a5067c297cb50e7a28ca3a81cf411fc /maintainers/build-release-notes.py | |
parent | 8fd02df90d2a8099d2d547e151b876f77fb5a4a2 (diff) |
build: replace changelog-d with local script
hacking changelog-d to support not just github but also forgejo and
gerrit is a lot more complicated than it's worth, even moreso since
the entire thing can just as well be done with ~60 lines of python.
this new script is also much cheaper to instantiate (being python),
so having it enabled in all shells is far less of a hassle.
we've also adjusted existing release notes that referenced a gerrit
cl to auto-link to the cl in question, making the diff a bit bigger
closes https://git.lix.systems/lix-project/lix/issues/176
Change-Id: I8ba7dd0070aad9ba4474401731215fcf5d9d2130
Diffstat (limited to 'maintainers/build-release-notes.py')
-rwxr-xr-x | maintainers/build-release-notes.py | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/maintainers/build-release-notes.py b/maintainers/build-release-notes.py new file mode 100755 index 000000000..ba645d19a --- /dev/null +++ b/maintainers/build-release-notes.py @@ -0,0 +1,66 @@ +import frontmatter +import sys +import pathlib +import textwrap + +GH_BASE = "https://github.com/NixOS/nix" +FORGEJO_BASE = "https://git.lix.systems/lix-project/lix" +GERRIT_BASE = "https://gerrit.lix.systems/c/lix/+" + +SIGNIFICANCECES = { + None: 0, + 'significant': 10, +} + +def format_link(ident: str, gh_part: str, fj_part: str) -> str: + # FIXME: deprecate github as default + if ident.isdigit(): + num, link, base = int(ident), f"#{ident}", f"{GH_BASE}/{gh_part}" + elif ident.startswith("gh#"): + num, link, base = int(ident[3:]), ident, f"{GH_BASE}/{gh_part}" + elif ident.startswith("fj#"): + num, link, base = int(ident[3:]), ident, f"{FORGEJO_BASE}/{fj_part}" + else: + raise Exception("unrecognized reference format", ident) + return f"[{link}]({base}/{num})" + +def format_issue(issue: str) -> str: + return format_link(issue, "issues", "issues") +def format_pr(pr: str) -> str: + return format_link(pr, "pull", "pulls") +def format_cl(cl: str) -> str: + clid = int(cl) + return f"[cl/{clid}]({GERRIT_BASE}/{clid})" + +paths = pathlib.Path(sys.argv[1]).glob('*.md') +entries = [] +for p in paths: + try: + e = frontmatter.load(p) + if 'synopsis' not in e.metadata: + raise Exception('missing synposis') + unknownKeys = set(e.metadata.keys()) - set(('synopsis', 'cls', 'issues', 'prs', 'significance')) + if unknownKeys: + raise Exception('unknown keys', unknownKeys) + entries.append((p, e)) + except Exception as e: + e.add_note(f"in {p}") + raise + +for p, entry in sorted(entries, key=lambda e: (-SIGNIFICANCECES[e[1].metadata.get('significance')], e[0])): + try: + header = entry.metadata['synopsis'] + links = [] + links += map(format_issue, str(entry.metadata.get('issues', "")).split()) + links += map(format_pr, str(entry.metadata.get('prs', "")).split()) + links += map(format_cl, str(entry.metadata.get('cls', "")).split()) + if links != []: + header += " " + " ".join(links) + if header: + print(f"- {header}") + print() + print(textwrap.indent(entry.content, ' ')) + print() + except Exception as e: + e.add_note(f"in {p}") + raise |