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
1=== modified file 'lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py'
2--- lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py 2010-08-01 22:31:42 +0000
3+++ lib/lp/code/browser/tests/test_sourcepackagerecipebuild.py 2010-08-09 20:52:48 +0000
4@@ -7,13 +7,14 @@
5 __metaclass__ = type
6
7 from mechanize import LinkNotFoundError
8+from storm.locals import Store
9 import transaction
10 from zope.component import getUtility
11 from zope.security.proxy import removeSecurityProxy
12
13 from canonical.launchpad.interfaces.launchpad import ILaunchpadCelebrities
14 from canonical.launchpad.testing.pages import (
15- extract_text, find_tags_by_class)
16+ extract_text, find_main_content, find_tags_by_class)
17 from canonical.launchpad.webapp import canonical_url
18 from canonical.testing import DatabaseFunctionalLayer
19 from lp.buildmaster.interfaces.buildbase import BuildStatus
20@@ -189,3 +190,15 @@
21 self.assertRaises(
22 LinkNotFoundError,
23 browser.getLink, 'Rescore build')
24+
25+ def test_builder_history(self):
26+ build = self.makeRecipeBuild()
27+ Store.of(build).flush()
28+ build_url = canonical_url(build)
29+ removeSecurityProxy(build).builder = self.factory.makeBuilder()
30+ browser = self.getViewBrowser(build.builder, '+history')
31+ self.assertTextMatchesExpressionIgnoreWhitespace(
32+ 'Build history.*~chef/chocolate/cake recipe build',
33+ extract_text(find_main_content(browser.contents)))
34+ self.assertEqual(build_url,
35+ browser.getLink('~chef/chocolate/cake recipe build').url)
36
37=== modified file 'lib/lp/code/configure.zcml'
38--- lib/lp/code/configure.zcml 2010-07-26 20:08:06 +0000
39+++ lib/lp/code/configure.zcml 2010-08-09 20:52:48 +0000
40@@ -990,5 +990,10 @@
41 name="RECIPEBRANCHBUILD"
42 provides="lp.buildmaster.interfaces.buildfarmjob.IBuildFarmJob"/>
43 <webservice:register module="lp.code.interfaces.webservice" />
44-
45+ <adapter
46+ provides="lp.buildmaster.interfaces.buildfarmjob.ISpecificBuildFarmJob"
47+ for="lp.buildmaster.interfaces.buildfarmjob.IBuildFarmJob"
48+ factory="lp.code.model.sourcepackagerecipebuild.get_recipe_build_for_build_farm_job"
49+ name="RECIPEBRANCHBUILD"
50+ permission="zope.Public"/>
51 </configure>
52
53=== modified file 'lib/lp/code/model/sourcepackagerecipebuild.py'
54--- lib/lp/code/model/sourcepackagerecipebuild.py 2010-08-03 08:49:19 +0000
55+++ lib/lp/code/model/sourcepackagerecipebuild.py 2010-08-09 20:52:48 +0000
56@@ -26,6 +26,7 @@
57
58 from zope.component import getUtility
59 from zope.interface import classProvides, implements
60+from zope.security.proxy import ProxyFactory
61
62 from canonical.launchpad.webapp import errorlog
63 from lp.app.errors import NotFoundError
64@@ -345,3 +346,12 @@
65
66 def score(self):
67 return 2405 + self.build.archive.relative_build_score
68+
69+
70+def get_recipe_build_for_build_farm_job(build_farm_job):
71+ """Return the SourcePackageRecipeBuild associated with a BuildFarmJob."""
72+ store = Store.of(build_farm_job)
73+ result = store.find(SourcePackageRecipeBuild,
74+ SourcePackageRecipeBuild.package_build_id == PackageBuild.id,
75+ PackageBuild.build_farm_job_id == build_farm_job.id)
76+ return ProxyFactory(result.one())
77
78=== modified file 'lib/lp/code/model/tests/test_sourcepackagerecipebuild.py'
79--- lib/lp/code/model/tests/test_sourcepackagerecipebuild.py 2010-08-04 13:48:18 +0000
80+++ lib/lp/code/model/tests/test_sourcepackagerecipebuild.py 2010-08-09 20:52:48 +0000
81@@ -289,6 +289,14 @@
82 BuildStatus.SUPERSEDED,
83 build.status)
84
85+ def test_getSpecificJob(self):
86+ # getSpecificJob returns the SourcePackageRecipeBuild
87+ sprb = self.makeSourcePackageRecipeBuild()
88+ Store.of(sprb).flush()
89+ build = sprb.build_farm_job
90+ job = sprb.build_farm_job.getSpecificJob()
91+ self.assertEqual(sprb, job)
92+
93
94 class TestAsBuildmaster(TestCaseWithFactory):
95
96
97=== modified file 'lib/lp/soyuz/browser/build.py'
98--- lib/lp/soyuz/browser/build.py 2010-08-04 04:07:21 +0000
99+++ lib/lp/soyuz/browser/build.py 2010-08-09 20:52:48 +0000
100@@ -331,9 +331,11 @@
101
102 complete_builds = []
103 for build in builds:
104- buildqueue = prefetched_data.get(build.id)
105- complete_builds.append(CompleteBuild(build, buildqueue))
106-
107+ if IBinaryPackageBuild.providedBy(build):
108+ buildqueue = prefetched_data.get(build.id)
109+ complete_builds.append(CompleteBuild(build, buildqueue))
110+ else:
111+ complete_builds.append(build)
112 return complete_builds
113
114
115
116=== modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
117--- lib/lp/soyuz/model/binarypackagebuild.py 2010-08-03 08:49:19 +0000
118+++ lib/lp/soyuz/model/binarypackagebuild.py 2010-08-09 20:52:48 +0000
119@@ -1159,7 +1159,7 @@
120 )
121 result_set = store.using(*origin).find(
122 (BuildQueue, Builder, BuildPackageJob),
123- In(BinaryPackageBuild.id, build_ids))
124+ BinaryPackageBuild.id.is_in(build_ids))
125
126 return result_set
127

Subscribers

People subscribed via source and target branches

to status/vote changes: