From 32c3f288b010838ecc9844f296085ee75a9c08a0 Mon Sep 17 00:00:00 2001
From: Iain Lane <iain@orangesquash.org.uk>
Date: Fri, 21 May 2021 13:36:05 +0100
Subject: [PATCH] autopkgtest: Check for kernel-triggered tests when migrating
 kernels

We currently skip the ALWAYSFAIL/REGRESSION handling for kernels. This
can lead to us missing genuine regressions in kernel uploads. The
idea is that results from one kernel flavour shouldn't influence
another.

We can keep this idea but do better and actually check for regressions:
when looking at results, if we're considering a kernel, only look at
results which were triggered by this kernel.
---
 britney2/policies/autopkgtest.py | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/britney2/policies/autopkgtest.py b/britney2/policies/autopkgtest.py
index 40ab279..20452bf 100644
--- a/britney2/policies/autopkgtest.py
+++ b/britney2/policies/autopkgtest.py
@@ -1164,7 +1164,18 @@ class AutopkgtestPolicy(BasePolicy):
 
         # determine current test result status
         until = self.find_max_lower_force_reset_test(src, ver, arch)
-        ever_passed = self.check_ever_passed_before(src, ver, arch, until)
+
+        # Special-case triggers from linux-meta*: we cannot compare results
+        # against different kernels, as e. g. a DKMS module might work against
+        # the default kernel but fail against a different flavor; so for those,
+        # filter the considered results to only those against our kernel
+        if trigger.startswith('linux-meta'):
+            only_trigger = trigger.split('/', 1)[0]
+            self.logger.info('This is a kernel; we will only look for results triggered by %s when considering regressions',
+                             trigger)
+        else:
+            only_trigger = None
+        ever_passed = self.check_ever_passed_before(src, ver, arch, until, only_trigger=only_trigger)
 
         fail_result = 'REGRESSION' if ever_passed else 'ALWAYSFAIL'
 
@@ -1176,15 +1187,6 @@ class AutopkgtestPolicy(BasePolicy):
             run_id = r[2]
 
             if r[0] in {Result.FAIL, Result.OLD_FAIL}:
-                # Special-case triggers from linux-meta*: we cannot compare
-                # results against different kernels, as e. g. a DKMS module
-                # might work against the default kernel but fail against a
-                # different flavor; so for those, ignore the "ever
-                # passed" check; FIXME: check against trigsrc only
-                if self.options.adt_baseline != 'reference' and \
-                  (trigger.startswith('linux-meta') or trigger.startswith('linux/')):
-                    baseline_result = Result.FAIL
-
                 if baseline_result == Result.FAIL:
                     result = 'ALWAYSFAIL'
                 elif baseline_result in {Result.NONE, Result.OLD_FAIL}:
@@ -1256,7 +1258,7 @@ class AutopkgtestPolicy(BasePolicy):
 
         return (result, ver, run_id, url)
 
-    def check_ever_passed_before(self, src, max_ver, arch, min_ver=None):
+    def check_ever_passed_before(self, src, max_ver, arch, min_ver=None, only_trigger=None):
         '''Check if tests for src ever passed on arch for specified range
 
         If min_ver is specified, it checks that all versions in
@@ -1264,7 +1266,11 @@ class AutopkgtestPolicy(BasePolicy):
         [min_ver, inf) have passed.'''
 
         # FIXME: add caching
-        for srcmap in self.test_results.values():
+        for (trigger, srcmap) in self.test_results.items():
+            if only_trigger:
+                trig = trigger.split('/', 1)[0]
+                if only_trigger != trig:
+                    continue
             try:
                 too_high = apt_pkg.version_compare(srcmap[src][arch][1], max_ver) > 0
                 too_low = apt_pkg.version_compare(srcmap[src][arch][1], min_ver) <= 0 if min_ver else False