suiteloader: Handle NBS

If we have this situation

  - Binary in target taken over by new source
  - Not cleaned up yet
  - New source updated in source suite

We can have *three* copies of a source package visible to britney at
once. Handle this case by recording the source package a pkgid was seen
in before, and trying to remove from that and the current source.
ubuntu/dry-run
Iain Lane 5 years ago
parent 67b9f56741
commit fe748849e0

@ -304,6 +304,8 @@ class DebMirrorLikeSuiteContentLoader(SuiteContentLoader):
if packages is None: if packages is None:
packages = {} packages = {}
added_old_binaries = {}
all_binaries = self._all_binaries all_binaries = self._all_binaries
tag_file = apt_pkg.TagFile(filename) tag_file = apt_pkg.TagFile(filename)
@ -329,7 +331,21 @@ class DebMirrorLikeSuiteContentLoader(SuiteContentLoader):
continue continue
old_pkg_id = old_pkg_data.pkg_id old_pkg_id = old_pkg_data.pkg_id
old_src_binaries = srcdist[old_pkg_data.source].binaries old_src_binaries = srcdist[old_pkg_data.source].binaries
old_src_binaries.remove(old_pkg_id)
prev_src = added_old_binaries.get(old_pkg_id, old_pkg_data.source)
ps = srcdist[prev_src]
ps.binaries.remove(old_pkg_id)
try:
del added_old_binaries[old_pkg_id]
except KeyError:
pass
# Is this a take-over, i.e. is old_pkg_data pointing to the wrong source now?
cursrc_binaries = srcdist[source].binaries
if old_pkg_id in cursrc_binaries:
self.logger.info("Removing %s from %s, taken over & NBS?", old_pkg_id, source)
cursrc_binaries.remove(old_pkg_id)
# This may seem weird at first glance, but the current code rely # This may seem weird at first glance, but the current code rely
# on this behaviour to avoid issues like #709460. Admittedly it # on this behaviour to avoid issues like #709460. Admittedly it
# is a special case, but Britney will attempt to remove the # is a special case, but Britney will attempt to remove the
@ -338,6 +354,7 @@ class DebMirrorLikeSuiteContentLoader(SuiteContentLoader):
# and the version, so it is not particularly resilient. # and the version, so it is not particularly resilient.
if pkg_id not in old_src_binaries: if pkg_id not in old_src_binaries:
old_src_binaries.add(pkg_id) old_src_binaries.add(pkg_id)
added_old_binaries[pkg_id] = old_pkg_data.source
# Merge Pre-Depends with Depends and Conflicts with # Merge Pre-Depends with Depends and Conflicts with
# Breaks. Britney is not interested in the "finer # Breaks. Britney is not interested in the "finer

Loading…
Cancel
Save