launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #32871
[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.