← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~mwhudson/launchpad:copy-up-unvarianted-packages into launchpad:master

 

Michael Hudson-Doyle has proposed merging ~mwhudson/launchpad:copy-up-unvarianted-packages into launchpad:master with ~mwhudson/launchpad:add-distroseries-underlying-arch-model as a prerequisite.

Commit message:
publish binaries to a variant das if the source is filtered out for the variant



Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~mwhudson/launchpad/+git/launchpad/+merge/490790

I'm not sure how performance sensitive this code is. I guess it's relatively rare for large numbers of binaries to be published at once?
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~mwhudson/launchpad:copy-up-unvarianted-packages into launchpad:master.
diff --git a/lib/lp/soyuz/model/publishing.py b/lib/lp/soyuz/model/publishing.py
index 2214e2e..d0e1a9a 100644
--- a/lib/lp/soyuz/model/publishing.py
+++ b/lib/lp/soyuz/model/publishing.py
@@ -1410,9 +1410,15 @@ def expand_binary_requests(distroseries, binaries):
         published, as a sequence of (`DistroArchSeries`,
         `BinaryPackageRelease`, (overrides)) tuples.
     """
-
     archs = list(distroseries.enabled_architectures)
     arch_map = {arch.architecturetag: arch for arch in archs}
+    variant_map = {}
+    for arch in archs:
+        spf = arch.getSourceFilter()
+        if spf and arch.underlying_architecturetag:
+            variant_map.setdefault(arch.underlying_architecturetag, []).append(
+                (arch, spf)
+            )
 
     expanded = []
     for bpr, overrides in binaries.items():
@@ -1422,6 +1428,12 @@ def expand_binary_requests(distroseries, binaries):
             # not publish.
             target_arch = arch_map.get((bpr.build or bpr.ci_build).arch_tag)
             target_archs = [target_arch] if target_arch is not None else []
+            for variant_arch, spf in variant_map.get(
+                target_arch.architecturetag, []
+            ):
+                spn = bpr.build.source_package_release.sourcepackagename
+                if not spf.isSourceIncluded(spn):
+                    target_archs.append(variant_arch)
         else:
             target_archs = archs
         for target_arch in target_archs:
diff --git a/lib/lp/soyuz/tests/test_publishing.py b/lib/lp/soyuz/tests/test_publishing.py
index efcc4dd..dc9b38e 100644
--- a/lib/lp/soyuz/tests/test_publishing.py
+++ b/lib/lp/soyuz/tests/test_publishing.py
@@ -52,6 +52,7 @@ from lp.soyuz.enums import (
     ArchivePurpose,
     ArchiveRepositoryFormat,
     BinaryPackageFormat,
+    DistroArchSeriesFilterSense,
     PackageUploadStatus,
 )
 from lp.soyuz.interfaces.binarypackagename import IBinaryPackageNameSet
@@ -2115,6 +2116,36 @@ class TestPublishBinaries(TestCaseWithFactory):
         )
         self.assertEqual(PackagePublishingStatus.PENDING, bpph.status)
 
+    def test_architecture_variant(self):
+        # When a package is not built for a variant, the binaries for
+        # the underlying architecture are published to the variant DAS.
+        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), 2)
+        actual_target_dases = {bpph.distroarchseries for bpph in bpphes}
+        actual_bprs = {bpph.binarypackagerelease for bpph in bpphes1}
+        self.assertEqual(actual_target_dases, {target_das, target_variant_das})
+        self.assertEqual(actual_bprs, {bpr})
+
     def test_architecture_independent(self):
         # Architecture-independent binaries get published to all enabled
         # DASes in the series.