#!/usr/bin/python # # All is OK if: # # - every package is in each architecture # - every package is in each codename # - if the version in unstable is x.y-z, then the version in codename foo # is x.y-z.foo import subprocess import sys def produce_package_data(): with open('/home/liw/code.liw.fi/debian/conf/distributions') as f: text = f.read() codenames = set( line.split()[1] for line in text.splitlines() if line.startswith('Codename:')) codenames = set(x for x in codenames if x != 'squeeze') data = '' for codename in codenames: p = subprocess.Popen( ['reprepro', '-b', '/home/liw/code.liw.fi/debian', 'list', codename], stdout=subprocess.PIPE) out, err = p.communicate('') if p.returncode != 0: raise Exception('reprepro failed:\n%s' % err) data += out return data def parse_package_data(text): data = [] for line in text.splitlines(): s, pkg, version = line.split() codename, main, arch = s.split('|') if arch.endswith(':'): arch = arch[:-1] data.append((pkg, codename, arch, version)) return data def packages(data): return set(p for p, c, a, v in data) def check_package(data, package): # Is the package in every architecture? all_arches = set(a for p, c, a, v in data) arches_with_p = set(a for p, c, a, v in data if p == package) missing_from_arches = all_arches.difference(arches_with_p) for arch in missing_from_arches: print 'ERROR: package %s not in arch %s' % (package, arch) # Is the package in every codename? all_codenames = set(c for p, c, a, v in data) codenames_with_p = set(c for p, c, a, v in data if p == package) missing_from_codenames = all_codenames.difference(codenames_with_p) for codename in missing_from_codenames: print 'ERROR: package %s not in codename %s' % (package, codename) # Does the package have the same version (modulo ".$codename" suffix) # in every codename? unstable_versions = set( v for p, c, a, v in data if p == package and c == 'unstable') if len(unstable_versions) == 0: print 'ERROR: package %s not in unstable' % package elif len(unstable_versions) > 1: print 'ERROR: package %s has more than one version in unstable' % \ package else: uv = unstable_versions.pop() for p, c, a, v in data: if p == package and c != 'unstable': expected = '%s.%s' % (uv, c) if v != expected: print 'ERROR: package %s has version %s, expected %s' % \ (package, v, expected) def main(): text = produce_package_data() data = parse_package_data(text) for p in sorted(list(packages(data))): check_package(data, p) main()