From 78a4959597c237819c6565d7da2fc031ed426417 Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Thu, 31 Oct 2013 10:33:04 -0700 Subject: [PATCH] Allow blocking uploads by way of bugs with the block-proposed tag set --- britney.py | 12 +++++++++++- policies/policy.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/britney.py b/britney.py index df6d5a2..705be23 100755 --- a/britney.py +++ b/britney.py @@ -62,6 +62,9 @@ Other than source and binary packages, Britney loads the following data: * Hints, which contains lists of commands which modify the standard behaviour of Britney (see Britney.read_hints). + * Blocks, which contains user-supplied blocks read from Launchpad bugs + (see LPBlockBugPolicy). + For a more detailed explanation about the format of these files, please read the documentation of the related methods. The exact meaning of them will be instead explained in the chapter "Excuses Generation". @@ -209,7 +212,7 @@ from britney_util import (old_libraries_format, undo_changes, create_provides_map, ensuredir, ) -from policies.policy import AgePolicy, RCBugPolicy, PolicyVerdict +from policies.policy import AgePolicy, RCBugPolicy, LPBlockBugPolicy, PolicyVerdict # Check the "check_field_name" reflection before removing an import here. from consts import (SOURCE, SOURCEVER, ARCHITECTURE, CONFLICTS, DEPENDS, @@ -528,6 +531,7 @@ class Britney(object): self.policies.append(AgePolicy(self.options, MINDAYS)) self.policies.append(RCBugPolicy(self.options)) + self.policies.append(LPBlockBugPolicy(self.options)) for policy in self.policies: policy.register_hints(self._hint_parser) @@ -1673,6 +1677,12 @@ class Britney(object): excuse.addhtml("%s introduces new bugs, so still ignored (even " "though it fixes more than it introduces, whine at debian-release)" % src) + if 'block-bugs' in policy_info: + for bug, date in policy_info['block-bugs'].items(): + excuse.addhtml("Not touching package as requested in bug %s on %s" % + (bug, bug, time.asctime(time.gmtime(date)))) + excuse.addreason("block") + all_binaries = self.all_binaries if suite in ('pu', 'tpu') and source_t: diff --git a/policies/policy.py b/policies/policy.py index f766cc1..2e1798a 100644 --- a/policies/policy.py +++ b/policies/policy.py @@ -511,3 +511,46 @@ class RCBugPolicy(BasePolicy): bugs[pkg] = set() bugs[pkg].update(l[1].split(",")) return bugs + + +class LPBlockBugPolicy(BasePolicy): + """block-proposed Launchpad bug policy for source migrations + + This policy will read an user-supplied "Blocks" file from the unstable + directory (provided by an external script) with rows of the following + format: + + + + The dates are expressed as the number of seconds from the Unix epoch + (1970-01-01 00:00:00 UTC). + """ + def __init__(self, options): + super().__init__('block-bugs', options, {'unstable'}) + + def initialise(self, britney): + super().initialise(britney) + self.blocks = {} # srcpkg -> [(bug, date), ...] + + filename = os.path.join(self.options.unstable, "Blocks") + self.log("Loading user-supplied block data from %s" % filename) + for line in open(filename): + l = line.split() + if len(l) != 3: + self.log("Blocks, ignoring malformed line %s" % line, type='W') + continue + try: + self.blocks.setdefault(l[0], []) + self.blocks[l[0]].append((l[1], int(l[2]))) + except ValueError: + self.log("Blocks, unable to parse \"%s\"" % line, type='E') + + def apply_policy_impl(self, block_bugs_info, suite, source_name, source_data_tdist, source_data_srcdist): + try: + blocks = self.blocks[source_name] + except KeyError: + return PolicyVerdict.PASS + + for bug, date in blocks: + block_bugs_info[bug] = date + return PolicyVerdict.REJECTED_PERMANENTLY