mirror of
https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
synced 2025-04-22 00:21:16 +00:00
Make "Keep-installable" constraints overrule nuninst counters
If there is a regression in "present-and-installable" constraints (on non-break architectures), then discard the item even if the nuninst counters have improved. Signed-off-by: Niels Thykier <niels@thykier.net>
This commit is contained in:
parent
f3e37faf7e
commit
7ccbfe2fdf
24
britney.py
24
britney.py
@ -506,6 +506,10 @@ class Britney(object):
|
||||
no = 0
|
||||
faux_version = sys.intern('1')
|
||||
faux_section = sys.intern('faux')
|
||||
keep_installable = []
|
||||
constraints = {
|
||||
'keep-installable': keep_installable
|
||||
}
|
||||
|
||||
while step():
|
||||
no += 1
|
||||
@ -535,6 +539,7 @@ class Britney(object):
|
||||
]
|
||||
self.sources['testing'][pkg_name] = src_data
|
||||
self.sources['unstable'][pkg_name] = src_data
|
||||
keep_installable.append(pkg_name)
|
||||
for arch in self.options.architectures:
|
||||
deps = []
|
||||
for pkg_spec in pkg_list:
|
||||
@ -573,6 +578,8 @@ class Britney(object):
|
||||
self.binaries['unstable'][arch][0][pkg_name] = bin_data
|
||||
self.all_binaries[pkg_id] = bin_data
|
||||
|
||||
return constraints
|
||||
|
||||
def _build_installability_tester(self, archs):
|
||||
"""Create the installability tester"""
|
||||
|
||||
@ -2258,6 +2265,7 @@ class Britney(object):
|
||||
# removed by the item would still be counted.
|
||||
|
||||
nuninst_after = clone_nuninst(nuninst_now, packages_t, affected_architectures)
|
||||
must_be_installable = self.constraints['keep-installable']
|
||||
|
||||
# check the affected packages on all the architectures
|
||||
for arch in affected_architectures:
|
||||
@ -2267,10 +2275,17 @@ class Britney(object):
|
||||
check_archall, nuninst_after)
|
||||
|
||||
# if the uninstallability counter is worse than before, break the loop
|
||||
if automatic_revert and len(nuninst_after[arch]) > len(nuninst_now[arch]):
|
||||
if automatic_revert:
|
||||
worse = False
|
||||
if len(nuninst_after[arch]) > len(nuninst_now[arch]):
|
||||
worse = True
|
||||
else:
|
||||
regression = nuninst_after[arch] - nuninst_now[arch]
|
||||
if not regression.isdisjoint(must_be_installable):
|
||||
worse = True
|
||||
# ... except for a few special cases
|
||||
if (item.architecture != 'source' and arch not in new_arches) or \
|
||||
(arch not in break_arches):
|
||||
if worse and ((item.architecture != 'source' and arch not in new_arches) or
|
||||
(arch not in break_arches)):
|
||||
is_accepted = False
|
||||
break
|
||||
|
||||
@ -2446,7 +2461,8 @@ class Britney(object):
|
||||
# do not allow any regressions on these architectures.
|
||||
# This usually only happens with hints
|
||||
break_arches = set()
|
||||
better = is_nuninst_asgood_generous(self.options.architectures,
|
||||
better = is_nuninst_asgood_generous(self.constraints,
|
||||
self.options.architectures,
|
||||
self.nuninst_orig,
|
||||
nuninst_end,
|
||||
break_arches)
|
||||
|
@ -488,17 +488,21 @@ def old_libraries(sources, packages, fucked_arches=frozenset()):
|
||||
return removals
|
||||
|
||||
|
||||
def is_nuninst_asgood_generous(architectures, old, new, break_arches=frozenset()):
|
||||
"""Compares the nuninst counters to see if they improved
|
||||
def is_nuninst_asgood_generous(constraints, architectures, old, new, break_arches=frozenset()):
|
||||
"""Compares the nuninst counters and constraints to see if they improved
|
||||
|
||||
Given a list of architecters, the previous and the current nuninst
|
||||
Given a list of architectures, the previous and the current nuninst
|
||||
counters, this function determines if the current nuninst counter
|
||||
is better than the previous one. Optionally it also accepts a set
|
||||
of "break_arches", the nuninst counter for any architecture listed
|
||||
in this set are completely ignored.
|
||||
|
||||
If the nuninst counters are equal or better, then the constraints
|
||||
are checked for regressions (ignoring break_arches).
|
||||
|
||||
Returns True if the new nuninst counter is better than the
|
||||
previous. Returns False otherwise.
|
||||
previous and there are no constraint regressions (ignoring Break-archs).
|
||||
Returns False otherwise.
|
||||
|
||||
"""
|
||||
diff = 0
|
||||
@ -506,7 +510,16 @@ def is_nuninst_asgood_generous(architectures, old, new, break_arches=frozenset()
|
||||
if arch in break_arches:
|
||||
continue
|
||||
diff = diff + (len(new[arch]) - len(old[arch]))
|
||||
return diff <= 0
|
||||
if diff > 0:
|
||||
return False
|
||||
must_be_installable = constraints['keep-installable']
|
||||
for arch in architectures:
|
||||
if arch in break_arches:
|
||||
continue
|
||||
regression = new[arch] - old[arch]
|
||||
if not regression.isdisjoint(must_be_installable):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def clone_nuninst(nuninst, packages_s, architectures):
|
||||
|
Loading…
x
Reference in New Issue
Block a user