Author: filippo Date: 2008-06-24 17:59:26 +0000 (Tue, 24 Jun 2008) New Revision: 896
Added: upload-history/munge_ddc.py Log: munge upload information from d-d-c mailbox into rfc822 file Added: upload-history/munge_ddc.py =================================================================== --- upload-history/munge_ddc.py (rev 0) +++ upload-history/munge_ddc.py 2008-06-24 17:59:26 UTC (rev 896) @@ -0,0 +1,116 @@ +#!/usr/bin/python2.4 +# extract upload info from a debian-devel-changes mailbox file + +import email +import mailbox +import re +import rfc822 +import subprocess +import sys +import os + +from debian_bundle import deb822 + +# XXX gives false positives for example with -x+y.z.w, mitigated by checking Changes also +# XXX might change in the future, see DEP1 http://wiki.debian.org/NmuDep +nmu_version_RE = re.compile("(-\S+\.\d+|\+nmu\d+)$") +nmu_changelog_RE = re.compile("\s+\*\s+.*(NMU|non[- ]maintainer)", re.IGNORECASE + re.MULTILINE) + +#keyid_RE = re.compile("Signature made (.+) using \S+ key ID (\S+)") +keyid_RE = re.compile("\[GNUPG:\] (GOOD|BAD|ERR)SIG (\S+) (.+)") + +def extract_pgp(msg, keyring=["/usr/share/keyrings/debian-keyring.gpg", + "/usr/share/keyrings/debian-maintainers.gpg"]): + """ Verify given msg with gpgv using the given (list of) keyring(s) + + Return a tuple (key, key-id) or ("N/A", "N/A") if key not available""" + + opts = ["/usr/bin/gpgv", "--status-fd", "1"] + + keyrings = [] + if isinstance(keyring, str): + if os.path.exists(keyring): + keyrings.extend(["--keyring", keyring]) + else: + for k in tuple(keyring): + if os.path.exists(str(k)): + keyrings.extend(["--keyring", str(k)]) + + if keyrings: + opts.extend(keyrings) + else: + return ("N/A", "N/A") + + p = subprocess.Popen(opts, stdin=subprocess.PIPE, stderr=subprocess.PIPE, + stdout=subprocess.PIPE) + + (out, err) = p.communicate("\n".join(msg)) + + m = keyid_RE.search(out) + if m: + #sys.stderr.write(m.group(2)) + if m.group(1) == "GOOD": + return m.group(2), m.group(3) + else: + return m.group(2), "N/A" + else: + return ("N/A", "N/A") + +# XXX factor this to work with plain .changes +def munge_ddc(mb_file, outfile=sys.stdout): + """ Scan given mb_file as a unix mailbox and extract upload informations """ + + #outfile = file(mb_file + ".csv", 'w') + + mb = mailbox.PortableUnixMailbox(file(mb_file), factory=email.message_from_file) + + for msg in mb: + if msg.is_multipart(): + continue + body = msg.get_payload(decode=True).split('\n') + +# XXX work around Hash: sha1(\n)+ at the beginning of signed body + for (i,l) in enumerate(body): + if l.startswith("Format:"): + break + + c = deb822.Changes(body[i:]) + + required = set(['Source', 'Architecture', 'Version', 'Changes']) + found = set(c.keys()) + + if not required.issubset(found): + sys.stderr.write("%s %s fields not found: %s\n" % (mb_file, msg['Subject'], " ".join(required.difference(found)))) + sys.stderr.write("%s" % "\n".join(c)) + continue + + if not 'source' in c['Architecture']: + #sys.stderr.write("%s: source not in architecture\n" % pkg) + continue + + nmu_version = nmu_version_RE.search(c['Version']) + nmu_changes = nmu_changelog_RE.search(c['Changes']) + + c['NMU'] = ((nmu_version is not None) and (nmu_changes is not None)) + + (c['Key'], c['Key-UID']) = extract_pgp(body) + + for field in 'Source', 'Version', 'Date', 'Changed-By', 'Maintainer', 'NMU', 'Key', 'Key-UID': + try: + print "%s: %s" % (field, c[field]) + except KeyError: + print "%s: N/A" % field + + # separate different packages + print + + +if __name__ == '__main__': + if len(sys.argv) < 2: + print "usage: file1 .. fileN" + sys.exit(1) + + for f in sys.argv[1:]: + munge_ddc(f) + +# vim: et:ts=4:sw=4 Property changes on: upload-history/munge_ddc.py ___________________________________________________________________ Name: svn:executable + * _______________________________________________ Collab-qa-commits mailing list [email protected] http://lists.alioth.debian.org/mailman/listinfo/collab-qa-commits
