diff --git a/britney.py b/britney.py index 002a761..398ddb2 100755 --- a/britney.py +++ b/britney.py @@ -261,6 +261,13 @@ BinaryPackage = namedtuple('BinaryPackage', [ 'pkg_id', ]) +SuiteInfo = namedtuple('SuiteInfo', [ + 'name', + 'path', + 'excuses_suffix', +]) + + class Britney(object): """Britney, the Debian testing updater script @@ -288,6 +295,7 @@ class Britney(object): # parse the command line arguments self.policies = [] self._hint_parser = HintParser(self) + self.suite_info = {} self.__parse_arguments() MigrationItem.set_architectures(self.options.architectures) @@ -301,7 +309,7 @@ class Britney(object): try: self.read_hints(self.options.hintsdir) except AttributeError: - self.read_hints(os.path.join(self.options.unstable, 'Hints')) + self.read_hints(os.path.join(self.suite_info['unstable'].path, 'Hints')) if self.options.nuninst_cache: self.log("Not building the list of non-installable packages, as requested", type="I") @@ -312,8 +320,8 @@ class Britney(object): self.all_binaries = {} # read the source and binary packages for the involved distributions - self.sources['testing'] = self.read_sources(self.options.testing) - self.sources['unstable'] = self.read_sources(self.options.unstable) + self.sources['testing'] = self.read_sources(self.suite_info['testing'].path) + self.sources['unstable'] = self.read_sources(self.suite_info['unstable'].path) for suite in ('tpu', 'pu'): if hasattr(self.options, suite): self.sources[suite] = self.read_sources(getattr(self.options, suite)) @@ -325,10 +333,10 @@ class Britney(object): self.binaries['tpu'] = {} self.binaries['pu'] = {} - self.binaries['unstable'] = self.read_binaries(self.options.unstable, "unstable", self.options.architectures) + self.binaries['unstable'] = self.read_binaries(self.suite_info['unstable'].path, "unstable", self.options.architectures) for suite in ('tpu', 'pu'): - if hasattr(self.options, suite): - self.binaries[suite] = self.read_binaries(getattr(self.options, suite), suite, self.options.architectures) + if suite in self.suite_info: + self.binaries[suite] = self.read_binaries(self.suite_info[suite].path, suite, self.options.architectures) else: # _build_installability_tester relies on this being # properly initialised, so insert two empty dicts @@ -337,7 +345,7 @@ class Britney(object): self.binaries[suite][arch] = ({}, {}) # Load testing last as some live-data tests have more complete information in # unstable - self.binaries['testing'] = self.read_binaries(self.options.testing, "testing", self.options.architectures) + self.binaries['testing'] = self.read_binaries(self.suite_info['testing'].path, "testing", self.options.architectures) try: constraints_file = os.path.join(self.options.static_input_dir, 'constraints') @@ -473,8 +481,20 @@ class Britney(object): elif not hasattr(self.options, k.lower()) or \ not getattr(self.options, k.lower()): setattr(self.options, k.lower(), v) + + for suite in ('testing', 'unstable', 'pu', 'tpu'): + suffix = suite if suite in {'pu', 'tpu'} else '' + if hasattr(self.options, suite): + suite_path = getattr(self.options, suite) + self.suite_info[suite] = SuiteInfo(name=suite, path=suite_path, excuses_suffix=suffix) + else: + if suite in {'testing', 'unstable'}: + self.log("Mandatory configuration %s is not set in the config" % suite.upper(), type='E') + sys.exit(1) + self.log("Optional suite %s is not defined (config option: %s) " % (suite, suite.upper())) + try: - release_file = read_release_file(self.options.testing) + release_file = read_release_file(self.suite_info['testing'].path) self.log("Found a Release file in testing - using that for defaults") except FileNotFoundError: self.log("Testing does not have a Release file.") @@ -508,7 +528,7 @@ class Britney(object): else: if not release_file: self.log("No configured architectures and there is no release file for testing", type="E") - self.log("Please check if there is a \"Release\" file in %s" % self.options.testing, type="E") + self.log("Please check if there is a \"Release\" file in %s" % self.suite_info['testing'].path, type="E") self.log("or if the config file contains a non-empty \"ARCHITECTURES\" field", type="E") sys.exit(1) allarches = sorted(release_file['Architectures'].split()) @@ -525,8 +545,8 @@ class Britney(object): self.options.ignore_cruft == "0": self.options.ignore_cruft = False - self.policies.append(AgePolicy(self.options, MINDAYS)) - self.policies.append(RCBugPolicy(self.options)) + self.policies.append(AgePolicy(self.options, self.suite_info, MINDAYS)) + self.policies.append(RCBugPolicy(self.options, self.suite_info)) for policy in self.policies: policy.register_hints(self._hint_parser) @@ -2752,9 +2772,9 @@ class Britney(object): # re-write control files if self.options.control_files: self.log("Writing new testing control files to %s" % - self.options.testing) + self.suite_info['testing'].path) write_controlfiles(self.sources, self.binaries, - 'testing', self.options.testing) + 'testing', self.suite_info['testing'].path) for policy in self.policies: policy.save_state(self) diff --git a/britney2/policies/policy.py b/britney2/policies/policy.py index 48a3e4b..6f3b37e 100644 --- a/britney2/policies/policy.py +++ b/britney2/policies/policy.py @@ -38,7 +38,7 @@ class PolicyVerdict(Enum): class BasePolicy(object): - def __init__(self, policy_id, options, applicable_suites): + def __init__(self, policy_id, options, suite_info, applicable_suites): """The BasePolicy constructor :param policy_id An string identifying the policy. It will @@ -52,6 +52,7 @@ class BasePolicy(object): """ self.policy_id = policy_id self.options = options + self.suite_info = suite_info self.applicable_suites = applicable_suites self.hints = None @@ -204,8 +205,8 @@ class AgePolicy(BasePolicy): """ - def __init__(self, options, mindays): - super().__init__('age', options, {'unstable'}) + def __init__(self, options, suite_info, mindays): + super().__init__('age', options, suite_info, {'unstable'}) self._min_days = mindays if options.default_urgency not in mindays: raise ValueError("Missing age-requirement for default urgency (MINDAYS_%s)" % options.default_urgency) @@ -295,7 +296,7 @@ class AgePolicy(BasePolicy): def _read_dates_file(self): """Parse the dates file""" dates = self._dates - fallback_filename = os.path.join(self.options.testing, 'Dates') + fallback_filename = os.path.join(self.suite_info['testing'].path, 'Dates') using_new_name = False try: filename = os.path.join(self.options.state_dir, 'age-policy-dates') @@ -331,7 +332,7 @@ class AgePolicy(BasePolicy): def _read_urgencies_file(self, britney): urgencies = self._urgencies min_days_default = self._min_days_default - fallback_filename = os.path.join(self.options.testing, 'Urgency') + fallback_filename = os.path.join(self.suite_info['testing'].path, 'Urgency') try: filename = os.path.join(self.options.state_dir, 'age-policy-urgencies') if not os.path.exists(filename) and os.path.exists(fallback_filename): @@ -373,9 +374,9 @@ class AgePolicy(BasePolicy): try: directory = self.options.state_dir basename = 'age-policy-dates' - old_file = os.path.join(self.options.testing, 'Dates') + old_file = os.path.join(self.suite_info['testing'].path, 'Dates') except AttributeError: - directory = self.options.testing + directory = self.suite_info['testing'].path basename = 'Dates' old_file = None filename = os.path.join(directory, basename) @@ -408,8 +409,8 @@ class RCBugPolicy(BasePolicy): - This file needs to be updated externally. """ - def __init__(self, options): - super().__init__('rc-bugs', options, {'unstable'}) + def __init__(self, options, suite_info): + super().__init__('rc-bugs', options, suite_info, {'unstable'}) self._bugs = {} def register_hints(self, hint_parser): @@ -420,8 +421,8 @@ class RCBugPolicy(BasePolicy): def initialise(self, britney): super().initialise(britney) - fallback_unstable = os.path.join(self.options.unstable, 'BugsV') - fallback_testing = os.path.join(self.options.testing, 'BugsV') + fallback_unstable = os.path.join(self.suite_info['unstable'].path, 'BugsV') + fallback_testing = os.path.join(self.suite_info['testing'].path, 'BugsV') try: filename_unstable = os.path.join(self.options.state_dir, 'rc-bugs-unstable') filename_testing = os.path.join(self.options.state_dir, 'rc-bugs-testing')