~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/soyuz/model/packagecloner.py

  • Committer: Launchpad Patch Queue Manager
  • Date: 2010-07-16 17:15:56 UTC
  • mfrom: (11017.2.12 test-package-cloner)
  • Revision ID: launchpad@pqm.canonical.com-20100716171556-lqd8diiac9n493rq
[r=rockstar][ui=none] Make PackageCloner create builds,
        and add some tests for it.

Show diffs side-by-side

added added

removed removed

Lines of Context:
11
11
    ]
12
12
 
13
13
 
 
14
import transaction
 
15
 
14
16
from zope.component import getUtility
15
17
from zope.interface import implements
 
18
from zope.security.proxy import removeSecurityProxy
16
19
 
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 (
50
54
 
51
55
    implements(IPackageCloner)
52
56
 
53
 
    def clonePackages(self, origin, destination, distroarchseries_list=None):
 
57
    def clonePackages(self, origin, destination, distroarchseries_list=None,
 
58
                      proc_families=None):
54
59
        """Copies packages from origin to destination package location.
55
60
 
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.
67
73
        """
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)
77
83
 
 
84
        if proc_families is None:
 
85
            proc_families = []
 
86
 
 
87
        self._create_missing_builds(
 
88
            destination.distroseries, destination.archive, proc_families)
 
89
 
 
90
    def _create_missing_builds(self, distroseries, archive, proc_families):
 
91
        """Create builds for all cloned source packages.
 
92
 
 
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.
 
97
        """
 
98
        # Avoid circular imports.
 
99
        from lp.soyuz.interfaces.publishing import active_publishing_status
 
100
 
 
101
        # Listify the architectures to avoid hitting this MultipleJoin
 
102
        # multiple times.
 
103
        architectures = list(distroseries.architectures)
 
104
 
 
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]
 
109
 
 
110
        if len(architectures) == 0:
 
111
            return
 
112
 
 
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)
 
118
 
 
119
        def get_spn(pub):
 
120
            """Return the source package name for a publishing record."""
 
121
            return pub.sourcepackagerelease.sourcepackagename.name
 
122
 
 
123
        for pubrec in sources_published:
 
124
            pubrec.createMissingBuilds(architectures_available=architectures)
 
125
            # Commit to avoid MemoryError: bug 304459
 
126
            transaction.commit()
78
127
 
79
128
    def _clone_binary_packages(self, origin, destination, origin_das,
80
129
                              destination_das):
153
202
            """ % sqlvalues(
154
203
                PackagePublishingStatus.SUPERSEDED, UTC_NOW))
155
204
 
 
205
        def get_family(archivearch):
 
206
            """Extract the processor family from an `IArchiveArch`."""
 
207
            return removeSecurityProxy(archivearch).processorfamily
 
208
 
 
209
        proc_families = [
 
210
            get_family(archivearch) for archivearch
 
211
            in getUtility(IArchiveArchSet).getByArchive(destination.archive)]
 
212
 
 
213
        self._create_missing_builds(
 
214
            destination.distroseries, destination.archive, proc_families)
 
215
 
156
216
    def _compute_packageset_delta(self, origin):
157
217
        """Given a source/target archive find obsolete or missing packages.
158
218
 
219
279
                PackagePublishingStatus.PENDING,
220
280
                PackagePublishingStatus.PUBLISHED,
221
281
                origin.distroseries, origin.pocket)
222
 
        
 
282
 
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)
291
 
        
 
351
 
292
352
        if destination.component is not None:
293
353
            pop_query += (
294
354
                " AND secsrc.component = %s" % quote(destination.component))
389
449
        logger.info('New packages: %d' % len(new_info))
390
450
        for info in new_info:
391
451
            logger.info('* %s (%s)' % info)
392
 
 
393