solver: Merge some loops to reduce nesting level

Signed-off-by: Niels Thykier <niels@thykier.net>
This commit is contained in:
Niels Thykier 2019-01-19 18:18:11 +00:00
parent b61e1086bd
commit af20634b12
No known key found for this signature in database
GPG Key ID: A65B78DBE67C7AAC

View File

@ -146,70 +146,68 @@ class InstallabilitySolver(object):
sat_in_testing = self._inst_tester.any_of_these_are_in_the_suite sat_in_testing = self._inst_tester.any_of_these_are_in_the_suite
universe = self._universe universe = self._universe
debug_solver = self.logger.isEnabledFor(logging.DEBUG) debug_solver = self.logger.isEnabledFor(logging.DEBUG)
for r in rms: for rdep in chain.from_iterable(universe.reverse_dependencies_of(r) for r in rms):
# The binaries have reverse dependencies in testing; # The binaries have reverse dependencies in testing;
# check if we can/should migrate them first. # check if we can/should migrate them first.
for rdep in universe.reverse_dependencies_of(r): for depgroup in universe.dependencies_of(rdep):
for depgroup in universe.dependencies_of(rdep): rigid = depgroup - going_out
rigid = depgroup - going_out if sat_in_testing(rigid):
if sat_in_testing(rigid): # (partly) satisfied by testing, assume it is okay
# (partly) satisfied by testing, assume it is okay continue
if rdep in ptable:
other = ptable[rdep]
if other == key:
# "Self-dependency" => ignore
continue continue
if rdep in ptable: if debug_solver and other not in order[key]['after']: # pragma: no cover
other = ptable[rdep] self.logger.debug("Removal induced order: %s before %s", key, other)
if other == key: order[key]['after'].add(other)
# "Self-dependency" => ignore order[other]['before'].add(key)
continue
if debug_solver and other not in order[key]['after']: # pragma: no cover
self.logger.debug("Removal induced order: %s before %s", key, other)
order[key]['after'].add(other)
order[other]['before'].add(key)
def _compute_group_order_adds(self, adds, order, key, ptable, going_out, going_in): def _compute_group_order_adds(self, adds, order, key, ptable, going_out, going_in):
sat_in_testing = self._inst_tester.any_of_these_are_in_the_suite sat_in_testing = self._inst_tester.any_of_these_are_in_the_suite
universe = self._universe universe = self._universe
debug_solver = self.logger.isEnabledFor(logging.DEBUG) debug_solver = self.logger.isEnabledFor(logging.DEBUG)
for a in adds: for depgroup in chain.from_iterable(universe.dependencies_of(a) for a in adds):
# Check if this item should migrate before others # Check if this item should migrate before others
# (e.g. because they depend on a new [version of a] # (e.g. because they depend on a new [version of a]
# binary provided by this item). # binary provided by this item).
for depgroup in universe.dependencies_of(a): rigid = depgroup - going_out
rigid = depgroup - going_out if sat_in_testing(rigid):
if sat_in_testing(rigid): # (partly) satisfied by testing, assume it is okay
# (partly) satisfied by testing, assume it is okay continue
continue # okay - we got three cases now.
# okay - we got three cases now. # - "swap" (replace existing binary with a newer version)
# - "swap" (replace existing binary with a newer version) # - "addition" (add new binary without removing any)
# - "addition" (add new binary without removing any) # - "removal" (remove binary without providing a new)
# - "removal" (remove binary without providing a new) #
# # The problem is that only the two latter requires
# The problem is that only the two latter requires # an ordering. A "swap" (in itself) should not
# an ordering. A "swap" (in itself) should not # affect us.
# affect us. other_adds = set()
other_adds = set() other_rms = set()
other_rms = set() for d in ifilter_only(ptable, depgroup):
for d in ifilter_only(ptable, depgroup): other = ptable[d]
other = ptable[d] if d in going_in:
if d in going_in: # "other" provides something "key" needs,
# "other" provides something "key" needs, # schedule accordingly.
# schedule accordingly. other_adds.add(other)
other_adds.add(other) else:
else: # "other" removes something "key" needs,
# "other" removes something "key" needs, # schedule accordingly.
# schedule accordingly. other_rms.add(other)
other_rms.add(other)
for other in (other_adds - other_rms): for other in (other_adds - other_rms):
if debug_solver and other != key and other not in order[key]['after']: # pragma: no cover if debug_solver and other != key and other not in order[key]['after']: # pragma: no cover
self.logger.debug("Dependency induced order (add): %s before %s", key, other) self.logger.debug("Dependency induced order (add): %s before %s", key, other)
order[key]['after'].add(other) order[key]['after'].add(other)
order[other]['before'].add(key) order[other]['before'].add(key)
for other in (other_rms - other_adds): for other in (other_rms - other_adds):
if debug_solver and other != key and other not in order[key]['before']: # pragma: no cover if debug_solver and other != key and other not in order[key]['before']: # pragma: no cover
self.logger.debug("Dependency induced order (remove): %s before %s", key, other) self.logger.debug("Dependency induced order (remove): %s before %s", key, other)
order[key]['before'].add(other) order[key]['before'].add(other)
order[other]['after'].add(key) order[other]['after'].add(key)
def _compute_group_order(self, groups, key2item): def _compute_group_order(self, groups, key2item):
universe = self._universe universe = self._universe