mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-06-06 23:31:29 +00:00
Add depends policy
This commit is contained in:
parent
2ccb056fa1
commit
4e5926a41f
@ -200,7 +200,8 @@ from britney2.installability.builder import build_installability_tester
|
|||||||
from britney2.installability.solver import InstallabilitySolver
|
from britney2.installability.solver import InstallabilitySolver
|
||||||
from britney2.migration import MigrationManager
|
from britney2.migration import MigrationManager
|
||||||
from britney2.migrationitem import MigrationItemFactory
|
from britney2.migrationitem import MigrationItemFactory
|
||||||
from britney2.policies.policy import (AgePolicy, RCBugPolicy, PiupartsPolicy, BuildDependsPolicy, PolicyEngine,
|
from britney2.policies.policy import (AgePolicy, RCBugPolicy, PiupartsPolicy, DependsPolicy,
|
||||||
|
BuildDependsPolicy, PolicyEngine,
|
||||||
BlockPolicy, BuiltUsingPolicy, BuiltOnBuilddPolicy)
|
BlockPolicy, BuiltUsingPolicy, BuiltOnBuilddPolicy)
|
||||||
from britney2.policies.autopkgtest import AutopkgtestPolicy
|
from britney2.policies.autopkgtest import AutopkgtestPolicy
|
||||||
from britney2.utils import (log_and_format_old_libraries,
|
from britney2.utils import (log_and_format_old_libraries,
|
||||||
@ -491,6 +492,7 @@ class Britney(object):
|
|||||||
if not hasattr(self.options, 'adt_retry_url_mech'):
|
if not hasattr(self.options, 'adt_retry_url_mech'):
|
||||||
self.options.adt_retry_url_mech = ''
|
self.options.adt_retry_url_mech = ''
|
||||||
|
|
||||||
|
self._policy_engine.add_policy(DependsPolicy(self.options, self.suite_info))
|
||||||
self._policy_engine.add_policy(RCBugPolicy(self.options, self.suite_info))
|
self._policy_engine.add_policy(RCBugPolicy(self.options, self.suite_info))
|
||||||
self._policy_engine.add_policy(PiupartsPolicy(self.options, self.suite_info))
|
self._policy_engine.add_policy(PiupartsPolicy(self.options, self.suite_info))
|
||||||
if getattr(self.options, 'adt_enable') == 'yes':
|
if getattr(self.options, 'adt_enable') == 'yes':
|
||||||
|
@ -772,6 +772,122 @@ class PiupartsPolicy(BasePolicy):
|
|||||||
return summary
|
return summary
|
||||||
|
|
||||||
|
|
||||||
|
class DependsPolicy(BasePolicy):
|
||||||
|
|
||||||
|
def __init__(self, options, suite_info):
|
||||||
|
super().__init__('depends', options, suite_info,
|
||||||
|
{SuiteClass.PRIMARY_SOURCE_SUITE, SuiteClass.ADDITIONAL_SOURCE_SUITE},
|
||||||
|
ApplySrcPolicy.RUN_ON_EVERY_ARCH_ONLY)
|
||||||
|
self._britney = None
|
||||||
|
self.pkg_universe = None
|
||||||
|
self.broken_packages = None
|
||||||
|
self.all_binaries = None
|
||||||
|
self.nobreakall_arches = None
|
||||||
|
self.new_arches = None
|
||||||
|
self.break_arches = None
|
||||||
|
self.allow_uninst = None
|
||||||
|
|
||||||
|
def initialise(self, britney):
|
||||||
|
super().initialise(britney)
|
||||||
|
self._britney = britney
|
||||||
|
self.pkg_universe = britney.pkg_universe
|
||||||
|
self.broken_packages = britney.pkg_universe.broken_packages
|
||||||
|
self.all_binaries = britney.all_binaries
|
||||||
|
self.nobreakall_arches = self.options.nobreakall_arches
|
||||||
|
self.new_arches = self.options.new_arches
|
||||||
|
self.break_arches = self.options.break_arches
|
||||||
|
self.allow_uninst = britney.allow_uninst
|
||||||
|
|
||||||
|
def apply_srcarch_policy_impl(self, deps_info, item, arch, source_data_tdist,
|
||||||
|
source_data_srcdist, excuse):
|
||||||
|
verdict = PolicyVerdict.PASS
|
||||||
|
|
||||||
|
if arch in self.break_arches or arch in self.new_arches:
|
||||||
|
# we don't check these in the policy (TODO - for now?)
|
||||||
|
return verdict
|
||||||
|
|
||||||
|
source_name = item.package
|
||||||
|
source_suite = item.suite
|
||||||
|
s_source = source_suite.sources[source_name]
|
||||||
|
target_suite = self.suite_info.target_suite
|
||||||
|
|
||||||
|
packages_s_a = source_suite.binaries[arch]
|
||||||
|
packages_t_a = target_suite.binaries[arch]
|
||||||
|
|
||||||
|
my_bins = sorted(excuse.packages[arch])
|
||||||
|
|
||||||
|
for pkg_id in my_bins:
|
||||||
|
pkg_name = pkg_id.package_name
|
||||||
|
binary_u = packages_s_a[pkg_name]
|
||||||
|
pkg_arch = binary_u.architecture
|
||||||
|
|
||||||
|
if pkg_arch == 'all' and arch not in self.nobreakall_arches:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if (binary_u.source_version != source_data_srcdist.version):
|
||||||
|
# don't check cruft in unstable
|
||||||
|
continue
|
||||||
|
|
||||||
|
if (item.architecture != 'source' and pkg_arch == 'all'):
|
||||||
|
# we don't care about the existing arch: all binaries when
|
||||||
|
# checking a binNMU item, because the arch: all binaries won't
|
||||||
|
# migrate anyway
|
||||||
|
continue
|
||||||
|
|
||||||
|
if pkg_name in self.allow_uninst[arch]:
|
||||||
|
# this binary is allowed to become uninstallable, so we don't
|
||||||
|
# need to check anything
|
||||||
|
continue
|
||||||
|
|
||||||
|
if pkg_name in packages_t_a:
|
||||||
|
oldbin = packages_t_a[pkg_name]
|
||||||
|
if not target_suite.is_installable(oldbin.pkg_id):
|
||||||
|
# as the current binary in testing is already
|
||||||
|
# uninstallable, the newer version is allowed to be
|
||||||
|
# uninstallable as well, so we don't need to check
|
||||||
|
# anything
|
||||||
|
continue
|
||||||
|
|
||||||
|
if pkg_id in self.broken_packages:
|
||||||
|
# dependencies can't be satisfied by all the known binaries -
|
||||||
|
# this certainly won't work
|
||||||
|
verdict = PolicyVerdict.REJECTED_PERMANENTLY
|
||||||
|
excuse.add_verdict_info(verdict, "%s/%s has unsatisfiable dependency" % (
|
||||||
|
pkg_name, arch))
|
||||||
|
excuse.addreason("depends")
|
||||||
|
# TODO does this also need to happen on non-nobreakarch if the
|
||||||
|
# arch:all packages are uninstallable?
|
||||||
|
excuse.add_unsatisfiable_on_arch(arch)
|
||||||
|
|
||||||
|
deps = self.pkg_universe.dependencies_of(pkg_id)
|
||||||
|
|
||||||
|
for dep in deps:
|
||||||
|
# dep is a list of packages, each of which satisfy the
|
||||||
|
# dependency
|
||||||
|
|
||||||
|
if dep == frozenset():
|
||||||
|
continue
|
||||||
|
is_ok = False
|
||||||
|
needed_for_dep = set()
|
||||||
|
|
||||||
|
for alternative in dep:
|
||||||
|
if target_suite.is_pkg_in_the_suite(alternative):
|
||||||
|
# dep can be satisfied in testing - ok
|
||||||
|
is_ok = True
|
||||||
|
elif alternative in my_bins:
|
||||||
|
# can be satisfied by binary from same item: will be
|
||||||
|
# ok if item migrates
|
||||||
|
is_ok = True
|
||||||
|
else:
|
||||||
|
needed_for_dep.add(alternative)
|
||||||
|
|
||||||
|
if not is_ok:
|
||||||
|
spec = DependencySpec(DependencyType.DEPENDS, arch)
|
||||||
|
excuse.add_package_depends(spec, needed_for_dep)
|
||||||
|
|
||||||
|
return verdict
|
||||||
|
|
||||||
|
|
||||||
@unique
|
@unique
|
||||||
class BuildDepResult(IntEnum):
|
class BuildDepResult(IntEnum):
|
||||||
# relation is satisfied in target
|
# relation is satisfied in target
|
||||||
|
Loading…
x
Reference in New Issue
Block a user