#!/usr/bin/env python3 # Adélie Linux architecture package tester # Ensure all packages are all on arches # # Copyright © 2018 Adélie Linux team. All rights reserved. # NCSA license. # from apkkit.base.index import Index BASE_URL = "https://mirrormaster.adelielinux.org/adelie/{version}/{repo}/{arch}/APKINDEX.tar.gz" """The base URL to use for downloading package indexes.""" VERSION = "1.0-alpha6" """The version to check. Bump this after each release.""" def compare_versions(old, new): """Compare two versions. Return True if equal.""" return (old == new) def compare_older(old, new): """Compare two versions. Return True if old is older.""" for part in zip(old.split('.'), new.split('.')): # part[0] = next component of old ver, part[1] = new try: oldpart = int(part[0]) newpart = int(part[1]) except ValueError: oldpart = part[0] newpart = part[1] if oldpart < newpart: return True elif oldpart == newpart: continue else: return False return False def process_one_pkg(mydict, next_pkg): """Process a package.""" new = next_pkg.version if next_pkg.origin in mydict: curr = mydict[next_pkg.origin] if not compare_versions(curr, new) and compare_older(curr, new): mydict[next_pkg.origin] = new else: pass # Do nothing if this is older. else: # Doesn't exist in this dict, put it in. mydict[next_pkg.origin] = new def main(): """The main function.""" arches = set() sys_ign = set() user_ign = set() with open('arches', 'r') as arch_file: arches = [arch[:-1] for arch in arch_file.readlines()] with open('sys-specific', 'r') as ignore_file: sys_ign = set(pkg[:-1] for pkg in ignore_file.readlines()) with open('user-specific', 'r') as ignore_file: user_ign = set(pkg[:-1] for pkg in ignore_file.readlines()) all_sys_pkgs = dict() all_user_pkgs = dict() pkgs = {} arch_sys_pkgs = {arch: dict() for arch in arches} arch_user_pkgs = {arch: dict() for arch in arches} broken_sys = list() broken_user = list() not_broken = list() for arch in arches: print("Loading " + arch + "...") arch_sys = Index(url=BASE_URL.format(version=VERSION, repo='system', arch=arch)) arch_user = Index(url=BASE_URL.format(version=VERSION, repo='user', arch=arch)) for next_pkg in arch_sys.packages: for mydict in (all_sys_pkgs, arch_sys_pkgs[arch]): process_one_pkg(mydict, next_pkg) for next_pkg in arch_user.packages: for mydict in (all_user_pkgs, arch_user_pkgs[arch]): process_one_pkg(mydict, next_pkg) all_sys_pkgs.pop('firefox-esr') all_sys_pkgs.pop('gcc') for arch in arches: old_sys = list() old_user = list() for pkg in all_sys_pkgs.keys(): sysver = all_sys_pkgs[pkg] if pkg in arch_sys_pkgs[arch]: archver = arch_sys_pkgs[arch][pkg] if compare_older(archver, sysver): old_sys.append((pkg, sysver, archver)) for pkg in all_user_pkgs.keys(): userver = all_user_pkgs[pkg] if pkg in arch_user_pkgs[arch]: archver = arch_user_pkgs[arch][pkg] if compare_older(archver, userver): old_user.append((pkg, userver, archver)) if len(old_sys) > 0: print("Outdated in {arch}/system:".format(arch=arch)) print("=========================") old_sys.sort() for pkg, sys, archver in old_sys: print("{0}: {1} is older than {2}".format(pkg, archver, sys)) print("\n\n") broken_sys.append(arch) if len(old_user) > 0: print("Outdated in {arch}/user:".format(arch=arch)) print("=========================") old_user.sort() for pkg, user, archver in old_user: print("{0}: {1} is older than {2}".format(pkg, archver, user)) print("\n\n") broken_user.append(arch) if len(old_sys) == 0 and len(old_user) == 0: not_broken.append(arch) print("\033[1;32mNo issues\033[1;0m: {a}".format(a=", ".join(not_broken))) print("\033[1;33mOutdated user\033[1;0m: {a}".format(a=", ".join( ["{x}".format(x=arch) for arch in broken_user]))) print("\033[1;31mOutdated system\033[1;0m: {a}".format(a=", ".join( ["{x}".format(x=arch) for arch in broken_sys]))) if __name__ == "__main__": main()