Merge lp:~wgrant/launchpad/abpb into lp:launchpad

Proposed by William Grant
Status: Work in progress
Proposed branch: lp:~wgrant/launchpad/abpb
Merge into: lp:launchpad
Prerequisite: lp:~wgrant/launchpad/archive-build-navigation
Diff against target: 781 lines (+249/-42)
25 files modified
lib/lp/buildmaster/browser/builder.py (+6/-1)
lib/lp/buildmaster/interfaces/buildfarmjob.py (+1/-0)
lib/lp/buildmaster/model/builder.py (+8/-2)
lib/lp/registry/model/distribution.py (+3/-1)
lib/lp/registry/model/distroseries.py (+3/-1)
lib/lp/registry/model/sourcepackage.py (+4/-1)
lib/lp/security.py (+2/-1)
lib/lp/soyuz/browser/archive.py (+8/-2)
lib/lp/soyuz/browser/build.py (+36/-0)
lib/lp/soyuz/browser/configure.zcml (+3/-0)
lib/lp/soyuz/browser/distributionsourcepackagerelease.py (+9/-3)
lib/lp/soyuz/configure.zcml (+13/-0)
lib/lp/soyuz/interfaces/binarypackagebuild.py (+20/-0)
lib/lp/soyuz/model/archive.py (+6/-2)
lib/lp/soyuz/model/binarypackagebuild.py (+63/-0)
lib/lp/soyuz/model/distributionsourcepackagerelease.py (+7/-2)
lib/lp/soyuz/model/distroarchseries.py (+5/-1)
lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py (+4/-1)
lib/lp/soyuz/model/distroseriessourcepackagerelease.py (+7/-3)
lib/lp/soyuz/model/publishing.py (+11/-8)
lib/lp/soyuz/model/queue.py (+8/-3)
lib/lp/soyuz/scripts/tests/test_copypackage.py (+6/-2)
lib/lp/soyuz/stories/soyuz/xx-private-builds.txt (+5/-3)
lib/lp/soyuz/tests/test_hasbuildrecords.py (+6/-4)
lib/lp/soyuz/tests/test_packageupload.py (+5/-1)
To merge this branch: bzr merge lp:~wgrant/launchpad/abpb
Reviewer Review Type Date Requested Status
Launchpad code reviewers Pending
Review via email: mp+218379@code.launchpad.net
To post a comment you must log in.
lp:~wgrant/launchpad/abpb updated
17005. By William Grant

Adjust the three +build traversals to return ArchiveBinaryPackageBuilds.

17006. By William Grant

Stop decorating BPBs into ABPBs manually. Use decorate_binarypackagebuilds instead.

17007. By William Grant

Decorate them in Builder.getBuildRecords too.

17008. By William Grant

Fix test_hasbuildrecords to unwrap.

17009. By William Grant

Fix test_copy_source_and_binaries_from_ppa_does_not_create_builds to compare the BPBs, not the ABPBs. The ABPBs from different archives clearly must differ.

17010. By William Grant

Fix lint.

17011. By William Grant

Fix ArchiveBuildUrl to return the DSPR in the ABPB's distro, not the BPB's original distro.

Unmerged revisions

17011. By William Grant

Fix ArchiveBuildUrl to return the DSPR in the ABPB's distro, not the BPB's original distro.

17010. By William Grant

Fix lint.

17009. By William Grant

Fix test_copy_source_and_binaries_from_ppa_does_not_create_builds to compare the BPBs, not the ABPBs. The ABPBs from different archives clearly must differ.

17008. By William Grant

Fix test_hasbuildrecords to unwrap.

17007. By William Grant

Decorate them in Builder.getBuildRecords too.

17006. By William Grant

Stop decorating BPBs into ABPBs manually. Use decorate_binarypackagebuilds instead.

17005. By William Grant

Adjust the three +build traversals to return ArchiveBinaryPackageBuilds.

17004. By William Grant

Merge archive-build-navigation.

17003. By William Grant

Fix xx-private-builds.txt to cope with the fact that builds copied into the primary archive now have URLs under the primary archive.

17002. By William Grant

Add build_farm_job_id to IBinaryPackageBuild so it gets delegated through ABPB.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/buildmaster/browser/builder.py'
--- lib/lp/buildmaster/browser/builder.py 2014-05-06 09:11:14 +0000
+++ lib/lp/buildmaster/browser/builder.py 2014-05-12 07:22:06 +0000
@@ -64,6 +64,10 @@
64 get_build_by_id_str,64 get_build_by_id_str,
65 )65 )
66from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuildSet66from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuildSet
67from lp.soyuz.model.binarypackagebuild import (
68 BUILD_ARCHIVE,
69 decorate_binarypackagebuilds,
70 )
6771
6872
69class BuilderSetNavigation(GetitemNavigation):73class BuilderSetNavigation(GetitemNavigation):
@@ -75,7 +79,8 @@
75 build = get_build_by_id_str(IBinaryPackageBuildSet, name)79 build = get_build_by_id_str(IBinaryPackageBuildSet, name)
76 if build is None:80 if build is None:
77 return None81 return None
78 return self.redirectSubTree(canonical_url(build))82 return self.redirectSubTree(canonical_url(
83 decorate_binarypackagebuilds([build], archive=BUILD_ARCHIVE)[0]))
7984
80 @stepthrough('+recipebuild')85 @stepthrough('+recipebuild')
81 def traverse_recipebuild(self, name):86 def traverse_recipebuild(self, name):
8287
=== modified file 'lib/lp/buildmaster/interfaces/buildfarmjob.py'
--- lib/lp/buildmaster/interfaces/buildfarmjob.py 2013-11-21 04:13:12 +0000
+++ lib/lp/buildmaster/interfaces/buildfarmjob.py 2014-05-12 07:22:06 +0000
@@ -65,6 +65,7 @@
65 id = Attribute('The build farm job ID.')65 id = Attribute('The build farm job ID.')
6666
67 build_farm_job = Attribute('Generic build farm job record')67 build_farm_job = Attribute('Generic build farm job record')
68 build_farm_job_id = Attribute('The BuildFarmJobDB ID.')
6869
69 processor = Reference(70 processor = Reference(
70 IProcessor, title=_("Processor"), required=False, readonly=True,71 IProcessor, title=_("Processor"), required=False, readonly=True,
7172
=== modified file 'lib/lp/buildmaster/model/builder.py'
--- lib/lp/buildmaster/model/builder.py 2013-11-28 09:12:45 +0000
+++ lib/lp/buildmaster/model/builder.py 2014-05-12 07:22:06 +0000
@@ -186,9 +186,15 @@
186 def getBuildRecords(self, build_state=None, name=None, pocket=None,186 def getBuildRecords(self, build_state=None, name=None, pocket=None,
187 arch_tag=None, user=None, binary_only=True):187 arch_tag=None, user=None, binary_only=True):
188 """See IHasBuildRecords."""188 """See IHasBuildRecords."""
189 from lp.soyuz.model.binarypackagebuild import (
190 BUILD_ARCHIVE,
191 decorate_binarypackagebuilds,
192 )
189 if binary_only:193 if binary_only:
190 return getUtility(IBinaryPackageBuildSet).getBuildsForBuilder(194 return decorate_binarypackagebuilds(
191 self.id, build_state, name, pocket, arch_tag, user)195 getUtility(IBinaryPackageBuildSet).getBuildsForBuilder(
196 self.id, build_state, name, pocket, arch_tag, user),
197 archive=BUILD_ARCHIVE)
192 else:198 else:
193 if arch_tag is not None or name is not None or pocket is not None:199 if arch_tag is not None or name is not None or pocket is not None:
194 raise IncompatibleArguments(200 raise IncompatibleArguments(
195201
=== modified file 'lib/lp/registry/model/distribution.py'
--- lib/lp/registry/model/distribution.py 2014-01-07 01:45:40 +0000
+++ lib/lp/registry/model/distribution.py 2014-05-12 07:22:06 +0000
@@ -170,6 +170,7 @@
170from lp.soyuz.interfaces.buildrecords import IHasBuildRecords170from lp.soyuz.interfaces.buildrecords import IHasBuildRecords
171from lp.soyuz.interfaces.publishing import active_publishing_status171from lp.soyuz.interfaces.publishing import active_publishing_status
172from lp.soyuz.model.archive import Archive172from lp.soyuz.model.archive import Archive
173from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds
173from lp.soyuz.model.binarypackagename import BinaryPackageName174from lp.soyuz.model.binarypackagename import BinaryPackageName
174from lp.soyuz.model.distributionsourcepackagerelease import (175from lp.soyuz.model.distributionsourcepackagerelease import (
175 DistributionSourcePackageRelease,176 DistributionSourcePackageRelease,
@@ -951,8 +952,9 @@
951 # now).952 # now).
952 # The "binary_only" option is not yet supported for953 # The "binary_only" option is not yet supported for
953 # IDistribution.954 # IDistribution.
954 return getUtility(IBinaryPackageBuildSet).getBuildsForDistro(955 bpbs = getUtility(IBinaryPackageBuildSet).getBuildsForDistro(
955 self, build_state, name, pocket, arch_tag)956 self, build_state, name, pocket, arch_tag)
957 return decorate_binarypackagebuilds(bpbs, archive=self.main_archive)
956958
957 def searchSourcePackageCaches(959 def searchSourcePackageCaches(
958 self, text, has_packaging=None, publishing_distroseries=None):960 self, text, has_packaging=None, publishing_distroseries=None):
959961
=== modified file 'lib/lp/registry/model/distroseries.py'
--- lib/lp/registry/model/distroseries.py 2014-01-06 14:24:05 +0000
+++ lib/lp/registry/model/distroseries.py 2014-05-12 07:22:06 +0000
@@ -135,6 +135,7 @@
135from lp.soyuz.interfaces.sourcepackageformat import (135from lp.soyuz.interfaces.sourcepackageformat import (
136 ISourcePackageFormatSelectionSet,136 ISourcePackageFormatSelectionSet,
137 )137 )
138from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds
138from lp.soyuz.model.binarypackagename import BinaryPackageName139from lp.soyuz.model.binarypackagename import BinaryPackageName
139from lp.soyuz.model.component import Component140from lp.soyuz.model.component import Component
140from lp.soyuz.model.distroarchseries import (141from lp.soyuz.model.distroarchseries import (
@@ -1014,8 +1015,9 @@
1014 # Ignore "user", since it would not make any difference to the1015 # Ignore "user", since it would not make any difference to the
1015 # records returned here (private builds are only in PPA right1016 # records returned here (private builds are only in PPA right
1016 # now). We also ignore binary_only and always return binaries.1017 # now). We also ignore binary_only and always return binaries.
1017 return getUtility(IBinaryPackageBuildSet).getBuildsForDistro(1018 bpbs = getUtility(IBinaryPackageBuildSet).getBuildsForDistro(
1018 self, build_state, name, pocket, arch_tag)1019 self, build_state, name, pocket, arch_tag)
1020 return decorate_binarypackagebuilds(bpbs, archive=self.main_archive)
10191021
1020 def createUploadedSourcePackageRelease(1022 def createUploadedSourcePackageRelease(
1021 self, sourcepackagename, version, maintainer, builddepends,1023 self, sourcepackagename, version, maintainer, builddepends,
10221024
=== modified file 'lib/lp/registry/model/sourcepackage.py'
--- lib/lp/registry/model/sourcepackage.py 2013-11-19 02:51:24 +0000
+++ lib/lp/registry/model/sourcepackage.py 2014-05-12 07:22:06 +0000
@@ -75,6 +75,7 @@
75from lp.soyuz.model.binarypackagebuild import (75from lp.soyuz.model.binarypackagebuild import (
76 BinaryPackageBuild,76 BinaryPackageBuild,
77 BinaryPackageBuildSet,77 BinaryPackageBuildSet,
78 decorate_binarypackagebuilds,
78 )79 )
79from lp.soyuz.model.distributionsourcepackagerelease import (80from lp.soyuz.model.distributionsourcepackagerelease import (
80 DistributionSourcePackageRelease,81 DistributionSourcePackageRelease,
@@ -656,8 +657,10 @@
656657
657 # End of duplication (see XXX cprov 2006-09-25 above).658 # End of duplication (see XXX cprov 2006-09-25 above).
658659
659 return IStore(BinaryPackageBuild).using(clauseTables).find(660 bpbs = IStore(BinaryPackageBuild).using(clauseTables).find(
660 BinaryPackageBuild, *condition_clauses).order_by(*orderBy)661 BinaryPackageBuild, *condition_clauses).order_by(*orderBy)
662 return decorate_binarypackagebuilds(
663 bpbs, archive=self.distribution.main_archive)
661664
662 @property665 @property
663 def latest_published_component(self):666 def latest_published_component(self):
664667
=== modified file 'lib/lp/security.py'
--- lib/lp/security.py 2014-03-17 21:50:33 +0000
+++ lib/lp/security.py 2014-05-12 07:22:06 +0000
@@ -21,6 +21,7 @@
21 queryAdapter,21 queryAdapter,
22 )22 )
23from zope.interface import Interface23from zope.interface import Interface
24from zope.security.proxy import removeSecurityProxy
2425
25from lp.answers.interfaces.faq import IFAQ26from lp.answers.interfaces.faq import IFAQ
26from lp.answers.interfaces.faqtarget import IFAQTarget27from lp.answers.interfaces.faqtarget import IFAQTarget
@@ -1874,7 +1875,7 @@
1874 # user to retry build if so.1875 # user to retry build if so.
1875 # strict_component is True because the source package already exists,1876 # strict_component is True because the source package already exists,
1876 # otherwise, how can they give it back?1877 # otherwise, how can they give it back?
1877 check_perms = self.obj.archive.checkUpload(1878 check_perms = removeSecurityProxy(self.obj.archive).checkUpload(
1878 user.person, self.obj.distro_series,1879 user.person, self.obj.distro_series,
1879 self.obj.source_package_release.sourcepackagename,1880 self.obj.source_package_release.sourcepackagename,
1880 self.obj.current_component, self.obj.pocket,1881 self.obj.current_component, self.obj.pocket,
18811882
=== modified file 'lib/lp/soyuz/browser/archive.py'
--- lib/lp/soyuz/browser/archive.py 2014-05-06 09:11:14 +0000
+++ lib/lp/soyuz/browser/archive.py 2014-05-12 07:22:06 +0000
@@ -164,6 +164,7 @@
164 Archive,164 Archive,
165 validate_ppa,165 validate_ppa,
166 )166 )
167from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds
167from lp.soyuz.model.publishing import SourcePackagePublishingHistory168from lp.soyuz.model.publishing import SourcePackagePublishingHistory
168from lp.soyuz.scripts.packagecopier import check_copy_permissions169from lp.soyuz.scripts.packagecopier import check_copy_permissions
169170
@@ -238,9 +239,14 @@
238 @stepthrough('+build')239 @stepthrough('+build')
239 def traverse_build(self, name):240 def traverse_build(self, name):
240 build = get_build_by_id_str(IBinaryPackageBuildSet, name)241 build = get_build_by_id_str(IBinaryPackageBuildSet, name)
241 if build is None or build.archive != self.context:242 # XXX: This should check whether self.context is build.archive
243 # or has some of the build's binaries published in it.
244 if (build is None
245 or (self.context != build.archive
246 and self.context not in
247 build.sourcepackagerelease.published_archives)):
242 return None248 return None
243 return build249 return decorate_binarypackagebuilds([build], self.context)[0]
244250
245 @stepthrough('+recipebuild')251 @stepthrough('+recipebuild')
246 def traverse_recipebuild(self, name):252 def traverse_recipebuild(self, name):
247253
=== modified file 'lib/lp/soyuz/browser/build.py'
--- lib/lp/soyuz/browser/build.py 2014-05-06 09:11:14 +0000
+++ lib/lp/soyuz/browser/build.py 2014-05-12 07:22:06 +0000
@@ -131,6 +131,42 @@
131 return u"+build/%d" % self.context.id131 return u"+build/%d" % self.context.id
132132
133133
134class ArchiveBuildUrl:
135 """Dynamic URL declaration for IArchiveBinaryPackageBuild.
136
137 When dealing with primary and partner builds we want to present them
138 under their archive's distribution's IDistributionSourcePackageRelease:
139
140 /ubuntu/+source/foo/1.0/+build/1234
141
142 On the other hand, PPA builds will be presented under the PPA:
143
144 /~cprov/+archive/+build/1235
145
146 And copy archives will be presented under the archive:
147
148 /ubuntu/+archive/my-special-archive/+build/1234
149 """
150 implements(ICanonicalUrlData)
151 rootsite = None
152
153 def __init__(self, context):
154 self.context = context
155
156 @property
157 def inside(self):
158 if self.context.parent_archive.is_main:
159 distro = self.context.parent_archive.distribution
160 return distro.getSourcePackageRelease(
161 self.context.source_package_release)
162 else:
163 return self.context.parent_archive
164
165 @property
166 def path(self):
167 return u"+build/%d" % self.context.id
168
169
134class BuildNavigation(GetitemNavigation, FileNavigationMixin):170class BuildNavigation(GetitemNavigation, FileNavigationMixin):
135 usedfor = IBinaryPackageBuild171 usedfor = IBinaryPackageBuild
136172
137173
=== modified file 'lib/lp/soyuz/browser/configure.zcml'
--- lib/lp/soyuz/browser/configure.zcml 2014-04-24 07:30:36 +0000
+++ lib/lp/soyuz/browser/configure.zcml 2014-05-12 07:22:06 +0000
@@ -338,6 +338,9 @@
338 <browser:url338 <browser:url
339 for="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuild"339 for="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuild"
340 urldata="lp.soyuz.browser.build.BuildUrl"/>340 urldata="lp.soyuz.browser.build.BuildUrl"/>
341 <browser:url
342 for="lp.soyuz.interfaces.binarypackagebuild.IArchiveBinaryPackageBuild"
343 urldata="lp.soyuz.browser.build.ArchiveBuildUrl"/>
341 <browser:navigation344 <browser:navigation
342 module="lp.soyuz.browser.build"345 module="lp.soyuz.browser.build"
343 classes="346 classes="
344347
=== modified file 'lib/lp/soyuz/browser/distributionsourcepackagerelease.py'
--- lib/lp/soyuz/browser/distributionsourcepackagerelease.py 2014-05-06 09:11:14 +0000
+++ lib/lp/soyuz/browser/distributionsourcepackagerelease.py 2014-05-12 07:22:06 +0000
@@ -32,6 +32,7 @@
32from lp.soyuz.interfaces.distributionsourcepackagerelease import (32from lp.soyuz.interfaces.distributionsourcepackagerelease import (
33 IDistributionSourcePackageRelease,33 IDistributionSourcePackageRelease,
34 )34 )
35from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds
3536
3637
37class DistributionSourcePackageReleaseBreadcrumb(Breadcrumb):38class DistributionSourcePackageReleaseBreadcrumb(Breadcrumb):
@@ -48,13 +49,18 @@
48 @stepthrough('+build')49 @stepthrough('+build')
49 def traverse_build(self, name):50 def traverse_build(self, name):
50 build = get_build_by_id_str(IBinaryPackageBuildSet, name)51 build = get_build_by_id_str(IBinaryPackageBuildSet, name)
52 # XXX: This should check whether any of all_distro_archives is
53 # build.archive, or any of them contain the build's binaries.
51 if (build is None54 if (build is None
52 or build.archive not in55 or (build.archive not in
53 self.context.distribution.all_distro_archives56 self.context.distribution.all_distro_archives
57 and self.context.distribution.main_archive not in
58 build.sourcepackagerelease.published_archives)
54 or build.source_package_release !=59 or build.source_package_release !=
55 self.context.sourcepackagerelease):60 self.context.sourcepackagerelease):
56 return None61 return None
57 return build62 return decorate_binarypackagebuilds(
63 [build], archive=self.context.distribution.main_archive)[0]
5864
5965
60class DistributionSourcePackageReleaseView(LaunchpadView):66class DistributionSourcePackageReleaseView(LaunchpadView):
6167
=== modified file 'lib/lp/soyuz/configure.zcml'
--- lib/lp/soyuz/configure.zcml 2014-02-18 11:40:52 +0000
+++ lib/lp/soyuz/configure.zcml 2014-05-12 07:22:06 +0000
@@ -491,6 +491,19 @@
491 permission="launchpad.Admin"491 permission="launchpad.Admin"
492 interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildAdmin"/>492 interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildAdmin"/>
493 </class>493 </class>
494 <class
495 class="lp.soyuz.model.binarypackagebuild.ArchiveBinaryPackageBuild">
496 <require
497 permission="launchpad.View"
498 interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildView"
499 attributes="parent_archive build" />
500 <require
501 permission="launchpad.Edit"
502 interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildEdit"/>
503 <require
504 permission="launchpad.Admin"
505 interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildAdmin"/>
506 </class>
494 <adapter507 <adapter
495 provides="lp.services.webapp.interfaces.IBreadcrumb"508 provides="lp.services.webapp.interfaces.IBreadcrumb"
496 for="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuild"509 for="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuild"
497510
=== modified file 'lib/lp/soyuz/interfaces/binarypackagebuild.py'
--- lib/lp/soyuz/interfaces/binarypackagebuild.py 2013-11-26 01:36:10 +0000
+++ lib/lp/soyuz/interfaces/binarypackagebuild.py 2014-05-12 07:22:06 +0000
@@ -8,6 +8,7 @@
8__all__ = [8__all__ = [
9 'BuildSetStatus',9 'BuildSetStatus',
10 'CannotBeRescored',10 'CannotBeRescored',
11 'IArchiveBinaryPackageBuild',
11 'IBinaryPackageBuild',12 'IBinaryPackageBuild',
12 'IBuildRescoreForm',13 'IBuildRescoreForm',
13 'IBinaryPackageBuildSet',14 'IBinaryPackageBuildSet',
@@ -261,6 +262,25 @@
261 export_as_webservice_entry(singular_name='build', plural_name='builds')262 export_as_webservice_entry(singular_name='build', plural_name='builds')
262263
263264
265class IArchiveBinaryPackageBuild(IBinaryPackageBuild):
266 """A build in an archive.
267
268 `Archive`s need to be self-contained, for reasons of access control,
269 federation, deletion, and more. Since `BinaryPackageBuild`s produce
270 `BinaryPackageRelease`s that can be copied between archives, a
271 `BinaryPackageBuild` has no single archive parent -- they, like
272 `BinaryPackageRelease`s and `SourcePackageRelease`s, are
273 contextless.
274
275 `ArchiveBinaryPackageBuild` is a virtual class combining a
276 `BinaryPackageBuild` with an `Archive` as its parent, giving it a
277 URL. An `ArchiveBinaryPackageBuild` should be returned whenever
278 there is an obvious `Archive` context.
279 """
280 parent_archive = Attribute("Parent archive")
281 build = Attribute("BinaryPackageBuild")
282
283
264class BuildSetStatus(EnumeratedType):284class BuildSetStatus(EnumeratedType):
265 """`IBuildSet` status type285 """`IBuildSet` status type
266286
267287
=== modified file 'lib/lp/soyuz/model/archive.py'
--- lib/lp/soyuz/model/archive.py 2014-04-23 14:24:15 +0000
+++ lib/lp/soyuz/model/archive.py 2014-05-12 07:22:06 +0000
@@ -180,7 +180,10 @@
180from lp.soyuz.model.archiveauthtoken import ArchiveAuthToken180from lp.soyuz.model.archiveauthtoken import ArchiveAuthToken
181from lp.soyuz.model.archivedependency import ArchiveDependency181from lp.soyuz.model.archivedependency import ArchiveDependency
182from lp.soyuz.model.archivepermission import ArchivePermission182from lp.soyuz.model.archivepermission import ArchivePermission
183from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild183from lp.soyuz.model.binarypackagebuild import (
184 BinaryPackageBuild,
185 decorate_binarypackagebuilds,
186 )
184from lp.soyuz.model.binarypackagename import BinaryPackageName187from lp.soyuz.model.binarypackagename import BinaryPackageName
185from lp.soyuz.model.binarypackagerelease import (188from lp.soyuz.model.binarypackagerelease import (
186 BinaryPackageRelease,189 BinaryPackageRelease,
@@ -483,8 +486,9 @@
483 # will implicitly have permission to see it.486 # will implicitly have permission to see it.
484487
485 if binary_only:488 if binary_only:
486 return getUtility(IBinaryPackageBuildSet).getBuildsForArchive(489 bpbs = getUtility(IBinaryPackageBuildSet).getBuildsForArchive(
487 self, build_state, name, pocket, arch_tag)490 self, build_state, name, pocket, arch_tag)
491 return decorate_binarypackagebuilds(bpbs, archive=self)
488 else:492 else:
489 if arch_tag is not None or name is not None or pocket is not None:493 if arch_tag is not None or name is not None or pocket is not None:
490 raise IncompatibleArguments(494 raise IncompatibleArguments(
491495
=== modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
--- lib/lp/soyuz/model/binarypackagebuild.py 2013-12-04 07:07:04 +0000
+++ lib/lp/soyuz/model/binarypackagebuild.py 2014-05-12 07:22:06 +0000
@@ -5,7 +5,9 @@
5__all__ = [5__all__ = [
6 'BinaryPackageBuild',6 'BinaryPackageBuild',
7 'BinaryPackageBuildSet',7 'BinaryPackageBuildSet',
8 'BUILD_ARCHIVE',
8 'COPY_ARCHIVE_SCORE_PENALTY',9 'COPY_ARCHIVE_SCORE_PENALTY',
10 'decorate_binarypackagebuilds',
9 'PRIVATE_ARCHIVE_SCORE_BONUS',11 'PRIVATE_ARCHIVE_SCORE_BONUS',
10 'SCORE_BY_COMPONENT',12 'SCORE_BY_COMPONENT',
11 'SCORE_BY_POCKET',13 'SCORE_BY_POCKET',
@@ -16,6 +18,7 @@
16from operator import itemgetter18from operator import itemgetter
1719
18import apt_pkg20import apt_pkg
21from lazr.delegates import delegates
19import pytz22import pytz
20from sqlobject import SQLObjectNotFound23from sqlobject import SQLObjectNotFound
21from storm.expr import (24from storm.expr import (
@@ -92,6 +95,7 @@
92from lp.soyuz.interfaces.binarypackagebuild import (95from lp.soyuz.interfaces.binarypackagebuild import (
93 BuildSetStatus,96 BuildSetStatus,
94 CannotBeRescored,97 CannotBeRescored,
98 IArchiveBinaryPackageBuild,
95 IBinaryPackageBuild,99 IBinaryPackageBuild,
96 IBinaryPackageBuildSet,100 IBinaryPackageBuildSet,
97 UnparsableDependencies,101 UnparsableDependencies,
@@ -144,6 +148,46 @@
144COPY_ARCHIVE_SCORE_PENALTY = 2600148COPY_ARCHIVE_SCORE_PENALTY = 2600
145149
146150
151BUILD_ARCHIVE = object()
152
153
154def decorate_binarypackagebuilds(bpbs, archive=None):
155 """Decorate `BinaryPackageBuild`s into `ArchiveBinaryPackageBuild`s.
156
157 Three types of input are supported, depending on the value of archive:
158
159 - archive=None: bpbs is a sequence of (build, archive) pairs
160
161 - archive=BUILD_ARCHIVE: bpbs is a sequence of builds, each of
162 which will be decorated with the archive in which it was built.
163
164 - archive=<some archive>: bpbs is a sequence of builds, each of
165 which will be decoreated with the given archive.
166
167 If bpbs is an IResultSet, the return value will be a DecoratedResultSet.
168 If it's a list or tuple, the return value will be a list.
169 Otherwise, the return value will be a generator.
170 """
171 if archive is None:
172 splitter = lambda build: (build[1], build[0])
173 elif archive is BUILD_ARCHIVE:
174 splitter = lambda build: (build.archive, build)
175 else:
176 splitter = lambda build: (archive, build)
177
178 if IResultSet.providedBy(bpbs):
179 return DecoratedResultSet(
180 bpbs,
181 lambda build: ArchiveBinaryPackageBuild(*splitter(build)))
182 else:
183 seq = (
184 ArchiveBinaryPackageBuild(*splitter(build))
185 for build in bpbs)
186 if isinstance(bpbs, (list, tuple)):
187 seq = list(seq)
188 return seq
189
190
147class BinaryPackageBuild(PackageBuildMixin, SQLBase):191class BinaryPackageBuild(PackageBuildMixin, SQLBase):
148 implements(IBinaryPackageBuild)192 implements(IBinaryPackageBuild)
149 _table = 'BinaryPackageBuild'193 _table = 'BinaryPackageBuild'
@@ -887,6 +931,25 @@
887 return changes.signer931 return changes.signer
888932
889933
934class ArchiveBinaryPackageBuild:
935
936 implements(IArchiveBinaryPackageBuild)
937 delegates(IBinaryPackageBuild, 'build')
938
939 def __init__(self, parent_archive, build):
940 self.parent_archive = parent_archive
941 self.build = build
942
943 def __eq__(self, other):
944 return (
945 isinstance(other, self.__class__)
946 and self.parent_archive == other.parent_archive
947 and self.build == other.build)
948
949 def __ne__(self, other):
950 return not self.__eq__(other)
951
952
890class BinaryPackageBuildSet(SpecificBuildFarmJobSourceMixin):953class BinaryPackageBuildSet(SpecificBuildFarmJobSourceMixin):
891 implements(IBinaryPackageBuildSet)954 implements(IBinaryPackageBuildSet)
892955
893956
=== modified file 'lib/lp/soyuz/model/distributionsourcepackagerelease.py'
--- lib/lp/soyuz/model/distributionsourcepackagerelease.py 2014-01-13 07:09:40 +0000
+++ lib/lp/soyuz/model/distributionsourcepackagerelease.py 2014-05-12 07:22:06 +0000
@@ -28,7 +28,10 @@
28 )28 )
29from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease29from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease
30from lp.soyuz.model.archive import Archive30from lp.soyuz.model.archive import Archive
31from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild31from lp.soyuz.model.binarypackagebuild import (
32 BinaryPackageBuild,
33 decorate_binarypackagebuilds,
34 )
32from lp.soyuz.model.binarypackagename import BinaryPackageName35from lp.soyuz.model.binarypackagename import BinaryPackageName
33from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease36from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease
34from lp.soyuz.model.distroseriesbinarypackage import DistroSeriesBinaryPackage37from lp.soyuz.model.distroseriesbinarypackage import DistroSeriesBinaryPackage
@@ -125,9 +128,11 @@
125 Archive.purpose.is_in(MAIN_ARCHIVE_PURPOSES)).config(128 Archive.purpose.is_in(MAIN_ARCHIVE_PURPOSES)).config(
126 distinct=True)129 distinct=True)
127130
128 return builds_built_in_main_archives.union(131 result = builds_built_in_main_archives.union(
129 builds_published_in_main_archives).order_by(132 builds_published_in_main_archives).order_by(
130 Desc(BinaryPackageBuild.id))133 Desc(BinaryPackageBuild.id))
134 return decorate_binarypackagebuilds(
135 result, archive=self.distribution.main_archive)
131136
132 @property137 @property
133 def binary_package_names(self):138 def binary_package_names(self):
134139
=== modified file 'lib/lp/soyuz/model/distroarchseries.py'
--- lib/lp/soyuz/model/distroarchseries.py 2014-02-28 11:12:31 +0000
+++ lib/lp/soyuz/model/distroarchseries.py 2014-05-12 07:22:06 +0000
@@ -266,6 +266,9 @@
266 # now).266 # now).
267 # Ignore "binary_only" as for a distro arch series it is only267 # Ignore "binary_only" as for a distro arch series it is only
268 # the binaries that are relevant.268 # the binaries that are relevant.
269 from lp.soyuz.model.binarypackagebuild import (
270 decorate_binarypackagebuilds,
271 )
269272
270 # For consistency we return an empty resultset if arch_tag273 # For consistency we return an empty resultset if arch_tag
271 # is provided but doesn't match our architecture.274 # is provided but doesn't match our architecture.
@@ -274,8 +277,9 @@
274277
275 # Use the facility provided by IBinaryPackageBuildSet to278 # Use the facility provided by IBinaryPackageBuildSet to
276 # retrieve the records.279 # retrieve the records.
277 return getUtility(IBinaryPackageBuildSet).getBuildsForDistro(280 bpbs = getUtility(IBinaryPackageBuildSet).getBuildsForDistro(
278 self, build_state, name, pocket)281 self, build_state, name, pocket)
282 return decorate_binarypackagebuilds(bpbs, archive=self.main_archive)
279283
280 def getReleasedPackages(self, binary_name, pocket=None,284 def getReleasedPackages(self, binary_name, pocket=None,
281 include_pending=False, archive=None):285 include_pending=False, archive=None):
282286
=== modified file 'lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py'
--- lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py 2013-01-21 16:27:29 +0000
+++ lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py 2014-05-12 07:22:06 +0000
@@ -17,6 +17,7 @@
17 IDistroArchSeriesBinaryPackageRelease,17 IDistroArchSeriesBinaryPackageRelease,
18 )18 )
19from lp.soyuz.interfaces.publishing import active_publishing_status19from lp.soyuz.interfaces.publishing import active_publishing_status
20from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds
20from lp.soyuz.model.distributionsourcepackagerelease import (21from lp.soyuz.model.distributionsourcepackagerelease import (
21 DistributionSourcePackageRelease,22 DistributionSourcePackageRelease,
22 )23 )
@@ -185,7 +186,9 @@
185 @property186 @property
186 def build(self):187 def build(self):
187 """See `IBinaryPackageRelease`."""188 """See `IBinaryPackageRelease`."""
188 return self.binarypackagerelease.build189 return decorate_binarypackagebuilds(
190 [self.binarypackagerelease.build],
191 archive=self.distribution.main_archive)[0]
189192
190 @property193 @property
191 def binpackageformat(self):194 def binpackageformat(self):
192195
=== modified file 'lib/lp/soyuz/model/distroseriessourcepackagerelease.py'
--- lib/lp/soyuz/model/distroseriessourcepackagerelease.py 2013-01-07 02:40:55 +0000
+++ lib/lp/soyuz/model/distroseriessourcepackagerelease.py 2014-05-12 07:22:06 +0000
@@ -26,7 +26,10 @@
26 IDistroSeriesSourcePackageRelease,26 IDistroSeriesSourcePackageRelease,
27 )27 )
28from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease28from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease
29from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild29from lp.soyuz.model.binarypackagebuild import (
30 BinaryPackageBuild,
31 decorate_binarypackagebuilds,
32 )
30from lp.soyuz.model.binarypackagename import BinaryPackageName33from lp.soyuz.model.binarypackagename import BinaryPackageName
31from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease34from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease
32from lp.soyuz.model.publishing import (35from lp.soyuz.model.publishing import (
@@ -119,9 +122,10 @@
119 self.distroseries.distribution,122 self.distroseries.distribution,
120 self.sourcepackagerelease).builds123 self.sourcepackagerelease).builds
121124
122 return (125 return decorate_binarypackagebuilds(
123 [build for build in distro_builds126 [build for build in distro_builds
124 if build.distro_arch_series.distroseries == self.distroseries])127 if build.distro_arch_series.distroseries == self.distroseries],
128 archive=self.distribution.main_archive)
125129
126 @property130 @property
127 def files(self):131 def files(self):
128132
=== modified file 'lib/lp/soyuz/model/publishing.py'
--- lib/lp/soyuz/model/publishing.py 2014-05-06 06:32:46 +0000
+++ lib/lp/soyuz/model/publishing.py 2014-05-12 07:22:06 +0000
@@ -17,10 +17,7 @@
1717
18from collections import defaultdict18from collections import defaultdict
19from datetime import datetime19from datetime import datetime
20from operator import (20from operator import attrgetter
21 attrgetter,
22 itemgetter,
23 )
24import os21import os
25import re22import re
26import sys23import sys
@@ -58,7 +55,6 @@
58from lp.services.database import bulk55from lp.services.database import bulk
59from lp.services.database.constants import UTC_NOW56from lp.services.database.constants import UTC_NOW
60from lp.services.database.datetimecol import UtcDateTimeCol57from lp.services.database.datetimecol import UtcDateTimeCol
61from lp.services.database.decoratedresultset import DecoratedResultSet
62from lp.services.database.enumcol import EnumCol58from lp.services.database.enumcol import EnumCol
63from lp.services.database.interfaces import (59from lp.services.database.interfaces import (
64 IMasterStore,60 IMasterStore,
@@ -110,7 +106,10 @@
110 )106 )
111from lp.soyuz.interfaces.queue import QueueInconsistentStateError107from lp.soyuz.interfaces.queue import QueueInconsistentStateError
112from lp.soyuz.interfaces.section import ISectionSet108from lp.soyuz.interfaces.section import ISectionSet
113from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild109from lp.soyuz.model.binarypackagebuild import (
110 BinaryPackageBuild,
111 decorate_binarypackagebuilds,
112 )
114from lp.soyuz.model.binarypackagename import BinaryPackageName113from lp.soyuz.model.binarypackagename import BinaryPackageName
115from lp.soyuz.model.binarypackagerelease import (114from lp.soyuz.model.binarypackagerelease import (
116 BinaryPackageRelease,115 BinaryPackageRelease,
@@ -540,7 +539,8 @@
540 @staticmethod539 @staticmethod
541 def _convertBuilds(builds_for_sources):540 def _convertBuilds(builds_for_sources):
542 """Convert from IPublishingSet getBuilds to SPPH getBuilds."""541 """Convert from IPublishingSet getBuilds to SPPH getBuilds."""
543 return [build[1] for build in builds_for_sources]542 return decorate_binarypackagebuilds(
543 [(build[1], build[0].archive) for build in builds_for_sources])
544544
545 def getBuilds(self):545 def getBuilds(self):
546 """See `ISourcePackagePublishingHistory`."""546 """See `ISourcePackagePublishingHistory`."""
@@ -1892,6 +1892,8 @@
1892 # Thank you, Zope, for security wrapping an abstract data1892 # Thank you, Zope, for security wrapping an abstract data
1893 # structure.1893 # structure.
1894 summary = removeSecurityProxy(summary)1894 summary = removeSecurityProxy(summary)
1895 summary['builds'] = decorate_binarypackagebuilds(
1896 summary['builds'], archive=archive)
1895 summary['date_published'] = source_pub.datepublished1897 summary['date_published'] = source_pub.datepublished
1896 summary['source_package_name'] = source_pub.source_package_name1898 summary['source_package_name'] = source_pub.source_package_name
1897 source_build_statuses[source_pub.id] = summary1899 source_build_statuses[source_pub.id] = summary
@@ -1918,7 +1920,8 @@
1918 for source_pub, builds in unpublished_per_source.items():1920 for source_pub, builds in unpublished_per_source.items():
1919 summary = {1921 summary = {
1920 'status': BuildSetStatus.FULLYBUILT_PENDING,1922 'status': BuildSetStatus.FULLYBUILT_PENDING,
1921 'builds': builds,1923 'builds': decorate_binarypackagebuilds(
1924 builds, archive=archive),
1922 'date_published': source_pub.datepublished,1925 'date_published': source_pub.datepublished,
1923 'source_package_name': source_pub.source_package_name,1926 'source_package_name': source_pub.source_package_name,
1924 }1927 }
19251928
=== modified file 'lib/lp/soyuz/model/queue.py'
--- lib/lp/soyuz/model/queue.py 2014-04-09 12:32:50 +0000
+++ lib/lp/soyuz/model/queue.py 2014-05-12 07:22:06 +0000
@@ -234,10 +234,15 @@
234234
235 def binaryFileUrls(self):235 def binaryFileUrls(self):
236 """See `IPackageUpload`."""236 """See `IPackageUpload`."""
237 from lp.soyuz.model.binarypackagebuild import (
238 decorate_binarypackagebuilds,
239 )
240 bpbs = [build.build for build in self.builds]
237 return [241 return [
238 ProxiedLibraryFileAlias(file.libraryfile, build.build).http_url242 ProxiedLibraryFileAlias(file.libraryfile, abpb).http_url
239 for build in self.builds243 for abpb in decorate_binarypackagebuilds(
240 for bpr in build.build.binarypackages244 bpbs, archive=self.archive)
245 for bpr in abpb.binarypackages
241 for file in bpr.files]246 for file in bpr.files]
242247
243 @property248 @property
244249
=== modified file 'lib/lp/soyuz/scripts/tests/test_copypackage.py'
--- lib/lp/soyuz/scripts/tests/test_copypackage.py 2013-09-11 08:17:34 +0000
+++ lib/lp/soyuz/scripts/tests/test_copypackage.py 2014-05-12 07:22:06 +0000
@@ -1710,7 +1710,9 @@
1710 def test_copy_source_and_binaries_from_ppa_does_not_create_builds(self):1710 def test_copy_source_and_binaries_from_ppa_does_not_create_builds(self):
1711 # Copying a source package and its binaries from a PPA to the1711 # Copying a source package and its binaries from a PPA to the
1712 # primary archive copies the binaries and does not create any new1712 # primary archive copies the binaries and does not create any new
1713 # build records.1713 # build records. The ArchiveBinaryPackageBuilds returned by
1714 # getBuilds() are distinct, but they wrap the same
1715 # BinaryPackageBuilds.
1714 source = self.test_publisher.getPubSource(archive=self.ppa)1716 source = self.test_publisher.getPubSource(archive=self.ppa)
1715 self.test_publisher.getPubBinaries(pub_source=source)1717 self.test_publisher.getPubBinaries(pub_source=source)
1716 self.layer.txn.commit()1718 self.layer.txn.commit()
@@ -1726,7 +1728,9 @@
1726 "%s %s in %s" % (spr.name, spr.version, self.series.name),1728 "%s %s in %s" % (spr.name, spr.version, self.series.name),
1727 copied[0].displayname)1729 copied[0].displayname)
1728 self.assertEqual(2, len(copied[0].getPublishedBinaries()))1730 self.assertEqual(2, len(copied[0].getPublishedBinaries()))
1729 self.assertEqual(initial_builds, copied[0].getBuilds())1731 self.assertEqual(
1732 [abpb.build for abpb in initial_builds],
1733 [abpb.build for abpb in copied[0].getBuilds()])
17301734
1731 def makeSeriesWithExtraArchitecture(self):1735 def makeSeriesWithExtraArchitecture(self):
1732 """Make a new distroseries with an additional architecture."""1736 """Make a new distroseries with an additional architecture."""
17331737
=== modified file 'lib/lp/soyuz/stories/soyuz/xx-private-builds.txt'
--- lib/lp/soyuz/stories/soyuz/xx-private-builds.txt 2013-12-03 05:18:41 +0000
+++ lib/lp/soyuz/stories/soyuz/xx-private-builds.txt 2014-05-12 07:22:06 +0000
@@ -329,7 +329,9 @@
329 i386 build of privacy-test 666 : PPA named p3a for Celso Providelo : Celso Providelo329 i386 build of privacy-test 666 : PPA named p3a for Celso Providelo : Celso Providelo
330330
331When accessing the distroseries source package release page, the builds331When accessing the distroseries source package release page, the builds
332portlet will display a link to the newly unembargoed build:332portlet will display a link to the newly unembargoed build. It's the
333same build as the PPA, with the same ID, but structurally under the
334primary archive:
333335
334 >>> browser.open(336 >>> browser.open(
335 ... "http://launchpad.dev/ubuntutest/breezy-autotest/"337 ... "http://launchpad.dev/ubuntutest/breezy-autotest/"
@@ -340,7 +342,7 @@
340 breezy-autotest i386 Successfully built342 breezy-autotest i386 Successfully built
341343
342 >>> print browser.getLink('i386').url344 >>> print browser.getLink('i386').url
343 http://launchpad.dev/~cprov/+archive/p3a/+build/...345 http://launchpad.dev/ubuntutest/+source/privacy-test/666/+build/...
344346
345Similarly, when accessing the distribution source package release page,347Similarly, when accessing the distribution source package release page,
346the main content will display a link to the newly unembargoed build:348the main content will display a link to the newly unembargoed build:
@@ -353,4 +355,4 @@
353 Breezy Badger Autotest: i386355 Breezy Badger Autotest: i386
354356
355 >>> print browser.getLink('i386').url357 >>> print browser.getLink('i386').url
356 http://launchpad.dev/~cprov/+archive/p3a/+build/...358 http://launchpad.dev/ubuntutest/+source/privacy-test/666/+build/...
357359
=== modified file 'lib/lp/soyuz/tests/test_hasbuildrecords.py'
--- lib/lp/soyuz/tests/test_hasbuildrecords.py 2013-11-28 08:51:32 +0000
+++ lib/lp/soyuz/tests/test_hasbuildrecords.py 2014-05-12 07:22:06 +0000
@@ -56,7 +56,7 @@
5656
57 def test_getBuildRecords_no_archs(self):57 def test_getBuildRecords_no_archs(self):
58 # getBuildRecords() called without any arguments returns all builds.58 # getBuildRecords() called without any arguments returns all builds.
59 builds = self.context.getBuildRecords()59 builds = [abpb.build for abpb in self.context.getBuildRecords()]
60 self.assertContentEqual(builds, self.builds)60 self.assertContentEqual(builds, self.builds)
6161
62 def test_getBuildRecords_by_arch_tag(self):62 def test_getBuildRecords_by_arch_tag(self):
@@ -65,7 +65,9 @@
65 # Target one of the builds to hppa so that we have three builds65 # Target one of the builds to hppa so that we have three builds
66 # in total, two of which are i386 and one hppa.66 # in total, two of which are i386 and one hppa.
67 i386_builds = self.builds[:2]67 i386_builds = self.builds[:2]
68 builds = self.context.getBuildRecords(arch_tag="i386")68 builds = [
69 abpb.build
70 for abpb in self.context.getBuildRecords(arch_tag="i386")]
69 self.assertContentEqual(i386_builds, builds)71 self.assertContentEqual(i386_builds, builds)
7072
7173
@@ -295,7 +297,7 @@
295 build2.queueBuild()297 build2.queueBuild()
296 build1.buildqueue_record.lastscore = 10298 build1.buildqueue_record.lastscore = 10
297 build2.buildqueue_record.lastscore = 1000299 build2.buildqueue_record.lastscore = 1000
298 builds = list(source_package.getBuildRecords())300 builds = [abpb.build for abpb in source_package.getBuildRecords()]
299 self.assertEquals([build2, build1], builds)301 self.assertEquals([build2, build1], builds)
300302
301 def test_copy_archive_without_leak(self):303 def test_copy_archive_without_leak(self):
@@ -328,7 +330,7 @@
328 distroseries, PackagePublishingPocket.RELEASE, copy)330 distroseries, PackagePublishingPocket.RELEASE, copy)
329 [copy_build] = copy_spph.createMissingBuilds()331 [copy_build] = copy_spph.createMissingBuilds()
330 builds = copy.getBuildRecords()332 builds = copy.getBuildRecords()
331 self.assertEquals([copy_build], list(builds))333 self.assertEquals([copy_build], [abpb.build for abpb in builds])
332 source = SourcePackage(spn, spph.distroseries)334 source = SourcePackage(spn, spph.distroseries)
333 # SourcePackage.getBuildRecords() doesn't have two build records.335 # SourcePackage.getBuildRecords() doesn't have two build records.
334 builds = source.getBuildRecords().count()336 builds = source.getBuildRecords().count()
335337
=== modified file 'lib/lp/soyuz/tests/test_packageupload.py'
--- lib/lp/soyuz/tests/test_packageupload.py 2014-04-09 12:32:50 +0000
+++ lib/lp/soyuz/tests/test_packageupload.py 2014-05-12 07:22:06 +0000
@@ -47,6 +47,7 @@
47 QueueInconsistentStateError,47 QueueInconsistentStateError,
48 )48 )
49from lp.soyuz.interfaces.section import ISectionSet49from lp.soyuz.interfaces.section import ISectionSet
50from lp.soyuz.model.binarypackagebuild import ArchiveBinaryPackageBuild
50from lp.soyuz.model.packagecopyjob import IPackageCopyJobSource51from lp.soyuz.model.packagecopyjob import IPackageCopyJobSource
51from lp.soyuz.tests.test_publishing import SoyuzTestPublisher52from lp.soyuz.tests.test_publishing import SoyuzTestPublisher
52from lp.testing import (53from lp.testing import (
@@ -1125,7 +1126,10 @@
1125 self.assertNotEqual(0, len(ws_binary_file_urls))1126 self.assertNotEqual(0, len(ws_binary_file_urls))
1126 with person_logged_in(person):1127 with person_logged_in(person):
1127 binary_file_urls = [1128 binary_file_urls = [
1128 ProxiedLibraryFileAlias(file.libraryfile, build.build).http_url1129 ProxiedLibraryFileAlias(
1130 file.libraryfile,
1131 ArchiveBinaryPackageBuild(
1132 self.distroseries.main_archive, build.build)).http_url
1129 for build in upload.builds1133 for build in upload.builds
1130 for bpr in build.build.binarypackages1134 for bpr in build.build.binarypackages
1131 for file in bpr.files]1135 for file in bpr.files]