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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Launchpad code reviewers | Pending | ||
Review via email: mp+218379@code.launchpad.net |
Commit message
Description of the change
- 17005. By William Grant
-
Adjust the three +build traversals to return ArchiveBinaryPa
ckageBuilds. - 17006. By William Grant
-
Stop decorating BPBs into ABPBs manually. Use decorate_
binarypackagebu ilds instead. - 17007. By William Grant
-
Decorate them in Builder.
getBuildRecords too. - 17008. By William Grant
-
Fix test_hasbuildre
cords 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_hasbuildre
cords to unwrap. - 17007. By William Grant
-
Decorate them in Builder.
getBuildRecords too. - 17006. By William Grant
-
Stop decorating BPBs into ABPBs manually. Use decorate_
binarypackagebu ilds instead. - 17005. By William Grant
-
Adjust the three +build traversals to return ArchiveBinaryPa
ckageBuilds. - 17004. By William Grant
-
Merge archive-
build-navigatio n. - 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
1 | === modified file 'lib/lp/buildmaster/browser/builder.py' | |||
2 | --- lib/lp/buildmaster/browser/builder.py 2014-05-06 09:11:14 +0000 | |||
3 | +++ lib/lp/buildmaster/browser/builder.py 2014-05-12 07:22:06 +0000 | |||
4 | @@ -64,6 +64,10 @@ | |||
5 | 64 | get_build_by_id_str, | 64 | get_build_by_id_str, |
6 | 65 | ) | 65 | ) |
7 | 66 | from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuildSet | 66 | from lp.soyuz.interfaces.binarypackagebuild import IBinaryPackageBuildSet |
8 | 67 | from lp.soyuz.model.binarypackagebuild import ( | ||
9 | 68 | BUILD_ARCHIVE, | ||
10 | 69 | decorate_binarypackagebuilds, | ||
11 | 70 | ) | ||
12 | 67 | 71 | ||
13 | 68 | 72 | ||
14 | 69 | class BuilderSetNavigation(GetitemNavigation): | 73 | class BuilderSetNavigation(GetitemNavigation): |
15 | @@ -75,7 +79,8 @@ | |||
16 | 75 | build = get_build_by_id_str(IBinaryPackageBuildSet, name) | 79 | build = get_build_by_id_str(IBinaryPackageBuildSet, name) |
17 | 76 | if build is None: | 80 | if build is None: |
18 | 77 | return None | 81 | return None |
20 | 78 | return self.redirectSubTree(canonical_url(build)) | 82 | return self.redirectSubTree(canonical_url( |
21 | 83 | decorate_binarypackagebuilds([build], archive=BUILD_ARCHIVE)[0])) | ||
22 | 79 | 84 | ||
23 | 80 | @stepthrough('+recipebuild') | 85 | @stepthrough('+recipebuild') |
24 | 81 | def traverse_recipebuild(self, name): | 86 | def traverse_recipebuild(self, name): |
25 | 82 | 87 | ||
26 | === modified file 'lib/lp/buildmaster/interfaces/buildfarmjob.py' | |||
27 | --- lib/lp/buildmaster/interfaces/buildfarmjob.py 2013-11-21 04:13:12 +0000 | |||
28 | +++ lib/lp/buildmaster/interfaces/buildfarmjob.py 2014-05-12 07:22:06 +0000 | |||
29 | @@ -65,6 +65,7 @@ | |||
30 | 65 | id = Attribute('The build farm job ID.') | 65 | id = Attribute('The build farm job ID.') |
31 | 66 | 66 | ||
32 | 67 | build_farm_job = Attribute('Generic build farm job record') | 67 | build_farm_job = Attribute('Generic build farm job record') |
33 | 68 | build_farm_job_id = Attribute('The BuildFarmJobDB ID.') | ||
34 | 68 | 69 | ||
35 | 69 | processor = Reference( | 70 | processor = Reference( |
36 | 70 | IProcessor, title=_("Processor"), required=False, readonly=True, | 71 | IProcessor, title=_("Processor"), required=False, readonly=True, |
37 | 71 | 72 | ||
38 | === modified file 'lib/lp/buildmaster/model/builder.py' | |||
39 | --- lib/lp/buildmaster/model/builder.py 2013-11-28 09:12:45 +0000 | |||
40 | +++ lib/lp/buildmaster/model/builder.py 2014-05-12 07:22:06 +0000 | |||
41 | @@ -186,9 +186,15 @@ | |||
42 | 186 | def getBuildRecords(self, build_state=None, name=None, pocket=None, | 186 | def getBuildRecords(self, build_state=None, name=None, pocket=None, |
43 | 187 | arch_tag=None, user=None, binary_only=True): | 187 | arch_tag=None, user=None, binary_only=True): |
44 | 188 | """See IHasBuildRecords.""" | 188 | """See IHasBuildRecords.""" |
45 | 189 | from lp.soyuz.model.binarypackagebuild import ( | ||
46 | 190 | BUILD_ARCHIVE, | ||
47 | 191 | decorate_binarypackagebuilds, | ||
48 | 192 | ) | ||
49 | 189 | if binary_only: | 193 | if binary_only: |
52 | 190 | return getUtility(IBinaryPackageBuildSet).getBuildsForBuilder( | 194 | return decorate_binarypackagebuilds( |
53 | 191 | self.id, build_state, name, pocket, arch_tag, user) | 195 | getUtility(IBinaryPackageBuildSet).getBuildsForBuilder( |
54 | 196 | self.id, build_state, name, pocket, arch_tag, user), | ||
55 | 197 | archive=BUILD_ARCHIVE) | ||
56 | 192 | else: | 198 | else: |
57 | 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: |
58 | 194 | raise IncompatibleArguments( | 200 | raise IncompatibleArguments( |
59 | 195 | 201 | ||
60 | === modified file 'lib/lp/registry/model/distribution.py' | |||
61 | --- lib/lp/registry/model/distribution.py 2014-01-07 01:45:40 +0000 | |||
62 | +++ lib/lp/registry/model/distribution.py 2014-05-12 07:22:06 +0000 | |||
63 | @@ -170,6 +170,7 @@ | |||
64 | 170 | from lp.soyuz.interfaces.buildrecords import IHasBuildRecords | 170 | from lp.soyuz.interfaces.buildrecords import IHasBuildRecords |
65 | 171 | from lp.soyuz.interfaces.publishing import active_publishing_status | 171 | from lp.soyuz.interfaces.publishing import active_publishing_status |
66 | 172 | from lp.soyuz.model.archive import Archive | 172 | from lp.soyuz.model.archive import Archive |
67 | 173 | from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds | ||
68 | 173 | from lp.soyuz.model.binarypackagename import BinaryPackageName | 174 | from lp.soyuz.model.binarypackagename import BinaryPackageName |
69 | 174 | from lp.soyuz.model.distributionsourcepackagerelease import ( | 175 | from lp.soyuz.model.distributionsourcepackagerelease import ( |
70 | 175 | DistributionSourcePackageRelease, | 176 | DistributionSourcePackageRelease, |
71 | @@ -951,8 +952,9 @@ | |||
72 | 951 | # now). | 952 | # now). |
73 | 952 | # The "binary_only" option is not yet supported for | 953 | # The "binary_only" option is not yet supported for |
74 | 953 | # IDistribution. | 954 | # IDistribution. |
76 | 954 | return getUtility(IBinaryPackageBuildSet).getBuildsForDistro( | 955 | bpbs = getUtility(IBinaryPackageBuildSet).getBuildsForDistro( |
77 | 955 | self, build_state, name, pocket, arch_tag) | 956 | self, build_state, name, pocket, arch_tag) |
78 | 957 | return decorate_binarypackagebuilds(bpbs, archive=self.main_archive) | ||
79 | 956 | 958 | ||
80 | 957 | def searchSourcePackageCaches( | 959 | def searchSourcePackageCaches( |
81 | 958 | self, text, has_packaging=None, publishing_distroseries=None): | 960 | self, text, has_packaging=None, publishing_distroseries=None): |
82 | 959 | 961 | ||
83 | === modified file 'lib/lp/registry/model/distroseries.py' | |||
84 | --- lib/lp/registry/model/distroseries.py 2014-01-06 14:24:05 +0000 | |||
85 | +++ lib/lp/registry/model/distroseries.py 2014-05-12 07:22:06 +0000 | |||
86 | @@ -135,6 +135,7 @@ | |||
87 | 135 | from lp.soyuz.interfaces.sourcepackageformat import ( | 135 | from lp.soyuz.interfaces.sourcepackageformat import ( |
88 | 136 | ISourcePackageFormatSelectionSet, | 136 | ISourcePackageFormatSelectionSet, |
89 | 137 | ) | 137 | ) |
90 | 138 | from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds | ||
91 | 138 | from lp.soyuz.model.binarypackagename import BinaryPackageName | 139 | from lp.soyuz.model.binarypackagename import BinaryPackageName |
92 | 139 | from lp.soyuz.model.component import Component | 140 | from lp.soyuz.model.component import Component |
93 | 140 | from lp.soyuz.model.distroarchseries import ( | 141 | from lp.soyuz.model.distroarchseries import ( |
94 | @@ -1014,8 +1015,9 @@ | |||
95 | 1014 | # Ignore "user", since it would not make any difference to the | 1015 | # Ignore "user", since it would not make any difference to the |
96 | 1015 | # records returned here (private builds are only in PPA right | 1016 | # records returned here (private builds are only in PPA right |
97 | 1016 | # now). We also ignore binary_only and always return binaries. | 1017 | # now). We also ignore binary_only and always return binaries. |
99 | 1017 | return getUtility(IBinaryPackageBuildSet).getBuildsForDistro( | 1018 | bpbs = getUtility(IBinaryPackageBuildSet).getBuildsForDistro( |
100 | 1018 | self, build_state, name, pocket, arch_tag) | 1019 | self, build_state, name, pocket, arch_tag) |
101 | 1020 | return decorate_binarypackagebuilds(bpbs, archive=self.main_archive) | ||
102 | 1019 | 1021 | ||
103 | 1020 | def createUploadedSourcePackageRelease( | 1022 | def createUploadedSourcePackageRelease( |
104 | 1021 | self, sourcepackagename, version, maintainer, builddepends, | 1023 | self, sourcepackagename, version, maintainer, builddepends, |
105 | 1022 | 1024 | ||
106 | === modified file 'lib/lp/registry/model/sourcepackage.py' | |||
107 | --- lib/lp/registry/model/sourcepackage.py 2013-11-19 02:51:24 +0000 | |||
108 | +++ lib/lp/registry/model/sourcepackage.py 2014-05-12 07:22:06 +0000 | |||
109 | @@ -75,6 +75,7 @@ | |||
110 | 75 | from lp.soyuz.model.binarypackagebuild import ( | 75 | from lp.soyuz.model.binarypackagebuild import ( |
111 | 76 | BinaryPackageBuild, | 76 | BinaryPackageBuild, |
112 | 77 | BinaryPackageBuildSet, | 77 | BinaryPackageBuildSet, |
113 | 78 | decorate_binarypackagebuilds, | ||
114 | 78 | ) | 79 | ) |
115 | 79 | from lp.soyuz.model.distributionsourcepackagerelease import ( | 80 | from lp.soyuz.model.distributionsourcepackagerelease import ( |
116 | 80 | DistributionSourcePackageRelease, | 81 | DistributionSourcePackageRelease, |
117 | @@ -656,8 +657,10 @@ | |||
118 | 656 | 657 | ||
119 | 657 | # End of duplication (see XXX cprov 2006-09-25 above). | 658 | # End of duplication (see XXX cprov 2006-09-25 above). |
120 | 658 | 659 | ||
122 | 659 | return IStore(BinaryPackageBuild).using(clauseTables).find( | 660 | bpbs = IStore(BinaryPackageBuild).using(clauseTables).find( |
123 | 660 | BinaryPackageBuild, *condition_clauses).order_by(*orderBy) | 661 | BinaryPackageBuild, *condition_clauses).order_by(*orderBy) |
124 | 662 | return decorate_binarypackagebuilds( | ||
125 | 663 | bpbs, archive=self.distribution.main_archive) | ||
126 | 661 | 664 | ||
127 | 662 | @property | 665 | @property |
128 | 663 | def latest_published_component(self): | 666 | def latest_published_component(self): |
129 | 664 | 667 | ||
130 | === modified file 'lib/lp/security.py' | |||
131 | --- lib/lp/security.py 2014-03-17 21:50:33 +0000 | |||
132 | +++ lib/lp/security.py 2014-05-12 07:22:06 +0000 | |||
133 | @@ -21,6 +21,7 @@ | |||
134 | 21 | queryAdapter, | 21 | queryAdapter, |
135 | 22 | ) | 22 | ) |
136 | 23 | from zope.interface import Interface | 23 | from zope.interface import Interface |
137 | 24 | from zope.security.proxy import removeSecurityProxy | ||
138 | 24 | 25 | ||
139 | 25 | from lp.answers.interfaces.faq import IFAQ | 26 | from lp.answers.interfaces.faq import IFAQ |
140 | 26 | from lp.answers.interfaces.faqtarget import IFAQTarget | 27 | from lp.answers.interfaces.faqtarget import IFAQTarget |
141 | @@ -1874,7 +1875,7 @@ | |||
142 | 1874 | # user to retry build if so. | 1875 | # user to retry build if so. |
143 | 1875 | # strict_component is True because the source package already exists, | 1876 | # strict_component is True because the source package already exists, |
144 | 1876 | # otherwise, how can they give it back? | 1877 | # otherwise, how can they give it back? |
146 | 1877 | check_perms = self.obj.archive.checkUpload( | 1878 | check_perms = removeSecurityProxy(self.obj.archive).checkUpload( |
147 | 1878 | user.person, self.obj.distro_series, | 1879 | user.person, self.obj.distro_series, |
148 | 1879 | self.obj.source_package_release.sourcepackagename, | 1880 | self.obj.source_package_release.sourcepackagename, |
149 | 1880 | self.obj.current_component, self.obj.pocket, | 1881 | self.obj.current_component, self.obj.pocket, |
150 | 1881 | 1882 | ||
151 | === modified file 'lib/lp/soyuz/browser/archive.py' | |||
152 | --- lib/lp/soyuz/browser/archive.py 2014-05-06 09:11:14 +0000 | |||
153 | +++ lib/lp/soyuz/browser/archive.py 2014-05-12 07:22:06 +0000 | |||
154 | @@ -164,6 +164,7 @@ | |||
155 | 164 | Archive, | 164 | Archive, |
156 | 165 | validate_ppa, | 165 | validate_ppa, |
157 | 166 | ) | 166 | ) |
158 | 167 | from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds | ||
159 | 167 | from lp.soyuz.model.publishing import SourcePackagePublishingHistory | 168 | from lp.soyuz.model.publishing import SourcePackagePublishingHistory |
160 | 168 | from lp.soyuz.scripts.packagecopier import check_copy_permissions | 169 | from lp.soyuz.scripts.packagecopier import check_copy_permissions |
161 | 169 | 170 | ||
162 | @@ -238,9 +239,14 @@ | |||
163 | 238 | @stepthrough('+build') | 239 | @stepthrough('+build') |
164 | 239 | def traverse_build(self, name): | 240 | def traverse_build(self, name): |
165 | 240 | build = get_build_by_id_str(IBinaryPackageBuildSet, name) | 241 | build = get_build_by_id_str(IBinaryPackageBuildSet, name) |
167 | 241 | if build is None or build.archive != self.context: | 242 | # XXX: This should check whether self.context is build.archive |
168 | 243 | # or has some of the build's binaries published in it. | ||
169 | 244 | if (build is None | ||
170 | 245 | or (self.context != build.archive | ||
171 | 246 | and self.context not in | ||
172 | 247 | build.sourcepackagerelease.published_archives)): | ||
173 | 242 | return None | 248 | return None |
175 | 243 | return build | 249 | return decorate_binarypackagebuilds([build], self.context)[0] |
176 | 244 | 250 | ||
177 | 245 | @stepthrough('+recipebuild') | 251 | @stepthrough('+recipebuild') |
178 | 246 | def traverse_recipebuild(self, name): | 252 | def traverse_recipebuild(self, name): |
179 | 247 | 253 | ||
180 | === modified file 'lib/lp/soyuz/browser/build.py' | |||
181 | --- lib/lp/soyuz/browser/build.py 2014-05-06 09:11:14 +0000 | |||
182 | +++ lib/lp/soyuz/browser/build.py 2014-05-12 07:22:06 +0000 | |||
183 | @@ -131,6 +131,42 @@ | |||
184 | 131 | return u"+build/%d" % self.context.id | 131 | return u"+build/%d" % self.context.id |
185 | 132 | 132 | ||
186 | 133 | 133 | ||
187 | 134 | class ArchiveBuildUrl: | ||
188 | 135 | """Dynamic URL declaration for IArchiveBinaryPackageBuild. | ||
189 | 136 | |||
190 | 137 | When dealing with primary and partner builds we want to present them | ||
191 | 138 | under their archive's distribution's IDistributionSourcePackageRelease: | ||
192 | 139 | |||
193 | 140 | /ubuntu/+source/foo/1.0/+build/1234 | ||
194 | 141 | |||
195 | 142 | On the other hand, PPA builds will be presented under the PPA: | ||
196 | 143 | |||
197 | 144 | /~cprov/+archive/+build/1235 | ||
198 | 145 | |||
199 | 146 | And copy archives will be presented under the archive: | ||
200 | 147 | |||
201 | 148 | /ubuntu/+archive/my-special-archive/+build/1234 | ||
202 | 149 | """ | ||
203 | 150 | implements(ICanonicalUrlData) | ||
204 | 151 | rootsite = None | ||
205 | 152 | |||
206 | 153 | def __init__(self, context): | ||
207 | 154 | self.context = context | ||
208 | 155 | |||
209 | 156 | @property | ||
210 | 157 | def inside(self): | ||
211 | 158 | if self.context.parent_archive.is_main: | ||
212 | 159 | distro = self.context.parent_archive.distribution | ||
213 | 160 | return distro.getSourcePackageRelease( | ||
214 | 161 | self.context.source_package_release) | ||
215 | 162 | else: | ||
216 | 163 | return self.context.parent_archive | ||
217 | 164 | |||
218 | 165 | @property | ||
219 | 166 | def path(self): | ||
220 | 167 | return u"+build/%d" % self.context.id | ||
221 | 168 | |||
222 | 169 | |||
223 | 134 | class BuildNavigation(GetitemNavigation, FileNavigationMixin): | 170 | class BuildNavigation(GetitemNavigation, FileNavigationMixin): |
224 | 135 | usedfor = IBinaryPackageBuild | 171 | usedfor = IBinaryPackageBuild |
225 | 136 | 172 | ||
226 | 137 | 173 | ||
227 | === modified file 'lib/lp/soyuz/browser/configure.zcml' | |||
228 | --- lib/lp/soyuz/browser/configure.zcml 2014-04-24 07:30:36 +0000 | |||
229 | +++ lib/lp/soyuz/browser/configure.zcml 2014-05-12 07:22:06 +0000 | |||
230 | @@ -338,6 +338,9 @@ | |||
231 | 338 | <browser:url | 338 | <browser:url |
232 | 339 | for="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuild" | 339 | for="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuild" |
233 | 340 | urldata="lp.soyuz.browser.build.BuildUrl"/> | 340 | urldata="lp.soyuz.browser.build.BuildUrl"/> |
234 | 341 | <browser:url | ||
235 | 342 | for="lp.soyuz.interfaces.binarypackagebuild.IArchiveBinaryPackageBuild" | ||
236 | 343 | urldata="lp.soyuz.browser.build.ArchiveBuildUrl"/> | ||
237 | 341 | <browser:navigation | 344 | <browser:navigation |
238 | 342 | module="lp.soyuz.browser.build" | 345 | module="lp.soyuz.browser.build" |
239 | 343 | classes=" | 346 | classes=" |
240 | 344 | 347 | ||
241 | === modified file 'lib/lp/soyuz/browser/distributionsourcepackagerelease.py' | |||
242 | --- lib/lp/soyuz/browser/distributionsourcepackagerelease.py 2014-05-06 09:11:14 +0000 | |||
243 | +++ lib/lp/soyuz/browser/distributionsourcepackagerelease.py 2014-05-12 07:22:06 +0000 | |||
244 | @@ -32,6 +32,7 @@ | |||
245 | 32 | from lp.soyuz.interfaces.distributionsourcepackagerelease import ( | 32 | from lp.soyuz.interfaces.distributionsourcepackagerelease import ( |
246 | 33 | IDistributionSourcePackageRelease, | 33 | IDistributionSourcePackageRelease, |
247 | 34 | ) | 34 | ) |
248 | 35 | from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds | ||
249 | 35 | 36 | ||
250 | 36 | 37 | ||
251 | 37 | class DistributionSourcePackageReleaseBreadcrumb(Breadcrumb): | 38 | class DistributionSourcePackageReleaseBreadcrumb(Breadcrumb): |
252 | @@ -48,13 +49,18 @@ | |||
253 | 48 | @stepthrough('+build') | 49 | @stepthrough('+build') |
254 | 49 | def traverse_build(self, name): | 50 | def traverse_build(self, name): |
255 | 50 | build = get_build_by_id_str(IBinaryPackageBuildSet, name) | 51 | build = get_build_by_id_str(IBinaryPackageBuildSet, name) |
256 | 52 | # XXX: This should check whether any of all_distro_archives is | ||
257 | 53 | # build.archive, or any of them contain the build's binaries. | ||
258 | 51 | if (build is None | 54 | if (build is None |
261 | 52 | or build.archive not in | 55 | or (build.archive not in |
262 | 53 | self.context.distribution.all_distro_archives | 56 | self.context.distribution.all_distro_archives |
263 | 57 | and self.context.distribution.main_archive not in | ||
264 | 58 | build.sourcepackagerelease.published_archives) | ||
265 | 54 | or build.source_package_release != | 59 | or build.source_package_release != |
266 | 55 | self.context.sourcepackagerelease): | 60 | self.context.sourcepackagerelease): |
267 | 56 | return None | 61 | return None |
269 | 57 | return build | 62 | return decorate_binarypackagebuilds( |
270 | 63 | [build], archive=self.context.distribution.main_archive)[0] | ||
271 | 58 | 64 | ||
272 | 59 | 65 | ||
273 | 60 | class DistributionSourcePackageReleaseView(LaunchpadView): | 66 | class DistributionSourcePackageReleaseView(LaunchpadView): |
274 | 61 | 67 | ||
275 | === modified file 'lib/lp/soyuz/configure.zcml' | |||
276 | --- lib/lp/soyuz/configure.zcml 2014-02-18 11:40:52 +0000 | |||
277 | +++ lib/lp/soyuz/configure.zcml 2014-05-12 07:22:06 +0000 | |||
278 | @@ -491,6 +491,19 @@ | |||
279 | 491 | permission="launchpad.Admin" | 491 | permission="launchpad.Admin" |
280 | 492 | interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildAdmin"/> | 492 | interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildAdmin"/> |
281 | 493 | </class> | 493 | </class> |
282 | 494 | <class | ||
283 | 495 | class="lp.soyuz.model.binarypackagebuild.ArchiveBinaryPackageBuild"> | ||
284 | 496 | <require | ||
285 | 497 | permission="launchpad.View" | ||
286 | 498 | interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildView" | ||
287 | 499 | attributes="parent_archive build" /> | ||
288 | 500 | <require | ||
289 | 501 | permission="launchpad.Edit" | ||
290 | 502 | interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildEdit"/> | ||
291 | 503 | <require | ||
292 | 504 | permission="launchpad.Admin" | ||
293 | 505 | interface="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuildAdmin"/> | ||
294 | 506 | </class> | ||
295 | 494 | <adapter | 507 | <adapter |
296 | 495 | provides="lp.services.webapp.interfaces.IBreadcrumb" | 508 | provides="lp.services.webapp.interfaces.IBreadcrumb" |
297 | 496 | for="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuild" | 509 | for="lp.soyuz.interfaces.binarypackagebuild.IBinaryPackageBuild" |
298 | 497 | 510 | ||
299 | === modified file 'lib/lp/soyuz/interfaces/binarypackagebuild.py' | |||
300 | --- lib/lp/soyuz/interfaces/binarypackagebuild.py 2013-11-26 01:36:10 +0000 | |||
301 | +++ lib/lp/soyuz/interfaces/binarypackagebuild.py 2014-05-12 07:22:06 +0000 | |||
302 | @@ -8,6 +8,7 @@ | |||
303 | 8 | __all__ = [ | 8 | __all__ = [ |
304 | 9 | 'BuildSetStatus', | 9 | 'BuildSetStatus', |
305 | 10 | 'CannotBeRescored', | 10 | 'CannotBeRescored', |
306 | 11 | 'IArchiveBinaryPackageBuild', | ||
307 | 11 | 'IBinaryPackageBuild', | 12 | 'IBinaryPackageBuild', |
308 | 12 | 'IBuildRescoreForm', | 13 | 'IBuildRescoreForm', |
309 | 13 | 'IBinaryPackageBuildSet', | 14 | 'IBinaryPackageBuildSet', |
310 | @@ -261,6 +262,25 @@ | |||
311 | 261 | export_as_webservice_entry(singular_name='build', plural_name='builds') | 262 | export_as_webservice_entry(singular_name='build', plural_name='builds') |
312 | 262 | 263 | ||
313 | 263 | 264 | ||
314 | 265 | class IArchiveBinaryPackageBuild(IBinaryPackageBuild): | ||
315 | 266 | """A build in an archive. | ||
316 | 267 | |||
317 | 268 | `Archive`s need to be self-contained, for reasons of access control, | ||
318 | 269 | federation, deletion, and more. Since `BinaryPackageBuild`s produce | ||
319 | 270 | `BinaryPackageRelease`s that can be copied between archives, a | ||
320 | 271 | `BinaryPackageBuild` has no single archive parent -- they, like | ||
321 | 272 | `BinaryPackageRelease`s and `SourcePackageRelease`s, are | ||
322 | 273 | contextless. | ||
323 | 274 | |||
324 | 275 | `ArchiveBinaryPackageBuild` is a virtual class combining a | ||
325 | 276 | `BinaryPackageBuild` with an `Archive` as its parent, giving it a | ||
326 | 277 | URL. An `ArchiveBinaryPackageBuild` should be returned whenever | ||
327 | 278 | there is an obvious `Archive` context. | ||
328 | 279 | """ | ||
329 | 280 | parent_archive = Attribute("Parent archive") | ||
330 | 281 | build = Attribute("BinaryPackageBuild") | ||
331 | 282 | |||
332 | 283 | |||
333 | 264 | class BuildSetStatus(EnumeratedType): | 284 | class BuildSetStatus(EnumeratedType): |
334 | 265 | """`IBuildSet` status type | 285 | """`IBuildSet` status type |
335 | 266 | 286 | ||
336 | 267 | 287 | ||
337 | === modified file 'lib/lp/soyuz/model/archive.py' | |||
338 | --- lib/lp/soyuz/model/archive.py 2014-04-23 14:24:15 +0000 | |||
339 | +++ lib/lp/soyuz/model/archive.py 2014-05-12 07:22:06 +0000 | |||
340 | @@ -180,7 +180,10 @@ | |||
341 | 180 | from lp.soyuz.model.archiveauthtoken import ArchiveAuthToken | 180 | from lp.soyuz.model.archiveauthtoken import ArchiveAuthToken |
342 | 181 | from lp.soyuz.model.archivedependency import ArchiveDependency | 181 | from lp.soyuz.model.archivedependency import ArchiveDependency |
343 | 182 | from lp.soyuz.model.archivepermission import ArchivePermission | 182 | from lp.soyuz.model.archivepermission import ArchivePermission |
345 | 183 | from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild | 183 | from lp.soyuz.model.binarypackagebuild import ( |
346 | 184 | BinaryPackageBuild, | ||
347 | 185 | decorate_binarypackagebuilds, | ||
348 | 186 | ) | ||
349 | 184 | from lp.soyuz.model.binarypackagename import BinaryPackageName | 187 | from lp.soyuz.model.binarypackagename import BinaryPackageName |
350 | 185 | from lp.soyuz.model.binarypackagerelease import ( | 188 | from lp.soyuz.model.binarypackagerelease import ( |
351 | 186 | BinaryPackageRelease, | 189 | BinaryPackageRelease, |
352 | @@ -483,8 +486,9 @@ | |||
353 | 483 | # will implicitly have permission to see it. | 486 | # will implicitly have permission to see it. |
354 | 484 | 487 | ||
355 | 485 | if binary_only: | 488 | if binary_only: |
357 | 486 | return getUtility(IBinaryPackageBuildSet).getBuildsForArchive( | 489 | bpbs = getUtility(IBinaryPackageBuildSet).getBuildsForArchive( |
358 | 487 | self, build_state, name, pocket, arch_tag) | 490 | self, build_state, name, pocket, arch_tag) |
359 | 491 | return decorate_binarypackagebuilds(bpbs, archive=self) | ||
360 | 488 | else: | 492 | else: |
361 | 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: |
362 | 490 | raise IncompatibleArguments( | 494 | raise IncompatibleArguments( |
363 | 491 | 495 | ||
364 | === modified file 'lib/lp/soyuz/model/binarypackagebuild.py' | |||
365 | --- lib/lp/soyuz/model/binarypackagebuild.py 2013-12-04 07:07:04 +0000 | |||
366 | +++ lib/lp/soyuz/model/binarypackagebuild.py 2014-05-12 07:22:06 +0000 | |||
367 | @@ -5,7 +5,9 @@ | |||
368 | 5 | __all__ = [ | 5 | __all__ = [ |
369 | 6 | 'BinaryPackageBuild', | 6 | 'BinaryPackageBuild', |
370 | 7 | 'BinaryPackageBuildSet', | 7 | 'BinaryPackageBuildSet', |
371 | 8 | 'BUILD_ARCHIVE', | ||
372 | 8 | 'COPY_ARCHIVE_SCORE_PENALTY', | 9 | 'COPY_ARCHIVE_SCORE_PENALTY', |
373 | 10 | 'decorate_binarypackagebuilds', | ||
374 | 9 | 'PRIVATE_ARCHIVE_SCORE_BONUS', | 11 | 'PRIVATE_ARCHIVE_SCORE_BONUS', |
375 | 10 | 'SCORE_BY_COMPONENT', | 12 | 'SCORE_BY_COMPONENT', |
376 | 11 | 'SCORE_BY_POCKET', | 13 | 'SCORE_BY_POCKET', |
377 | @@ -16,6 +18,7 @@ | |||
378 | 16 | from operator import itemgetter | 18 | from operator import itemgetter |
379 | 17 | 19 | ||
380 | 18 | import apt_pkg | 20 | import apt_pkg |
381 | 21 | from lazr.delegates import delegates | ||
382 | 19 | import pytz | 22 | import pytz |
383 | 20 | from sqlobject import SQLObjectNotFound | 23 | from sqlobject import SQLObjectNotFound |
384 | 21 | from storm.expr import ( | 24 | from storm.expr import ( |
385 | @@ -92,6 +95,7 @@ | |||
386 | 92 | from lp.soyuz.interfaces.binarypackagebuild import ( | 95 | from lp.soyuz.interfaces.binarypackagebuild import ( |
387 | 93 | BuildSetStatus, | 96 | BuildSetStatus, |
388 | 94 | CannotBeRescored, | 97 | CannotBeRescored, |
389 | 98 | IArchiveBinaryPackageBuild, | ||
390 | 95 | IBinaryPackageBuild, | 99 | IBinaryPackageBuild, |
391 | 96 | IBinaryPackageBuildSet, | 100 | IBinaryPackageBuildSet, |
392 | 97 | UnparsableDependencies, | 101 | UnparsableDependencies, |
393 | @@ -144,6 +148,46 @@ | |||
394 | 144 | COPY_ARCHIVE_SCORE_PENALTY = 2600 | 148 | COPY_ARCHIVE_SCORE_PENALTY = 2600 |
395 | 145 | 149 | ||
396 | 146 | 150 | ||
397 | 151 | BUILD_ARCHIVE = object() | ||
398 | 152 | |||
399 | 153 | |||
400 | 154 | def decorate_binarypackagebuilds(bpbs, archive=None): | ||
401 | 155 | """Decorate `BinaryPackageBuild`s into `ArchiveBinaryPackageBuild`s. | ||
402 | 156 | |||
403 | 157 | Three types of input are supported, depending on the value of archive: | ||
404 | 158 | |||
405 | 159 | - archive=None: bpbs is a sequence of (build, archive) pairs | ||
406 | 160 | |||
407 | 161 | - archive=BUILD_ARCHIVE: bpbs is a sequence of builds, each of | ||
408 | 162 | which will be decorated with the archive in which it was built. | ||
409 | 163 | |||
410 | 164 | - archive=<some archive>: bpbs is a sequence of builds, each of | ||
411 | 165 | which will be decoreated with the given archive. | ||
412 | 166 | |||
413 | 167 | If bpbs is an IResultSet, the return value will be a DecoratedResultSet. | ||
414 | 168 | If it's a list or tuple, the return value will be a list. | ||
415 | 169 | Otherwise, the return value will be a generator. | ||
416 | 170 | """ | ||
417 | 171 | if archive is None: | ||
418 | 172 | splitter = lambda build: (build[1], build[0]) | ||
419 | 173 | elif archive is BUILD_ARCHIVE: | ||
420 | 174 | splitter = lambda build: (build.archive, build) | ||
421 | 175 | else: | ||
422 | 176 | splitter = lambda build: (archive, build) | ||
423 | 177 | |||
424 | 178 | if IResultSet.providedBy(bpbs): | ||
425 | 179 | return DecoratedResultSet( | ||
426 | 180 | bpbs, | ||
427 | 181 | lambda build: ArchiveBinaryPackageBuild(*splitter(build))) | ||
428 | 182 | else: | ||
429 | 183 | seq = ( | ||
430 | 184 | ArchiveBinaryPackageBuild(*splitter(build)) | ||
431 | 185 | for build in bpbs) | ||
432 | 186 | if isinstance(bpbs, (list, tuple)): | ||
433 | 187 | seq = list(seq) | ||
434 | 188 | return seq | ||
435 | 189 | |||
436 | 190 | |||
437 | 147 | class BinaryPackageBuild(PackageBuildMixin, SQLBase): | 191 | class BinaryPackageBuild(PackageBuildMixin, SQLBase): |
438 | 148 | implements(IBinaryPackageBuild) | 192 | implements(IBinaryPackageBuild) |
439 | 149 | _table = 'BinaryPackageBuild' | 193 | _table = 'BinaryPackageBuild' |
440 | @@ -887,6 +931,25 @@ | |||
441 | 887 | return changes.signer | 931 | return changes.signer |
442 | 888 | 932 | ||
443 | 889 | 933 | ||
444 | 934 | class ArchiveBinaryPackageBuild: | ||
445 | 935 | |||
446 | 936 | implements(IArchiveBinaryPackageBuild) | ||
447 | 937 | delegates(IBinaryPackageBuild, 'build') | ||
448 | 938 | |||
449 | 939 | def __init__(self, parent_archive, build): | ||
450 | 940 | self.parent_archive = parent_archive | ||
451 | 941 | self.build = build | ||
452 | 942 | |||
453 | 943 | def __eq__(self, other): | ||
454 | 944 | return ( | ||
455 | 945 | isinstance(other, self.__class__) | ||
456 | 946 | and self.parent_archive == other.parent_archive | ||
457 | 947 | and self.build == other.build) | ||
458 | 948 | |||
459 | 949 | def __ne__(self, other): | ||
460 | 950 | return not self.__eq__(other) | ||
461 | 951 | |||
462 | 952 | |||
463 | 890 | class BinaryPackageBuildSet(SpecificBuildFarmJobSourceMixin): | 953 | class BinaryPackageBuildSet(SpecificBuildFarmJobSourceMixin): |
464 | 891 | implements(IBinaryPackageBuildSet) | 954 | implements(IBinaryPackageBuildSet) |
465 | 892 | 955 | ||
466 | 893 | 956 | ||
467 | === modified file 'lib/lp/soyuz/model/distributionsourcepackagerelease.py' | |||
468 | --- lib/lp/soyuz/model/distributionsourcepackagerelease.py 2014-01-13 07:09:40 +0000 | |||
469 | +++ lib/lp/soyuz/model/distributionsourcepackagerelease.py 2014-05-12 07:22:06 +0000 | |||
470 | @@ -28,7 +28,10 @@ | |||
471 | 28 | ) | 28 | ) |
472 | 29 | from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease | 29 | from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease |
473 | 30 | from lp.soyuz.model.archive import Archive | 30 | from lp.soyuz.model.archive import Archive |
475 | 31 | from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild | 31 | from lp.soyuz.model.binarypackagebuild import ( |
476 | 32 | BinaryPackageBuild, | ||
477 | 33 | decorate_binarypackagebuilds, | ||
478 | 34 | ) | ||
479 | 32 | from lp.soyuz.model.binarypackagename import BinaryPackageName | 35 | from lp.soyuz.model.binarypackagename import BinaryPackageName |
480 | 33 | from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease | 36 | from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease |
481 | 34 | from lp.soyuz.model.distroseriesbinarypackage import DistroSeriesBinaryPackage | 37 | from lp.soyuz.model.distroseriesbinarypackage import DistroSeriesBinaryPackage |
482 | @@ -125,9 +128,11 @@ | |||
483 | 125 | Archive.purpose.is_in(MAIN_ARCHIVE_PURPOSES)).config( | 128 | Archive.purpose.is_in(MAIN_ARCHIVE_PURPOSES)).config( |
484 | 126 | distinct=True) | 129 | distinct=True) |
485 | 127 | 130 | ||
487 | 128 | return builds_built_in_main_archives.union( | 131 | result = builds_built_in_main_archives.union( |
488 | 129 | builds_published_in_main_archives).order_by( | 132 | builds_published_in_main_archives).order_by( |
489 | 130 | Desc(BinaryPackageBuild.id)) | 133 | Desc(BinaryPackageBuild.id)) |
490 | 134 | return decorate_binarypackagebuilds( | ||
491 | 135 | result, archive=self.distribution.main_archive) | ||
492 | 131 | 136 | ||
493 | 132 | @property | 137 | @property |
494 | 133 | def binary_package_names(self): | 138 | def binary_package_names(self): |
495 | 134 | 139 | ||
496 | === modified file 'lib/lp/soyuz/model/distroarchseries.py' | |||
497 | --- lib/lp/soyuz/model/distroarchseries.py 2014-02-28 11:12:31 +0000 | |||
498 | +++ lib/lp/soyuz/model/distroarchseries.py 2014-05-12 07:22:06 +0000 | |||
499 | @@ -266,6 +266,9 @@ | |||
500 | 266 | # now). | 266 | # now). |
501 | 267 | # Ignore "binary_only" as for a distro arch series it is only | 267 | # Ignore "binary_only" as for a distro arch series it is only |
502 | 268 | # the binaries that are relevant. | 268 | # the binaries that are relevant. |
503 | 269 | from lp.soyuz.model.binarypackagebuild import ( | ||
504 | 270 | decorate_binarypackagebuilds, | ||
505 | 271 | ) | ||
506 | 269 | 272 | ||
507 | 270 | # For consistency we return an empty resultset if arch_tag | 273 | # For consistency we return an empty resultset if arch_tag |
508 | 271 | # is provided but doesn't match our architecture. | 274 | # is provided but doesn't match our architecture. |
509 | @@ -274,8 +277,9 @@ | |||
510 | 274 | 277 | ||
511 | 275 | # Use the facility provided by IBinaryPackageBuildSet to | 278 | # Use the facility provided by IBinaryPackageBuildSet to |
512 | 276 | # retrieve the records. | 279 | # retrieve the records. |
514 | 277 | return getUtility(IBinaryPackageBuildSet).getBuildsForDistro( | 280 | bpbs = getUtility(IBinaryPackageBuildSet).getBuildsForDistro( |
515 | 278 | self, build_state, name, pocket) | 281 | self, build_state, name, pocket) |
516 | 282 | return decorate_binarypackagebuilds(bpbs, archive=self.main_archive) | ||
517 | 279 | 283 | ||
518 | 280 | def getReleasedPackages(self, binary_name, pocket=None, | 284 | def getReleasedPackages(self, binary_name, pocket=None, |
519 | 281 | include_pending=False, archive=None): | 285 | include_pending=False, archive=None): |
520 | 282 | 286 | ||
521 | === modified file 'lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py' | |||
522 | --- lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py 2013-01-21 16:27:29 +0000 | |||
523 | +++ lib/lp/soyuz/model/distroarchseriesbinarypackagerelease.py 2014-05-12 07:22:06 +0000 | |||
524 | @@ -17,6 +17,7 @@ | |||
525 | 17 | IDistroArchSeriesBinaryPackageRelease, | 17 | IDistroArchSeriesBinaryPackageRelease, |
526 | 18 | ) | 18 | ) |
527 | 19 | from lp.soyuz.interfaces.publishing import active_publishing_status | 19 | from lp.soyuz.interfaces.publishing import active_publishing_status |
528 | 20 | from lp.soyuz.model.binarypackagebuild import decorate_binarypackagebuilds | ||
529 | 20 | from lp.soyuz.model.distributionsourcepackagerelease import ( | 21 | from lp.soyuz.model.distributionsourcepackagerelease import ( |
530 | 21 | DistributionSourcePackageRelease, | 22 | DistributionSourcePackageRelease, |
531 | 22 | ) | 23 | ) |
532 | @@ -185,7 +186,9 @@ | |||
533 | 185 | @property | 186 | @property |
534 | 186 | def build(self): | 187 | def build(self): |
535 | 187 | """See `IBinaryPackageRelease`.""" | 188 | """See `IBinaryPackageRelease`.""" |
537 | 188 | return self.binarypackagerelease.build | 189 | return decorate_binarypackagebuilds( |
538 | 190 | [self.binarypackagerelease.build], | ||
539 | 191 | archive=self.distribution.main_archive)[0] | ||
540 | 189 | 192 | ||
541 | 190 | @property | 193 | @property |
542 | 191 | def binpackageformat(self): | 194 | def binpackageformat(self): |
543 | 192 | 195 | ||
544 | === modified file 'lib/lp/soyuz/model/distroseriessourcepackagerelease.py' | |||
545 | --- lib/lp/soyuz/model/distroseriessourcepackagerelease.py 2013-01-07 02:40:55 +0000 | |||
546 | +++ lib/lp/soyuz/model/distroseriessourcepackagerelease.py 2014-05-12 07:22:06 +0000 | |||
547 | @@ -26,7 +26,10 @@ | |||
548 | 26 | IDistroSeriesSourcePackageRelease, | 26 | IDistroSeriesSourcePackageRelease, |
549 | 27 | ) | 27 | ) |
550 | 28 | from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease | 28 | from lp.soyuz.interfaces.sourcepackagerelease import ISourcePackageRelease |
552 | 29 | from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild | 29 | from lp.soyuz.model.binarypackagebuild import ( |
553 | 30 | BinaryPackageBuild, | ||
554 | 31 | decorate_binarypackagebuilds, | ||
555 | 32 | ) | ||
556 | 30 | from lp.soyuz.model.binarypackagename import BinaryPackageName | 33 | from lp.soyuz.model.binarypackagename import BinaryPackageName |
557 | 31 | from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease | 34 | from lp.soyuz.model.binarypackagerelease import BinaryPackageRelease |
558 | 32 | from lp.soyuz.model.publishing import ( | 35 | from lp.soyuz.model.publishing import ( |
559 | @@ -119,9 +122,10 @@ | |||
560 | 119 | self.distroseries.distribution, | 122 | self.distroseries.distribution, |
561 | 120 | self.sourcepackagerelease).builds | 123 | self.sourcepackagerelease).builds |
562 | 121 | 124 | ||
564 | 122 | return ( | 125 | return decorate_binarypackagebuilds( |
565 | 123 | [build for build in distro_builds | 126 | [build for build in distro_builds |
567 | 124 | if build.distro_arch_series.distroseries == self.distroseries]) | 127 | if build.distro_arch_series.distroseries == self.distroseries], |
568 | 128 | archive=self.distribution.main_archive) | ||
569 | 125 | 129 | ||
570 | 126 | @property | 130 | @property |
571 | 127 | def files(self): | 131 | def files(self): |
572 | 128 | 132 | ||
573 | === modified file 'lib/lp/soyuz/model/publishing.py' | |||
574 | --- lib/lp/soyuz/model/publishing.py 2014-05-06 06:32:46 +0000 | |||
575 | +++ lib/lp/soyuz/model/publishing.py 2014-05-12 07:22:06 +0000 | |||
576 | @@ -17,10 +17,7 @@ | |||
577 | 17 | 17 | ||
578 | 18 | from collections import defaultdict | 18 | from collections import defaultdict |
579 | 19 | from datetime import datetime | 19 | from datetime import datetime |
584 | 20 | from operator import ( | 20 | from operator import attrgetter |
581 | 21 | attrgetter, | ||
582 | 22 | itemgetter, | ||
583 | 23 | ) | ||
585 | 24 | import os | 21 | import os |
586 | 25 | import re | 22 | import re |
587 | 26 | import sys | 23 | import sys |
588 | @@ -58,7 +55,6 @@ | |||
589 | 58 | from lp.services.database import bulk | 55 | from lp.services.database import bulk |
590 | 59 | from lp.services.database.constants import UTC_NOW | 56 | from lp.services.database.constants import UTC_NOW |
591 | 60 | from lp.services.database.datetimecol import UtcDateTimeCol | 57 | from lp.services.database.datetimecol import UtcDateTimeCol |
592 | 61 | from lp.services.database.decoratedresultset import DecoratedResultSet | ||
593 | 62 | from lp.services.database.enumcol import EnumCol | 58 | from lp.services.database.enumcol import EnumCol |
594 | 63 | from lp.services.database.interfaces import ( | 59 | from lp.services.database.interfaces import ( |
595 | 64 | IMasterStore, | 60 | IMasterStore, |
596 | @@ -110,7 +106,10 @@ | |||
597 | 110 | ) | 106 | ) |
598 | 111 | from lp.soyuz.interfaces.queue import QueueInconsistentStateError | 107 | from lp.soyuz.interfaces.queue import QueueInconsistentStateError |
599 | 112 | from lp.soyuz.interfaces.section import ISectionSet | 108 | from lp.soyuz.interfaces.section import ISectionSet |
601 | 113 | from lp.soyuz.model.binarypackagebuild import BinaryPackageBuild | 109 | from lp.soyuz.model.binarypackagebuild import ( |
602 | 110 | BinaryPackageBuild, | ||
603 | 111 | decorate_binarypackagebuilds, | ||
604 | 112 | ) | ||
605 | 114 | from lp.soyuz.model.binarypackagename import BinaryPackageName | 113 | from lp.soyuz.model.binarypackagename import BinaryPackageName |
606 | 115 | from lp.soyuz.model.binarypackagerelease import ( | 114 | from lp.soyuz.model.binarypackagerelease import ( |
607 | 116 | BinaryPackageRelease, | 115 | BinaryPackageRelease, |
608 | @@ -540,7 +539,8 @@ | |||
609 | 540 | @staticmethod | 539 | @staticmethod |
610 | 541 | def _convertBuilds(builds_for_sources): | 540 | def _convertBuilds(builds_for_sources): |
611 | 542 | """Convert from IPublishingSet getBuilds to SPPH getBuilds.""" | 541 | """Convert from IPublishingSet getBuilds to SPPH getBuilds.""" |
613 | 543 | return [build[1] for build in builds_for_sources] | 542 | return decorate_binarypackagebuilds( |
614 | 543 | [(build[1], build[0].archive) for build in builds_for_sources]) | ||
615 | 544 | 544 | ||
616 | 545 | def getBuilds(self): | 545 | def getBuilds(self): |
617 | 546 | """See `ISourcePackagePublishingHistory`.""" | 546 | """See `ISourcePackagePublishingHistory`.""" |
618 | @@ -1892,6 +1892,8 @@ | |||
619 | 1892 | # Thank you, Zope, for security wrapping an abstract data | 1892 | # Thank you, Zope, for security wrapping an abstract data |
620 | 1893 | # structure. | 1893 | # structure. |
621 | 1894 | summary = removeSecurityProxy(summary) | 1894 | summary = removeSecurityProxy(summary) |
622 | 1895 | summary['builds'] = decorate_binarypackagebuilds( | ||
623 | 1896 | summary['builds'], archive=archive) | ||
624 | 1895 | summary['date_published'] = source_pub.datepublished | 1897 | summary['date_published'] = source_pub.datepublished |
625 | 1896 | summary['source_package_name'] = source_pub.source_package_name | 1898 | summary['source_package_name'] = source_pub.source_package_name |
626 | 1897 | source_build_statuses[source_pub.id] = summary | 1899 | source_build_statuses[source_pub.id] = summary |
627 | @@ -1918,7 +1920,8 @@ | |||
628 | 1918 | for source_pub, builds in unpublished_per_source.items(): | 1920 | for source_pub, builds in unpublished_per_source.items(): |
629 | 1919 | summary = { | 1921 | summary = { |
630 | 1920 | 'status': BuildSetStatus.FULLYBUILT_PENDING, | 1922 | 'status': BuildSetStatus.FULLYBUILT_PENDING, |
632 | 1921 | 'builds': builds, | 1923 | 'builds': decorate_binarypackagebuilds( |
633 | 1924 | builds, archive=archive), | ||
634 | 1922 | 'date_published': source_pub.datepublished, | 1925 | 'date_published': source_pub.datepublished, |
635 | 1923 | 'source_package_name': source_pub.source_package_name, | 1926 | 'source_package_name': source_pub.source_package_name, |
636 | 1924 | } | 1927 | } |
637 | 1925 | 1928 | ||
638 | === modified file 'lib/lp/soyuz/model/queue.py' | |||
639 | --- lib/lp/soyuz/model/queue.py 2014-04-09 12:32:50 +0000 | |||
640 | +++ lib/lp/soyuz/model/queue.py 2014-05-12 07:22:06 +0000 | |||
641 | @@ -234,10 +234,15 @@ | |||
642 | 234 | 234 | ||
643 | 235 | def binaryFileUrls(self): | 235 | def binaryFileUrls(self): |
644 | 236 | """See `IPackageUpload`.""" | 236 | """See `IPackageUpload`.""" |
645 | 237 | from lp.soyuz.model.binarypackagebuild import ( | ||
646 | 238 | decorate_binarypackagebuilds, | ||
647 | 239 | ) | ||
648 | 240 | bpbs = [build.build for build in self.builds] | ||
649 | 237 | return [ | 241 | return [ |
653 | 238 | ProxiedLibraryFileAlias(file.libraryfile, build.build).http_url | 242 | ProxiedLibraryFileAlias(file.libraryfile, abpb).http_url |
654 | 239 | for build in self.builds | 243 | for abpb in decorate_binarypackagebuilds( |
655 | 240 | for bpr in build.build.binarypackages | 244 | bpbs, archive=self.archive) |
656 | 245 | for bpr in abpb.binarypackages | ||
657 | 241 | for file in bpr.files] | 246 | for file in bpr.files] |
658 | 242 | 247 | ||
659 | 243 | @property | 248 | @property |
660 | 244 | 249 | ||
661 | === modified file 'lib/lp/soyuz/scripts/tests/test_copypackage.py' | |||
662 | --- lib/lp/soyuz/scripts/tests/test_copypackage.py 2013-09-11 08:17:34 +0000 | |||
663 | +++ lib/lp/soyuz/scripts/tests/test_copypackage.py 2014-05-12 07:22:06 +0000 | |||
664 | @@ -1710,7 +1710,9 @@ | |||
665 | 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): |
666 | 1711 | # Copying a source package and its binaries from a PPA to the | 1711 | # Copying a source package and its binaries from a PPA to the |
667 | 1712 | # primary archive copies the binaries and does not create any new | 1712 | # primary archive copies the binaries and does not create any new |
669 | 1713 | # build records. | 1713 | # build records. The ArchiveBinaryPackageBuilds returned by |
670 | 1714 | # getBuilds() are distinct, but they wrap the same | ||
671 | 1715 | # BinaryPackageBuilds. | ||
672 | 1714 | source = self.test_publisher.getPubSource(archive=self.ppa) | 1716 | source = self.test_publisher.getPubSource(archive=self.ppa) |
673 | 1715 | self.test_publisher.getPubBinaries(pub_source=source) | 1717 | self.test_publisher.getPubBinaries(pub_source=source) |
674 | 1716 | self.layer.txn.commit() | 1718 | self.layer.txn.commit() |
675 | @@ -1726,7 +1728,9 @@ | |||
676 | 1726 | "%s %s in %s" % (spr.name, spr.version, self.series.name), | 1728 | "%s %s in %s" % (spr.name, spr.version, self.series.name), |
677 | 1727 | copied[0].displayname) | 1729 | copied[0].displayname) |
678 | 1728 | self.assertEqual(2, len(copied[0].getPublishedBinaries())) | 1730 | self.assertEqual(2, len(copied[0].getPublishedBinaries())) |
680 | 1729 | self.assertEqual(initial_builds, copied[0].getBuilds()) | 1731 | self.assertEqual( |
681 | 1732 | [abpb.build for abpb in initial_builds], | ||
682 | 1733 | [abpb.build for abpb in copied[0].getBuilds()]) | ||
683 | 1730 | 1734 | ||
684 | 1731 | def makeSeriesWithExtraArchitecture(self): | 1735 | def makeSeriesWithExtraArchitecture(self): |
685 | 1732 | """Make a new distroseries with an additional architecture.""" | 1736 | """Make a new distroseries with an additional architecture.""" |
686 | 1733 | 1737 | ||
687 | === modified file 'lib/lp/soyuz/stories/soyuz/xx-private-builds.txt' | |||
688 | --- lib/lp/soyuz/stories/soyuz/xx-private-builds.txt 2013-12-03 05:18:41 +0000 | |||
689 | +++ lib/lp/soyuz/stories/soyuz/xx-private-builds.txt 2014-05-12 07:22:06 +0000 | |||
690 | @@ -329,7 +329,9 @@ | |||
691 | 329 | i386 build of privacy-test 666 : PPA named p3a for Celso Providelo : Celso Providelo | 329 | i386 build of privacy-test 666 : PPA named p3a for Celso Providelo : Celso Providelo |
692 | 330 | 330 | ||
693 | 331 | When accessing the distroseries source package release page, the builds | 331 | When accessing the distroseries source package release page, the builds |
695 | 332 | portlet will display a link to the newly unembargoed build: | 332 | portlet will display a link to the newly unembargoed build. It's the |
696 | 333 | same build as the PPA, with the same ID, but structurally under the | ||
697 | 334 | primary archive: | ||
698 | 333 | 335 | ||
699 | 334 | >>> browser.open( | 336 | >>> browser.open( |
700 | 335 | ... "http://launchpad.dev/ubuntutest/breezy-autotest/" | 337 | ... "http://launchpad.dev/ubuntutest/breezy-autotest/" |
701 | @@ -340,7 +342,7 @@ | |||
702 | 340 | breezy-autotest i386 Successfully built | 342 | breezy-autotest i386 Successfully built |
703 | 341 | 343 | ||
704 | 342 | >>> print browser.getLink('i386').url | 344 | >>> print browser.getLink('i386').url |
706 | 343 | http://launchpad.dev/~cprov/+archive/p3a/+build/... | 345 | http://launchpad.dev/ubuntutest/+source/privacy-test/666/+build/... |
707 | 344 | 346 | ||
708 | 345 | Similarly, when accessing the distribution source package release page, | 347 | Similarly, when accessing the distribution source package release page, |
709 | 346 | the main content will display a link to the newly unembargoed build: | 348 | the main content will display a link to the newly unembargoed build: |
710 | @@ -353,4 +355,4 @@ | |||
711 | 353 | Breezy Badger Autotest: i386 | 355 | Breezy Badger Autotest: i386 |
712 | 354 | 356 | ||
713 | 355 | >>> print browser.getLink('i386').url | 357 | >>> print browser.getLink('i386').url |
715 | 356 | http://launchpad.dev/~cprov/+archive/p3a/+build/... | 358 | http://launchpad.dev/ubuntutest/+source/privacy-test/666/+build/... |
716 | 357 | 359 | ||
717 | === modified file 'lib/lp/soyuz/tests/test_hasbuildrecords.py' | |||
718 | --- lib/lp/soyuz/tests/test_hasbuildrecords.py 2013-11-28 08:51:32 +0000 | |||
719 | +++ lib/lp/soyuz/tests/test_hasbuildrecords.py 2014-05-12 07:22:06 +0000 | |||
720 | @@ -56,7 +56,7 @@ | |||
721 | 56 | 56 | ||
722 | 57 | def test_getBuildRecords_no_archs(self): | 57 | def test_getBuildRecords_no_archs(self): |
723 | 58 | # getBuildRecords() called without any arguments returns all builds. | 58 | # getBuildRecords() called without any arguments returns all builds. |
725 | 59 | builds = self.context.getBuildRecords() | 59 | builds = [abpb.build for abpb in self.context.getBuildRecords()] |
726 | 60 | self.assertContentEqual(builds, self.builds) | 60 | self.assertContentEqual(builds, self.builds) |
727 | 61 | 61 | ||
728 | 62 | def test_getBuildRecords_by_arch_tag(self): | 62 | def test_getBuildRecords_by_arch_tag(self): |
729 | @@ -65,7 +65,9 @@ | |||
730 | 65 | # Target one of the builds to hppa so that we have three builds | 65 | # Target one of the builds to hppa so that we have three builds |
731 | 66 | # in total, two of which are i386 and one hppa. | 66 | # in total, two of which are i386 and one hppa. |
732 | 67 | i386_builds = self.builds[:2] | 67 | i386_builds = self.builds[:2] |
734 | 68 | builds = self.context.getBuildRecords(arch_tag="i386") | 68 | builds = [ |
735 | 69 | abpb.build | ||
736 | 70 | for abpb in self.context.getBuildRecords(arch_tag="i386")] | ||
737 | 69 | self.assertContentEqual(i386_builds, builds) | 71 | self.assertContentEqual(i386_builds, builds) |
738 | 70 | 72 | ||
739 | 71 | 73 | ||
740 | @@ -295,7 +297,7 @@ | |||
741 | 295 | build2.queueBuild() | 297 | build2.queueBuild() |
742 | 296 | build1.buildqueue_record.lastscore = 10 | 298 | build1.buildqueue_record.lastscore = 10 |
743 | 297 | build2.buildqueue_record.lastscore = 1000 | 299 | build2.buildqueue_record.lastscore = 1000 |
745 | 298 | builds = list(source_package.getBuildRecords()) | 300 | builds = [abpb.build for abpb in source_package.getBuildRecords()] |
746 | 299 | self.assertEquals([build2, build1], builds) | 301 | self.assertEquals([build2, build1], builds) |
747 | 300 | 302 | ||
748 | 301 | def test_copy_archive_without_leak(self): | 303 | def test_copy_archive_without_leak(self): |
749 | @@ -328,7 +330,7 @@ | |||
750 | 328 | distroseries, PackagePublishingPocket.RELEASE, copy) | 330 | distroseries, PackagePublishingPocket.RELEASE, copy) |
751 | 329 | [copy_build] = copy_spph.createMissingBuilds() | 331 | [copy_build] = copy_spph.createMissingBuilds() |
752 | 330 | builds = copy.getBuildRecords() | 332 | builds = copy.getBuildRecords() |
754 | 331 | self.assertEquals([copy_build], list(builds)) | 333 | self.assertEquals([copy_build], [abpb.build for abpb in builds]) |
755 | 332 | source = SourcePackage(spn, spph.distroseries) | 334 | source = SourcePackage(spn, spph.distroseries) |
756 | 333 | # SourcePackage.getBuildRecords() doesn't have two build records. | 335 | # SourcePackage.getBuildRecords() doesn't have two build records. |
757 | 334 | builds = source.getBuildRecords().count() | 336 | builds = source.getBuildRecords().count() |
758 | 335 | 337 | ||
759 | === modified file 'lib/lp/soyuz/tests/test_packageupload.py' | |||
760 | --- lib/lp/soyuz/tests/test_packageupload.py 2014-04-09 12:32:50 +0000 | |||
761 | +++ lib/lp/soyuz/tests/test_packageupload.py 2014-05-12 07:22:06 +0000 | |||
762 | @@ -47,6 +47,7 @@ | |||
763 | 47 | QueueInconsistentStateError, | 47 | QueueInconsistentStateError, |
764 | 48 | ) | 48 | ) |
765 | 49 | from lp.soyuz.interfaces.section import ISectionSet | 49 | from lp.soyuz.interfaces.section import ISectionSet |
766 | 50 | from lp.soyuz.model.binarypackagebuild import ArchiveBinaryPackageBuild | ||
767 | 50 | from lp.soyuz.model.packagecopyjob import IPackageCopyJobSource | 51 | from lp.soyuz.model.packagecopyjob import IPackageCopyJobSource |
768 | 51 | from lp.soyuz.tests.test_publishing import SoyuzTestPublisher | 52 | from lp.soyuz.tests.test_publishing import SoyuzTestPublisher |
769 | 52 | from lp.testing import ( | 53 | from lp.testing import ( |
770 | @@ -1125,7 +1126,10 @@ | |||
771 | 1125 | self.assertNotEqual(0, len(ws_binary_file_urls)) | 1126 | self.assertNotEqual(0, len(ws_binary_file_urls)) |
772 | 1126 | with person_logged_in(person): | 1127 | with person_logged_in(person): |
773 | 1127 | binary_file_urls = [ | 1128 | binary_file_urls = [ |
775 | 1128 | ProxiedLibraryFileAlias(file.libraryfile, build.build).http_url | 1129 | ProxiedLibraryFileAlias( |
776 | 1130 | file.libraryfile, | ||
777 | 1131 | ArchiveBinaryPackageBuild( | ||
778 | 1132 | self.distroseries.main_archive, build.build)).http_url | ||
779 | 1129 | for build in upload.builds | 1133 | for build in upload.builds |
780 | 1130 | for bpr in build.build.binarypackages | 1134 | for bpr in build.build.binarypackages |
781 | 1131 | for file in bpr.files] | 1135 | for file in bpr.files] |