From a87e9e63c33d520ca42bd94452462e9a2f3fa835 Mon Sep 17 00:00:00 2001 From: Jan Staněk Date: Aug 23 2016 08:57:09 +0000 Subject: Rewrite; Add dist-git sanity check --- diff --git a/modlint b/modlint index 0cc9a94..b27aa65 100755 --- a/modlint +++ b/modlint @@ -1,23 +1,85 @@ #!/usr/bin/python3 -import modulemd + + +import argparse +from typing import Generator import sys -def usage(): - print("Usage: modlint ") - sys.exit() +import requests +from modulemd import ModuleMetadata + + +def existing_content(mmd: ModuleMetadata) -> Generator[str, None, None]: + """Check that rpm content points to existing repo (commit). + + For each package in the module, this function queries the dist-git + and use the status code for determining if the package (and + optionally commit) exists. + + Keyword arguments: + mmd -- The checked module metadata object. + + Yields: + Error messages for invalid packages. + """ + + ERRORS = { + 400: 'Bad hash', + 404: 'Nonexistent rpm', + } + + # TODO: Get URL from the metadata + CGIT_URL_TEMPLATE = 'http://pkgs.fedoraproject.org/cgit/rpms/{name}.git/commit' + + try: + packages = mmd.components.rpms.packages + except AttributeError: + return None + + for package, details in packages.items(): + if 'commit' in details: + payload = {'id': details['commit']} + else: + payload = {} + + response = requests.head( + CGIT_URL_TEMPLATE.format(name=package), + params=payload + ) + + # XXX: Maybe yield tuple instead? + if response.status_code != requests.codes.ok: + yield '{pkg [{hash}]: {msg}}'.format( + pkg=package, + hash=(details['commit'] if 'commit' in details else 'HEAD'), + msg=ERRORS[response.status_code] + ) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Validate module metadata.') + + # Positional arguments + parser.add_argument('file', help='Input metadata file') + + args = parser.parse_args() + + metadata = ModuleMetadata() -if (len(sys.argv) != 2): - usage() + all_went_well = True -filename = sys.argv[1] -modulemd = modulemd.ModuleMetadata() + try: + metadata.load(args.file) + metadata.validate() + except Exception as exc: + all_went_well = False + print('ERROR:', str(exc), file=sys.stderr) -try: - modulemd.load(filename) - modulemd.validate() -except Exception as e: - # raise - print("ERROR: ", str(e)) - sys.exit() + for error in existing_content(metadata): + all_went_well = False + print('RPM CONTENT ERROR:', error, file=sys.stderr) -print("Everything is OK!") + if all_went_well: + print('Everything OK') + else: + raise SystemExit(1)