mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-06-09 08:41:34 +00:00
Move build_installability_tester to builder.py
Signed-off-by: Niels Thykier <niels@thykier.net>
This commit is contained in:
parent
7a63784876
commit
0cc7f7a8d2
91
britney.py
91
britney.py
@ -185,7 +185,6 @@ import sys
|
|||||||
import time
|
import time
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
from itertools import product
|
|
||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote
|
||||||
|
|
||||||
@ -196,7 +195,7 @@ from britney2 import SuiteInfo, SourcePackage, BinaryPackageId, BinaryPackage
|
|||||||
from britney2.consts import (SOURCE, SOURCEVER, ARCHITECTURE, CONFLICTS, DEPENDS, PROVIDES, MULTIARCH)
|
from britney2.consts import (SOURCE, SOURCEVER, ARCHITECTURE, CONFLICTS, DEPENDS, PROVIDES, MULTIARCH)
|
||||||
from britney2.excuse import Excuse
|
from britney2.excuse import Excuse
|
||||||
from britney2.hints import HintParser
|
from britney2.hints import HintParser
|
||||||
from britney2.installability.builder import InstallabilityTesterBuilder
|
from britney2.installability.builder import build_installability_tester
|
||||||
from britney2.migrationitem import MigrationItem
|
from britney2.migrationitem import MigrationItem
|
||||||
from britney2.policies.policy import AgePolicy, RCBugPolicy, PolicyVerdict
|
from britney2.policies.policy import AgePolicy, RCBugPolicy, PolicyVerdict
|
||||||
from britney2.utils import (old_libraries_format, undo_changes,
|
from britney2.utils import (old_libraries_format, undo_changes,
|
||||||
@ -330,7 +329,7 @@ class Britney(object):
|
|||||||
}
|
}
|
||||||
|
|
||||||
self.log("Compiling Installability tester", type="I")
|
self.log("Compiling Installability tester", type="I")
|
||||||
self._build_installability_tester(self.options.architectures)
|
self._inst_tester = build_installability_tester(self.binaries, self.options.architectures)
|
||||||
|
|
||||||
if not self.options.nuninst_cache:
|
if not self.options.nuninst_cache:
|
||||||
self.log("Building the list of non-installable packages for the full archive", type="I")
|
self.log("Building the list of non-installable packages for the full archive", type="I")
|
||||||
@ -682,92 +681,6 @@ class Britney(object):
|
|||||||
|
|
||||||
return constraints
|
return constraints
|
||||||
|
|
||||||
def _build_installability_tester(self, archs):
|
|
||||||
"""Create the installability tester"""
|
|
||||||
|
|
||||||
solvers = get_dependency_solvers
|
|
||||||
binaries = self.binaries
|
|
||||||
builder = InstallabilityTesterBuilder()
|
|
||||||
|
|
||||||
for (dist, arch) in product(binaries, archs):
|
|
||||||
testing = (dist == 'testing')
|
|
||||||
for pkgname in binaries[dist][arch][0]:
|
|
||||||
pkgdata = binaries[dist][arch][0][pkgname]
|
|
||||||
pkg_id = pkgdata.pkg_id
|
|
||||||
if not builder.add_binary(pkg_id, essential=pkgdata.is_essential,
|
|
||||||
in_testing=testing):
|
|
||||||
continue
|
|
||||||
|
|
||||||
depends = []
|
|
||||||
conflicts = []
|
|
||||||
possible_dep_ranges = {}
|
|
||||||
|
|
||||||
# We do not differentiate between depends and pre-depends
|
|
||||||
if pkgdata.depends:
|
|
||||||
depends.extend(apt_pkg.parse_depends(pkgdata.depends, False))
|
|
||||||
|
|
||||||
if pkgdata.conflicts:
|
|
||||||
conflicts = apt_pkg.parse_depends(pkgdata.conflicts, False)
|
|
||||||
|
|
||||||
with builder.relation_builder(pkg_id) as relations:
|
|
||||||
|
|
||||||
for (al, dep) in [(depends, True), \
|
|
||||||
(conflicts, False)]:
|
|
||||||
|
|
||||||
for block in al:
|
|
||||||
sat = set()
|
|
||||||
|
|
||||||
for dep_dist in binaries:
|
|
||||||
dep_binaries_s_a, dep_provides_s_a = binaries[dep_dist][arch]
|
|
||||||
pkgs = solvers(block, dep_binaries_s_a, dep_provides_s_a)
|
|
||||||
for p in pkgs:
|
|
||||||
# version and arch is already interned, but solvers use
|
|
||||||
# the package name extracted from the field and it is therefore
|
|
||||||
# not interned.
|
|
||||||
pdata = dep_binaries_s_a[p]
|
|
||||||
dep_pkg_id = pdata.pkg_id
|
|
||||||
if dep:
|
|
||||||
sat.add(dep_pkg_id)
|
|
||||||
elif pkg_id != dep_pkg_id:
|
|
||||||
# if t satisfies its own
|
|
||||||
# conflicts relation, then it
|
|
||||||
# is using §7.6.2
|
|
||||||
relations.add_breaks(dep_pkg_id)
|
|
||||||
if dep:
|
|
||||||
if len(block) != 1:
|
|
||||||
relations.add_dependency_clause(sat)
|
|
||||||
else:
|
|
||||||
# This dependency might be a part
|
|
||||||
# of a version-range a la:
|
|
||||||
#
|
|
||||||
# Depends: pkg-a (>= 1),
|
|
||||||
# pkg-a (<< 2~)
|
|
||||||
#
|
|
||||||
# In such a case we want to reduce
|
|
||||||
# that to a single clause for
|
|
||||||
# efficiency.
|
|
||||||
#
|
|
||||||
# In theory, it could also happen
|
|
||||||
# with "non-minimal" dependencies
|
|
||||||
# a la:
|
|
||||||
#
|
|
||||||
# Depends: pkg-a, pkg-a (>= 1)
|
|
||||||
#
|
|
||||||
# But dpkg is known to fix that up
|
|
||||||
# at build time, so we will
|
|
||||||
# probably only see "ranges" here.
|
|
||||||
key = block[0][0]
|
|
||||||
if key in possible_dep_ranges:
|
|
||||||
possible_dep_ranges[key] &= sat
|
|
||||||
else:
|
|
||||||
possible_dep_ranges[key] = sat
|
|
||||||
|
|
||||||
if dep:
|
|
||||||
for clause in possible_dep_ranges.values():
|
|
||||||
relations.add_dependency_clause(clause)
|
|
||||||
|
|
||||||
self._inst_tester = builder.build()
|
|
||||||
|
|
||||||
# Data reading/writing methods
|
# Data reading/writing methods
|
||||||
# ----------------------------
|
# ----------------------------
|
||||||
|
|
||||||
|
@ -12,13 +12,101 @@
|
|||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
|
|
||||||
|
import apt_pkg
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
from itertools import product
|
||||||
|
|
||||||
from britney2.utils import ifilter_except, iter_except
|
from britney2.utils import ifilter_except, iter_except, get_dependency_solvers
|
||||||
from britney2.installability.solver import InstallabilitySolver
|
from britney2.installability.solver import InstallabilitySolver
|
||||||
|
|
||||||
|
|
||||||
|
def build_installability_tester(binaries, archs):
|
||||||
|
"""Create the installability tester"""
|
||||||
|
|
||||||
|
solvers = get_dependency_solvers
|
||||||
|
builder = InstallabilityTesterBuilder()
|
||||||
|
|
||||||
|
for (dist, arch) in product(binaries, archs):
|
||||||
|
testing = (dist == 'testing')
|
||||||
|
for pkgname in binaries[dist][arch][0]:
|
||||||
|
pkgdata = binaries[dist][arch][0][pkgname]
|
||||||
|
pkg_id = pkgdata.pkg_id
|
||||||
|
if not builder.add_binary(pkg_id,
|
||||||
|
essential=pkgdata.is_essential,
|
||||||
|
in_testing=testing):
|
||||||
|
continue
|
||||||
|
|
||||||
|
depends = []
|
||||||
|
conflicts = []
|
||||||
|
possible_dep_ranges = {}
|
||||||
|
|
||||||
|
# We do not differentiate between depends and pre-depends
|
||||||
|
if pkgdata.depends:
|
||||||
|
depends.extend(apt_pkg.parse_depends(pkgdata.depends, False))
|
||||||
|
|
||||||
|
if pkgdata.conflicts:
|
||||||
|
conflicts = apt_pkg.parse_depends(pkgdata.conflicts, False)
|
||||||
|
|
||||||
|
with builder.relation_builder(pkg_id) as relations:
|
||||||
|
|
||||||
|
for (al, dep) in [(depends, True), (conflicts, False)]:
|
||||||
|
|
||||||
|
for block in al:
|
||||||
|
sat = set()
|
||||||
|
|
||||||
|
for dep_dist in binaries:
|
||||||
|
dep_binaries_s_a, dep_provides_s_a = binaries[dep_dist][arch]
|
||||||
|
pkgs = solvers(block, dep_binaries_s_a, dep_provides_s_a)
|
||||||
|
for p in pkgs:
|
||||||
|
# version and arch is already interned, but solvers use
|
||||||
|
# the package name extracted from the field and it is therefore
|
||||||
|
# not interned.
|
||||||
|
pdata = dep_binaries_s_a[p]
|
||||||
|
dep_pkg_id = pdata.pkg_id
|
||||||
|
if dep:
|
||||||
|
sat.add(dep_pkg_id)
|
||||||
|
elif pkg_id != dep_pkg_id:
|
||||||
|
# if t satisfies its own
|
||||||
|
# conflicts relation, then it
|
||||||
|
# is using §7.6.2
|
||||||
|
relations.add_breaks(dep_pkg_id)
|
||||||
|
if dep:
|
||||||
|
if len(block) != 1:
|
||||||
|
relations.add_dependency_clause(sat)
|
||||||
|
else:
|
||||||
|
# This dependency might be a part
|
||||||
|
# of a version-range a la:
|
||||||
|
#
|
||||||
|
# Depends: pkg-a (>= 1),
|
||||||
|
# pkg-a (<< 2~)
|
||||||
|
#
|
||||||
|
# In such a case we want to reduce
|
||||||
|
# that to a single clause for
|
||||||
|
# efficiency.
|
||||||
|
#
|
||||||
|
# In theory, it could also happen
|
||||||
|
# with "non-minimal" dependencies
|
||||||
|
# a la:
|
||||||
|
#
|
||||||
|
# Depends: pkg-a, pkg-a (>= 1)
|
||||||
|
#
|
||||||
|
# But dpkg is known to fix that up
|
||||||
|
# at build time, so we will
|
||||||
|
# probably only see "ranges" here.
|
||||||
|
key = block[0][0]
|
||||||
|
if key in possible_dep_ranges:
|
||||||
|
possible_dep_ranges[key] &= sat
|
||||||
|
else:
|
||||||
|
possible_dep_ranges[key] = sat
|
||||||
|
|
||||||
|
if dep:
|
||||||
|
for clause in possible_dep_ranges.values():
|
||||||
|
relations.add_dependency_clause(clause)
|
||||||
|
|
||||||
|
return builder.build()
|
||||||
|
|
||||||
|
|
||||||
class _RelationBuilder(object):
|
class _RelationBuilder(object):
|
||||||
"""Private helper class to "build" relations"""
|
"""Private helper class to "build" relations"""
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user