14
16
from zope.component import getUtility
15
17
from zope.interface import implements
18
from zope.security.proxy import removeSecurityProxy
17
20
from canonical.database.constants import UTC_NOW
18
21
from canonical.database.sqlbase import quote, sqlvalues
22
from lp.soyuz.interfaces.archivearch import IArchiveArchSet
19
23
from lp.soyuz.interfaces.publishing import PackagePublishingStatus
20
24
from lp.soyuz.interfaces.packagecloner import IPackageCloner
21
25
from canonical.launchpad.webapp.interfaces import (
51
55
implements(IPackageCloner)
53
def clonePackages(self, origin, destination, distroarchseries_list=None):
57
def clonePackages(self, origin, destination, distroarchseries_list=None,
54
59
"""Copies packages from origin to destination package location.
56
61
Binary packages are only copied for the `DistroArchSeries` pairs
64
69
distroarchseries instances.
65
70
@param distroarchseries_list: the binary packages will be copied
66
71
for the distroarchseries pairs specified (if any).
72
@param the processor families to create builds for.
68
74
# First clone the source packages.
69
75
self._clone_source_packages(origin, destination)
75
81
self._clone_binary_packages(
76
82
origin, destination, origin_das, destination_das)
84
if proc_families is None:
87
self._create_missing_builds(
88
destination.distroseries, destination.archive, proc_families)
90
def _create_missing_builds(self, distroseries, archive, proc_families):
91
"""Create builds for all cloned source packages.
93
:param distroseries: the distro series for which to create builds.
94
:param archive: the archive for which to create builds.
95
:param proc_families: the list of processor families for
96
which to create builds.
98
# Avoid circular imports.
99
from lp.soyuz.interfaces.publishing import active_publishing_status
101
# Listify the architectures to avoid hitting this MultipleJoin
103
architectures = list(distroseries.architectures)
105
# Filter the list of DistroArchSeries so that only the ones
106
# specified in proc_families remain
107
architectures = [architecture for architecture in architectures
108
if architecture.processorfamily in proc_families]
110
if len(architectures) == 0:
113
# Both, PENDING and PUBLISHED sources will be considered for
114
# as PUBLISHED. It's part of the assumptions made in:
115
# https://launchpad.net/soyuz/+spec/build-unpublished-source
116
sources_published = archive.getPublishedSources(
117
distroseries=distroseries, status=active_publishing_status)
120
"""Return the source package name for a publishing record."""
121
return pub.sourcepackagerelease.sourcepackagename.name
123
for pubrec in sources_published:
124
pubrec.createMissingBuilds(architectures_available=architectures)
125
# Commit to avoid MemoryError: bug 304459
79
128
def _clone_binary_packages(self, origin, destination, origin_das,
154
203
PackagePublishingStatus.SUPERSEDED, UTC_NOW))
205
def get_family(archivearch):
206
"""Extract the processor family from an `IArchiveArch`."""
207
return removeSecurityProxy(archivearch).processorfamily
210
get_family(archivearch) for archivearch
211
in getUtility(IArchiveArchSet).getByArchive(destination.archive)]
213
self._create_missing_builds(
214
destination.distroseries, destination.archive, proc_families)
156
216
def _compute_packageset_delta(self, origin):
157
217
"""Given a source/target archive find obsolete or missing packages.
219
279
PackagePublishingStatus.PENDING,
220
280
PackagePublishingStatus.PUBLISHED,
221
281
origin.distroseries, origin.pocket)
223
283
if origin.component is not None:
224
284
find_origin_only_packages += (
225
285
" AND secsrc.component = %s" % quote(origin.component))
288
348
PackagePublishingStatus.PENDING,
289
349
PackagePublishingStatus.PUBLISHED,
290
350
destination.distroseries, destination.pocket)
292
352
if destination.component is not None:
294
354
" AND secsrc.component = %s" % quote(destination.component))