release-notes: check with pre-commit

This required making the build-release-notes script understand how to
check multiple directories.

Change-Id: I057f5f636155ab6c6fb5755da5217b7e72249ece
This commit is contained in:
Jade Lovelace 2024-04-07 20:05:19 -07:00
parent 6fcab7ee95
commit 06f17a5c78
2 changed files with 49 additions and 35 deletions

View file

@ -344,6 +344,15 @@
enable = true; enable = true;
excludes = [ "^tests/functional/lang/" ]; excludes = [ "^tests/functional/lang/" ];
}; };
release-notes = {
enable = true;
package = pkgs.build-release-notes;
files = "^doc/manual/rl-next(-dev)?";
pass_filenames = false;
entry = ''
${lib.getExe pkgs.build-release-notes} doc/manual/rl-next doc/manual/rl-next-dev
'';
};
# TODO: Once the test suite is nicer, clean up and start # TODO: Once the test suite is nicer, clean up and start
# enforcing trailing whitespace on tests that don't explicitly # enforcing trailing whitespace on tests that don't explicitly
# check for it. # check for it.

View file

@ -31,41 +31,46 @@ def format_pr(pr: str) -> str:
def format_cl(clid: int) -> str: def format_cl(clid: int) -> str:
return f"[cl/{clid}]({GERRIT_BASE}/{clid})" return f"[cl/{clid}]({GERRIT_BASE}/{clid})"
paths = pathlib.Path(sys.argv[1]).glob('*.md') def run_on_dir(d):
entries = [] paths = pathlib.Path(d).glob('*.md')
for p in paths: entries = []
try: for p in paths:
e = frontmatter.load(p) try:
if 'synopsis' not in e.metadata: e = frontmatter.load(p)
raise Exception('missing synopsis') if 'synopsis' not in e.metadata:
unknownKeys = set(e.metadata.keys()) - set(('synopsis', 'cls', 'issues', 'prs', 'significance')) raise Exception('missing synopsis')
if unknownKeys: unknownKeys = set(e.metadata.keys()) - set(('synopsis', 'cls', 'issues', 'prs', 'significance'))
raise Exception('unknown keys', unknownKeys) if unknownKeys:
entries.append((p, e)) raise Exception('unknown keys', unknownKeys)
except Exception as e: entries.append((p, e))
e.add_note(f"in {p}") except Exception as e:
raise e.add_note(f"in {p}")
raise
def listify(l: list | int) -> list: def listify(l: list | int) -> list:
if not isinstance(l, list): if not isinstance(l, list):
return [l] return [l]
else: else:
return l return l
for p, entry in sorted(entries, key=lambda e: (-SIGNIFICANCECES[e[1].metadata.get('significance')], e[0])): for p, entry in sorted(entries, key=lambda e: (-SIGNIFICANCECES[e[1].metadata.get('significance')], e[0])):
try: try:
header = entry.metadata['synopsis'] header = entry.metadata['synopsis']
links = [] links = []
links += [format_issue(str(s)) for s in listify(entry.metadata.get('issues', []))] links += [format_issue(str(s)) for s in listify(entry.metadata.get('issues', []))]
links += [format_pr(str(s)) for s in listify(entry.metadata.get('prs', []))] links += [format_pr(str(s)) for s in listify(entry.metadata.get('prs', []))]
links += [format_cl(cl) for cl in listify(entry.metadata.get('cls', []))] links += [format_cl(cl) for cl in listify(entry.metadata.get('cls', []))]
if links != []: if links != []:
header += " " + " ".join(links) header += " " + " ".join(links)
if header: if header:
print(f"- {header}") print(f"- {header}")
print()
print(textwrap.indent(entry.content, ' '))
print() print()
print(textwrap.indent(entry.content, ' ')) except Exception as e:
print() e.add_note(f"in {p}")
except Exception as e: raise
e.add_note(f"in {p}")
raise if __name__ == '__main__':
for d in sys.argv[1:]:
run_on_dir(d)