diff --git a/autopkgtest.py b/autopkgtest.py index 5dd2445..75371e0 100644 --- a/autopkgtest.py +++ b/autopkgtest.py @@ -19,18 +19,24 @@ from __future__ import print_function from collections import defaultdict from contextlib import closing -import logging import os import subprocess import tempfile from textwrap import dedent import time - import apt_pkg adt_britney = os.path.expanduser("~/auto-package-testing/jenkins/adt-britney") +ADT_PASS = ["PASS", "ALWAYSFAIL"] +ADT_EXCUSES_LABELS = { + "PASS": 'Pass', + "ALWAYSFAIL": 'Always failed', + "REGRESSION": 'Regression', + "RUNNING": 'Test in progress', +} + class AutoPackageTest(object): """autopkgtest integration @@ -62,7 +68,7 @@ class AutoPackageTest(object): components: main restricted universe multiverse rsync_host: rsync://tachash.ubuntu-ci/adt/ datadir: ~/proposed-migration/autopkgtest/data""" % - (self.series, self.series, home)), file=rc_file) + (self.series, self.series, home)), file=rc_file) @property def _request_path(self): @@ -85,8 +91,7 @@ class AutoPackageTest(object): continue linebits = line.split() if len(linebits) < 2: - logging.warning( - "Invalid line format: '%s', skipped" % line) + print("W: Invalid line format: '%s', skipped" % line) continue yield linebits @@ -94,29 +99,21 @@ class AutoPackageTest(object): self.pkglist = defaultdict(dict) self.pkgcauses = defaultdict(lambda: defaultdict(list)) for linebits in self._parse(self._result_path): - src = linebits.pop(0) - ver = linebits.pop(0) - self.pkglist[src][ver] = { - "status": "NEW", - "causes": {}, + (src, ver, status) = linebits[:3] + + if not (src in self.pkglist and ver in self.pkglist[src]): + self.pkglist[src][ver] = { + "status": status, + "causes": {} } - try: - status = linebits.pop(0).upper() - self.pkglist[src][ver]["status"] = status - while True: - trigsrc = linebits.pop(0) - trigver = linebits.pop(0) - self.pkglist[src][ver]["causes"][trigsrc] = trigver - except IndexError: - # End of the list - pass - for src in self.pkglist: - all_vers = sorted(self.pkglist[src], cmp=apt_pkg.version_compare) - for ver in self.pkglist[src]: - status = self.pkglist[src][ver]["status"] - for trigsrc, trigver in \ - self.pkglist[src][ver]["causes"].items(): - self.pkgcauses[trigsrc][trigver].append((status, src, ver)) + + i = iter(linebits[3:]) + for trigsrc, trigver in zip(i, i): + if not trigsrc in self.pkglist[src][ver]['causes']: + self.pkglist[src][ver]['causes'][trigsrc] = [] + self.pkglist[src][ver]['causes'][trigsrc].append((trigver, + status)) + self.pkgcauses[trigsrc][trigver].append((status, src, ver)) def _adt_britney(self, *args): command = [ @@ -197,12 +194,29 @@ class AutoPackageTest(object): self.read() if self.britney.options.verbose: for src in sorted(self.pkglist): - for ver in self.pkglist[src]: - print("I: [%s] - Collected autopkgtest status for %s_%s: " - "%s" % - (time.asctime(), src, ver, - self.pkglist[src][ver]["status"])) + for ver in sorted(self.pkglist[src], + cmp=apt_pkg.version_compare): + for trigsrc in sorted(self.pkglist[src][ver]['causes']): + for trigver, status \ + in self.pkglist[src][ver]['causes'][trigsrc]: + print("I: [%s] - Collected autopkgtest status " + "for %s_%s/%s_%s: " "%s" % ( + time.asctime(), src, ver, trigsrc, + trigver, status)) def results(self, trigsrc, trigver): for status, src, ver in self.pkgcauses[trigsrc][trigver]: + # Check for regresssion + if status == 'FAIL': + passed_once = False + for ver in self.pkglist[src]: + for trigsrc in self.pkglist[src][ver]['causes']: + for trigver, status \ + in self.pkglist[src][ver]['causes'][trigsrc]: + if status == 'PASS': + passed_once = True + if not passed_once: + status = 'ALWAYSFAIL' + else: + status = 'REGRESSION' yield status, src, ver diff --git a/britney.py b/britney.py index 683822e..648eb57 100755 --- a/britney.py +++ b/britney.py @@ -222,7 +222,7 @@ from britney_util import (old_libraries_format, same_source, undo_changes, from consts import (VERSION, SECTION, BINARIES, MAINTAINER, FAKESRC, SOURCE, SOURCEVER, ARCHITECTURE, DEPENDS, CONFLICTS, PROVIDES, RDEPENDS, RCONFLICTS, MULTIARCH) -from autopkgtest import AutoPackageTest +from autopkgtest import AutoPackageTest, ADT_PASS, ADT_EXCUSES_LABELS __author__ = 'Fabio Tranchitella and the Debian Release Team' __version__ = '2.0' @@ -1756,18 +1756,21 @@ class Britney(object): adtpass = True for status, adtsrc, adtver in autopkgtest.results( e.name, e.ver[1]): - public_url = "%s/%s-adt-%s/" % ( + public_url = "%s/%s-adt-%s/lastBuild" % ( jenkins_public, self.options.adt_series, adtsrc.replace("+", "-")) - private_url = "%s/%s-adt-%s/" % ( + private_url = "%s/%s-adt-%s/lastBuild" % ( jenkins_private, self.options.adt_series, adtsrc.replace("+", "-")) + adt_label = status + if status in ADT_EXCUSES_LABELS: + adt_label = ADT_EXCUSES_LABELS[status] e.addhtml( "autopkgtest for %s %s: %s (Jenkins: " "public, " "private)" % - (adtsrc, adtver, status, public_url, private_url)) - if status != "PASS": + (adtsrc, adtver, adt_label, public_url, private_url)) + if status not in ADT_PASS: hints = self.hints.search( 'force-badtest', package=adtsrc) hints.extend(