← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~mwhudson/launchpad:no-variant-pub-unless-proc-enabled into launchpad:master

 

Michael Hudson-Doyle has proposed merging ~mwhudson/launchpad:no-variant-pub-unless-proc-enabled into launchpad:master.

Commit message:
do not copy unbuilt packages to variant das if processor not enabled in target

LP: #2127888



Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)
Related bugs:
  Bug #2127888 in Launchpad itself: "amd64v3 binaries are being published in archives without it enabled"
  https://bugs.launchpad.net/launchpad/+bug/2127888

For more details, see:
https://code.launchpad.net/~mwhudson/launchpad/+git/launchpad/+merge/494419
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~mwhudson/launchpad:no-variant-pub-unless-proc-enabled into launchpad:master.
diff --git a/lib/lp/soyuz/model/publishing.py b/lib/lp/soyuz/model/publishing.py
index ebd26cf..16ed385 100644
--- a/lib/lp/soyuz/model/publishing.py
+++ b/lib/lp/soyuz/model/publishing.py
@@ -1394,7 +1394,7 @@ class BinaryPackagePublishingHistory(StormBase, ArchivePublisherBase):
         return binary_urls
 
 
-def expand_binary_requests(distroseries, binaries):
+def expand_binary_requests(distroseries, binaries, processors):
     """Architecture-expand a dict of binary publication requests.
 
     For architecture-independent binaries, a tuple will be returned for each
@@ -1415,7 +1415,11 @@ def expand_binary_requests(distroseries, binaries):
     variant_map = {}
     for arch in archs:
         spf = arch.getSourceFilter()
-        if spf and arch.underlying_architecturetag:
+        if (
+            spf
+            and arch.underlying_architecturetag
+            and arch.processor in processors
+        ):
             variant_map.setdefault(arch.underlying_architecturetag, []).append(
                 (arch, spf)
             )
@@ -1473,7 +1477,9 @@ class PublishingSet:
                 % (distroseries.distribution.name, archive.distribution.name)
             )
 
-        expanded = expand_binary_requests(distroseries, binaries)
+        expanded = expand_binary_requests(
+            distroseries, binaries, archive.processors
+        )
         if len(expanded) == 0:
             # The binaries are for a disabled DistroArchSeries or for
             # an unsupported architecture.
diff --git a/lib/lp/soyuz/tests/test_publishing.py b/lib/lp/soyuz/tests/test_publishing.py
index 8d4be0a..91eb2e8 100644
--- a/lib/lp/soyuz/tests/test_publishing.py
+++ b/lib/lp/soyuz/tests/test_publishing.py
@@ -2138,6 +2138,11 @@ class TestPublishBinaries(TestCaseWithFactory):
         bpr = self.factory.makeBinaryPackageRelease(
             build=build, architecturespecific=True
         )
+        archive = target_das.distroseries.main_archive
+        archive.setProcessors(
+            archive.processors + [target_variant_das.processor]
+        )
+
         args = self.makeArgs([bpr], target_das.distroseries)
         bpphes = list(getUtility(IPublishingSet).publishBinaries(**args))
         self.assertEqual(len(bpphes), 2)
@@ -2146,6 +2151,38 @@ class TestPublishBinaries(TestCaseWithFactory):
         self.assertEqual(actual_target_dases, {target_das, target_variant_das})
         self.assertEqual(actual_bprs, {bpr})
 
+    def test_architecture_variant_processor_not_enabled(self):
+        # When a package is not built for a variant, the binaries for
+        # the underlying architecture are published to the variant
+        # DAS, unless the target archive does not have the relevant
+        # processor enabled.
+        arch_tag = self.factory.getUniqueString("arch-")
+        orig_das = self.factory.makeDistroArchSeries(architecturetag=arch_tag)
+        target_das = self.factory.makeDistroArchSeries(
+            architecturetag=arch_tag
+        )
+        target_variant_das = self.factory.makeDistroArchSeries(
+            distroseries=target_das.distroseries,
+            architecturetag=arch_tag + "v2",
+            underlying_architecturetag=arch_tag,
+        )
+        dasf = self.factory.makeDistroArchSeriesFilter(
+            distroarchseries=target_variant_das,
+            sense=DistroArchSeriesFilterSense.EXCLUDE,
+        )
+        build = self.factory.makeBinaryPackageBuild(distroarchseries=orig_das)
+        dasf.packageset.add([build.source_package_release.sourcepackagename])
+        bpr = self.factory.makeBinaryPackageRelease(
+            build=build, architecturespecific=True
+        )
+        args = self.makeArgs([bpr], target_das.distroseries)
+        bpphes = list(getUtility(IPublishingSet).publishBinaries(**args))
+        self.assertEqual(len(bpphes), 1)
+        actual_target_dases = {bpph.distroarchseries for bpph in bpphes}
+        actual_bprs = {bpph.binarypackagerelease for bpph in bpphes}
+        self.assertEqual(actual_target_dases, {target_das})
+        self.assertEqual(actual_bprs, {bpr})
+
     def test_architecture_independent(self):
         # Architecture-independent binaries get published to all enabled
         # DASes in the series.

Follow ups