[Collab-qa-commits] r2052 - / multi-arch

Jakub Wilk jwilk at alioth.debian.org
Sat Oct 22 12:47:28 UTC 2011


Author: jwilk
Date: 2011-10-22 12:47:27 +0000 (Sat, 22 Oct 2011)
New Revision: 2052

Added:
   multi-arch/
   multi-arch/multi-arch-same-validator
Log:
Script to check MD5 sums for 'Multi-Arch: same' packages.



Added: multi-arch/multi-arch-same-validator
===================================================================
--- multi-arch/multi-arch-same-validator	                        (rev 0)
+++ multi-arch/multi-arch-same-validator	2011-10-22 12:47:27 UTC (rev 2052)
@@ -0,0 +1,107 @@
+#!/usr/bin/python3
+
+'''
+Check MD5 sums for 'Multi-Arch: same' packages.
+'''
+
+import argparse
+import collections
+import os
+import re
+import sys
+import subprocess as ipc
+
+import apt_pkg
+
+default_mirror = 'http://ftp.debian.org/debian'
+default_distribution = 'unstable'
+default_architectures = 'i386', 'amd64'
+
+def setup_proxies():
+    apt_pkg.init_config()
+    os.environ['http_proxy'] = apt_pkg.config.get('Acquire::http::Proxy', '')
+    os.environ['ftp_proxy'] = apt_pkg.config.get('Acquire::ftp::Proxy', '')
+
+def log_download(url):
+    print('D: {url}'.format(url=url), file=sys.stderr)
+
+def log_action(package, version, action):
+    print(
+        'I: {pkg} {ver} => {action}'.format(pkg=package, ver=version, action=action),
+        file=sys.stderr
+    )
+    sys.stderr.flush()
+
+def log_error(package, version, message):
+    print(
+        'E: {pkg} {ver} => {message}'.format(pkg=package, ver=version, message=message),
+        file=sys.stderr
+    )
+
+def do_qa(options):
+    data = collections.defaultdict(dict)
+    for architecture in options.architectures:
+        for section in 'main', 'contrib', 'non-free':
+            url = '{mirror}/dists/{dist}/{section}/binary-{arch}/Packages.gz'.format(
+                mirror=options.mirror,
+                dist=options.distribution,
+                section=section,
+                arch=architecture
+            )
+            log_download(url)
+            child = ipc.Popen('wget -O- -q {} | gzip -dc'.format(url), shell=True, stdout=ipc.PIPE)
+            for pkgdata in apt_pkg.TagFile(child.stdout):
+                if pkgdata.get('Multi-Arch', '') == 'same':
+                    pkgname = pkgdata['Package']
+                    pkgversion = pkgdata['Version']
+                    url = '{mirror}/{path}'.format(mirror=options.mirror, path=pkgdata['Filename'])
+                    data[pkgname, pkgversion][architecture] = url
+            if child.wait() != 0:
+                raise IOError
+    last = None
+    for (pkgname, pkgversion), urls in data.items():
+        if len(urls) <= 1:
+            log_action(pkgname, pkgversion, 'skip')
+            continue
+        log_action(pkgname, pkgversion, 'download ({})'.format(' '.join(urls.keys())))
+        pkgdata = collections.defaultdict(
+            lambda: collections.defaultdict(set)
+        )
+        for architecture, url in urls.items():
+            log_download(url)
+            child = ipc.Popen('wget -O- -q {} | dpkg-deb -I /dev/stdin md5sums 2>/dev/null'.format(url), shell=True, stdout=ipc.PIPE)
+            for line in child.stdout:
+                md5sum = line[:32]
+                filename = line[34:-1]
+                pkgdata[filename][md5sum].add(architecture)
+            if child.wait() != 0:
+                log_error(pkgname, pkgversion, 'missing md5sums for {arch}'.format(arch=architecture))
+                continue
+        for filename, md5sums in pkgdata.items():
+            if len(md5sums) <= 1:
+                continue
+            if last != (pkgname, pkgversion):
+                if last is not None:
+                    print()
+                print('[{name} {ver}]'.format(name=pkgname, ver=pkgversion))
+                last = (pkgname, pkgversion)
+            print(filename.decode('UTF-8', 'replace'))
+            for md5sum, architectures in sorted(md5sums.items()):
+                print('  {md5sum} {arch}'.format(
+                    md5sum=md5sum.decode('ASCII'),
+                    arch=' '.join(architectures)
+                ))
+
+def main():
+    setup_proxies()
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--mirror', default=default_mirror)
+    parser.add_argument('--distribution', default=default_distribution)
+    parser.add_argument('--architectures', nargs='+', default=default_architectures)
+    options = parser.parse_args()
+    do_qa(options)
+
+if __name__ == '__main__':
+    main()
+
+# vim:ts=4 sw=4 et


Property changes on: multi-arch/multi-arch-same-validator
___________________________________________________________________
Added: svn:executable
   + *




More information about the Collab-qa-commits mailing list