commit: a415817eb8b23db8aa7b99684ba7db33b279e2e1 Author: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> AuthorDate: Mon Feb 27 19:27:51 2023 +0000 Commit: Arthur Zamarin <arthurzam <AT> gentoo <DOT> org> CommitDate: Mon Feb 27 19:30:40 2023 +0000 URL: https://gitweb.gentoo.org/data/api.git/commit/?id=a415817e
bin/repositories-checker.py: various improvements and fixes - Add `--github` option to output in github actions format, otherwise use colored term output. - If "-" is passed as base xml, assume we are doing full xml check. In this mode I skip checking maintainer emails since it might use too much API calls. - Fix typing - Improve error message for bas repos sorting (explain what is bad) Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org> .github/workflows/repositories.yml | 2 +- bin/repositories-checker.py | 61 +++++++++++++++++++++++++------------- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/.github/workflows/repositories.yml b/.github/workflows/repositories.yml index 3f09609..dae070f 100644 --- a/.github/workflows/repositories.yml +++ b/.github/workflows/repositories.yml @@ -23,7 +23,7 @@ jobs: - name: Check repositories.xml run: | BASE_REF=$(git merge-base --fork-point origin/${{ github.base_ref }}) - python bin/repositories-checker.py <(git show ${BASE_REF}:files/overlays/repositories.xml) files/overlays/repositories.xml + python bin/repositories-checker.py --github <(git show ${BASE_REF}:files/overlays/repositories.xml) files/overlays/repositories.xml validate-schema: runs-on: ubuntu-latest diff --git a/bin/repositories-checker.py b/bin/repositories-checker.py index 7d7cae3..2810bc3 100755 --- a/bin/repositories-checker.py +++ b/bin/repositories-checker.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ -Copyright (C) 2022 Arthur Zamarin <arthur...@gentoo.org> +Copyright (C) 2022-2023 Arthur Zamarin <arthur...@gentoo.org> This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,20 +17,24 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. """ -from http.client import HTTPSConnection +import argparse import sys -from typing import Iterator, Tuple +from http.client import HTTPSConnection +from typing import Iterable, Tuple from urllib.parse import quote_plus -from lxml import etree +from lxml import etree ok_flag = True def output_xml_error(xml: etree._Element, title: str, content: str): start = xml.sourceline - end = start + len(etree.tostring(xml).strip().split(b'\n')) - 1 - print(f'::error file={sys.argv[2]},line={start},endLine={end},title={title}::{content}') + if args.github: + end = start + len(etree.tostring(xml).strip().split(b'\n')) - 1 + print(f'::error file={args.current},line={start},endLine={end},title={title}::{content}') + else: + print(f'\033[91m{args.current}:{start} - {title} - {content}\033[0m') global ok_flag ok_flag = False @@ -38,8 +42,11 @@ def output_xml_error(xml: etree._Element, title: str, content: str): def output_xml_warning(xml: etree._Element, title: str, content: str): start = xml.sourceline - end = start + len(etree.tostring(xml).strip().split()) - print(f'::warning file={sys.argv[2]},line={start},endLine={end},title={title}::{content}') + if args.github: + end = start + len(etree.tostring(xml).strip().split()) + print(f'::warning file={args.current},line={start},endLine={end},title={title}::{content}') + else: + print(f'\033[93m{args.current}:{start} - {title} - {content}\033[0m') class Overlay: @@ -79,11 +86,11 @@ class Overlay: return isinstance(o, Overlay) and o.repo_name == self.repo_name -def read_repositories(file: str) -> Iterator[Overlay]: +def read_repositories(file: str) -> Iterable[Overlay]: return map(Overlay, etree.parse(file).findall('./repo')) -def check_maintainers(overlays: Iterator[Overlay]) -> Iterator[Overlay]: +def check_maintainers(overlays: Iterable[Overlay]): try: client = HTTPSConnection('bugs.gentoo.org') for m in overlays: @@ -92,20 +99,32 @@ def check_maintainers(overlays: Iterator[Overlay]) -> Iterator[Overlay]: client.close() -def check_sorted(curr: Tuple[Overlay], adds: Iterator[Overlay]): +def check_sorted(curr: Tuple[Overlay, ...], adds: Iterable[Overlay]): for addition in adds: index = curr.index(addition) - if index > 0 and curr[index - 1].repo_name >= addition.repo_name: - output_xml_error(addition.xml, 'Unsorted overlay list', f'overlay "{addition.repo_name}" in wrong place') - elif index < len(curr) and curr[index + 1].repo_name <= addition.repo_name: - output_xml_error(addition.xml, 'Unsorted overlay list', f'overlay "{addition.repo_name}" in wrong place') + repo_name = addition.repo_name + if index > 0 and curr[index - 1].repo_name.lower() >= repo_name.lower(): + output_xml_error(addition.xml, 'Unsorted overlay list', + f"overlay {repo_name!r} in wrong place: {repo_name!r} isn't before {curr[index - 1].repo_name!r}") + elif index + 1 < len(curr) and curr[index + 1].repo_name.lower() <= repo_name.lower(): + output_xml_error(addition.xml, 'Unsorted overlay list', + f"overlay {repo_name!r} in wrong place: {repo_name!r} isn't after {curr[index + 1].repo_name!r}") if __name__ == '__main__': - base = tuple(read_repositories(sys.argv[1])) - current = tuple(read_repositories(sys.argv[2])) - additions = frozenset(current).difference(base) - - check_maintainers(additions) - check_sorted(current, additions) + parser = argparse.ArgumentParser(description='Check repositories.xml') + parser.add_argument('base', help='Original repositories.xml, pass "-" to perform full check') + parser.add_argument('current', help='Current repositories.xml') + parser.add_argument('--github', help='print errors in GitHub Actions format', action='store_true') + args = parser.parse_args() + + current = tuple(read_repositories(args.current)) + + if args.base != '-': + base = tuple(read_repositories(args.base)) + additions = frozenset(current).difference(base) + check_maintainers(additions) + check_sorted(current, additions) + else: + check_sorted(current, current) sys.exit(int(not ok_flag))