Merge lp:~abentley/launchpad/fix-builder-history into lp:launchpad/db-devel

Proposed by Aaron Bentley
Status: Merged
Merged at revision: 9643
Proposed branch: lp:~abentley/launchpad/fix-builder-history
Merge into: lp:launchpad/db-devel
Diff against target: 126 lines (+44/-6)
6 files modified
lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py (+14/-1)
lib/lp/code/configure.zcml (+6/-1)
lib/lp/code/model/sourcepackagerecipebuild.py (+10/-0)
lib/lp/code/model/tests/test_sourcepackagerecipebuild.py (+8/-0)
lib/lp/soyuz/browser/build.py (+5/-3)
lib/lp/soyuz/model/binarypackagebuild.py (+1/-1)
To merge this branch: bzr merge lp:~abentley/launchpad/fix-builder-history
Reviewer Review Type Date Requested Status
Julian Edwards (community) release-critical Approve
Paul Hummer (community) code Approve
Review via email: mp+32150@code.launchpad.net

Commit message

Fix builder history with recipe builds

Description of the change

= Summary =
Fix bug #615562: sourcepackagerecipebuilds break branch history page

== Proposed fix ==
Provide an adaptor from lp.buildmaster.interfaces.buildfarmjob.IBuildFarmJob to
lp.buildmaster.interfaces.buildfarmjob.ISpecificBuildFarmJob that converts it
to returns a SourcePackageRecipeBuild.

== Pre-implementation notes ==
Discussed with bigjools

== Implementation details ==
Implemented get_recipe_build_for_build_farm_job as the adaptor.

Stopped returning CompleteBuild for non-BinaryPackageBuilds, because this
causes the wrong URL to be used.

Switched from In(BinaryPackageBuild.id, build_ids) to
BinaryPackageBuild.id.is_in(build_ids) because "In" was generating invalid SQL
when build_ids was empty.

== Tests ==
bin/test -t test_getSpecificJob -t test_builder_history

== Demo and Q/A ==
Create a SourcePackageRecipeBuild. After it has been built, look at its
builder's history page. The build should be listed, and should have the
correct URL.

= Launchpad lint =

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/code/model/tests/test_sourcepackagerecipebuild.py
  lib/lp/code/configure.zcml
  lib/lp/soyuz/browser/build.py
  lib/lp/code/model/sourcepackagerecipebuild.py
  lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py
  lib/lp/soyuz/model/binarypackagebuild.py

./lib/lp/soyuz/browser/build.py
      40: 'IHasBuildRecords' imported but unused
     297: E301 expected 1 blank line, found 0
     499: E202 whitespace before ')'
./lib/lp/code/model/sourcepackagerecipebuild.py
      50: E231 missing whitespace after ','
./lib/lp/soyuz/model/binarypackagebuild.py
     376: E202 whitespace before '}'
     447: W602 deprecated form of raising exception
     451: E231 missing whitespace after ','
     481: E501 line too long (83 characters)
     557: E203 whitespace before ':'
     671: E203 whitespace before ':'
     749: E202 whitespace before ')'
     907: E202 whitespace before ']'
     481: Line exceeds 78 characters.
     813: Line exceeds 78 characters.

To post a comment you must log in.
Revision history for this message
Paul Hummer (rockstar) wrote :

Land it!

review: Approve (code)
Revision history for this message
Julian Edwards (julian-edwards) wrote :

Thanks for the fix!

review: Approve (release-critical)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py'
--- lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py 2010-08-01 22:31:42 +0000
+++ lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py 2010-08-09 20:52:48 +0000
@@ -7,13 +7,14 @@
7__metaclass__ = type7__metaclass__ = type
88
9from mechanize import LinkNotFoundError9from mechanize import LinkNotFoundError
10from storm.locals import Store
10import transaction11import transaction
11from zope.component import getUtility12from zope.component import getUtility
12from zope.security.proxy import removeSecurityProxy13from zope.security.proxy import removeSecurityProxy
1314
14from canonical.launchpad.interfaces.launchpad import ILaunchpadCelebrities15from canonical.launchpad.interfaces.launchpad import ILaunchpadCelebrities
15from canonical.launchpad.testing.pages import (16from canonical.launchpad.testing.pages import (
16 extract_text, find_tags_by_class)17 extract_text, find_main_content, find_tags_by_class)
17from canonical.launchpad.webapp import canonical_url18from canonical.launchpad.webapp import canonical_url
18from canonical.testing import DatabaseFunctionalLayer19from canonical.testing import DatabaseFunctionalLayer
19from lp.buildmaster.interfaces.buildbase import BuildStatus20from lp.buildmaster.interfaces.buildbase import BuildStatus
@@ -189,3 +190,15 @@
189 self.assertRaises(190 self.assertRaises(
190 LinkNotFoundError,191 LinkNotFoundError,
191 browser.getLink, 'Rescore build')192 browser.getLink, 'Rescore build')
193
194 def test_builder_history(self):
195 build = self.makeRecipeBuild()
196 Store.of(build).flush()
197 build_url = canonical_url(build)
198 removeSecurityProxy(build).builder = self.factory.makeBuilder()
199 browser = self.getViewBrowser(build.builder, '+history')
200 self.assertTextMatchesExpressionIgnoreWhitespace(
201 'Build history.*~chef/chocolate/cake recipe build',
202 extract_text(find_main_content(browser.contents)))
203 self.assertEqual(build_url,
204 browser.getLink('~chef/chocolate/cake recipe build').url)
192205
=== modified file 'lib/lp/code/configure.zcml'
--- lib/lp/code/configure.zcml 2010-07-26 20:08:06 +0000
+++ lib/lp/code/configure.zcml 2010-08-09 20:52:48 +0000
@@ -990,5 +990,10 @@
990 name="RECIPEBRANCHBUILD"990 name="RECIPEBRANCHBUILD"
991 provides="lp.buildmaster.interfaces.buildfarmjob.IBuildFarmJob"/>991 provides="lp.buildmaster.interfaces.buildfarmjob.IBuildFarmJob"/>
992 <webservice:register module="lp.code.interfaces.webservice" />992 <webservice:register module="lp.code.interfaces.webservice" />
993993 <adapter
994 provides="lp.buildmaster.interfaces.buildfarmjob.ISpecificBuildFarmJob"
995 for="lp.buildmaster.interfaces.buildfarmjob.IBuildFarmJob"
996 factory="lp.code.model.sourcepackagerecipebuild.get_recipe_build_for_build_farm_job"
997 name="RECIPEBRANCHBUILD"
998 permission="zope.Public"/>
994</configure>999</configure>
9951000
=== modified file 'lib/lp/code/model/sourcepackagerecipebuild.py'
--- lib/lp/code/model/sourcepackagerecipebuild.py 2010-08-03 08:49:19 +0000
+++ lib/lp/code/model/sourcepackagerecipebuild.py 2010-08-09 20:52:48 +0000
@@ -26,6 +26,7 @@
2626
27from zope.component import getUtility27from zope.component import getUtility
28from zope.interface import classProvides, implements28from zope.interface import classProvides, implements
29from zope.security.proxy import ProxyFactory
2930
30from canonical.launchpad.webapp import errorlog31from canonical.launchpad.webapp import errorlog
31from lp.app.errors import NotFoundError32from lp.app.errors import NotFoundError
@@ -345,3 +346,12 @@
345346
346 def score(self):347 def score(self):
347 return 2405 + self.build.archive.relative_build_score348 return 2405 + self.build.archive.relative_build_score
349
350
351def get_recipe_build_for_build_farm_job(build_farm_job):
352 """Return the SourcePackageRecipeBuild associated with a BuildFarmJob."""
353 store = Store.of(build_farm_job)
354 result = store.find(SourcePackageRecipeBuild,
355 SourcePackageRecipeBuild.package_build_id == PackageBuild.id,
356 PackageBuild.build_farm_job_id == build_farm_job.id)
357 return ProxyFactory(result.one())
348358
=== modified file 'lib/lp/code/model/tests/test_sourcepackagerecipebuild.py'
--- lib/lp/code/model/tests/test_sourcepackagerecipebuild.py 2010-08-04 13:48:18 +0000
+++ lib/lp/code/model/tests/test_sourcepackagerecipebuild.py 2010-08-09 20:52:48 +0000
@@ -289,6 +289,14 @@
289 BuildStatus.SUPERSEDED,289 BuildStatus.SUPERSEDED,
290 build.status)290 build.status)
291291
292 def test_getSpecificJob(self):
293 # getSpecificJob returns the SourcePackageRecipeBuild
294 sprb = self.makeSourcePackageRecipeBuild()
295 Store.of(sprb).flush()
296 build = sprb.build_farm_job
297 job = sprb.build_farm_job.getSpecificJob()
298 self.assertEqual(sprb, job)
299
292300
293class TestAsBuildmaster(TestCaseWithFactory):301class TestAsBuildmaster(TestCaseWithFactory):
294302
295303
=== modified file 'lib/lp/soyuz/browser/build.py'
--- lib/lp/soyuz/browser/build.py 2010-08-04 04:07:21 +0000
+++ lib/lp/soyuz/browser/build.py 2010-08-09 20:52:48 +0000
@@ -331,9 +331,11 @@
331331
332 complete_builds = []332 complete_builds = []
333 for build in builds:333 for build in builds:
334 buildqueue = prefetched_data.get(build.id)334 if IBinaryPackageBuild.providedBy(build):
335 complete_builds.append(CompleteBuild(build, buildqueue))335 buildqueue = prefetched_data.get(build.id)
336336 complete_builds.append(CompleteBuild(build, buildqueue))
337 else:
338 complete_builds.append(build)
337 return complete_builds339 return complete_builds
338340
339341
340342
=== modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
--- lib/lp/soyuz/model/binarypackagebuild.py 2010-08-03 08:49:19 +0000
+++ lib/lp/soyuz/model/binarypackagebuild.py 2010-08-09 20:52:48 +0000
@@ -1159,7 +1159,7 @@
1159 )1159 )
1160 result_set = store.using(*origin).find(1160 result_set = store.using(*origin).find(
1161 (BuildQueue, Builder, BuildPackageJob),1161 (BuildQueue, Builder, BuildPackageJob),
1162 In(BinaryPackageBuild.id, build_ids))1162 BinaryPackageBuild.id.is_in(build_ids))
11631163
1164 return result_set1164 return result_set
11651165

Subscribers

People subscribed via source and target branches

to status/vote changes: