Merge lp:~abentley/launchpad/upload-failure-email-log into lp:launchpad

Proposed by Aaron Bentley
Status: Merged
Approved by: Paul Hummer
Approved revision: no longer in the source branch.
Merged at revision: 11610
Proposed branch: lp:~abentley/launchpad/upload-failure-email-log
Merge into: lp:launchpad
Diff against target: 100 lines (+22/-6)
3 files modified
lib/canonical/launchpad/emailtemplates/build-request.txt (+1/-0)
lib/lp/code/mail/sourcepackagerecipebuild.py (+3/-0)
lib/lp/code/mail/tests/test_sourcepackagerecipebuild.py (+18/-6)
To merge this branch: bzr merge lp:~abentley/launchpad/upload-failure-email-log
Reviewer Review Type Date Requested Status
Paul Hummer (community) Approve
Review via email: mp+36205@code.launchpad.net

Commit message

Fix bug #613958: upload failure emails should include the upload log

Description of the change

= Summary =
This branch fixes bug bug #613958: upload failure emails should include the
upload log.

== Proposed fix ==
Include the upload log in the email

== Pre-implementation notes ==
None

== Implementation details ==
None

== Tests ==
bin/test -t test_generateEmail_upload_failure

== Demo and Q/A ==
Request a build with a debversion that has already been built.
The failure email should include the upload log.

= Launchpad lint =

Checking for conflicts and issues in changed files.

Linting changed files:
  lib/lp/code/mail/sourcepackagerecipebuild.py
  lib/canonical/launchpad/emailtemplates/build-request.txt
  lib/lp/code/mail/tests/test_sourcepackagerecipebuild.py

./lib/lp/code/mail/sourcepackagerecipebuild.py
       5: E303 too many blank lines (3)
./lib/lp/code/mail/tests/test_sourcepackagerecipebuild.py
       5: E303 too many blank lines (3)
      30: W291 trailing whitespace
      39: W291 trailing whitespace
      40: W291 trailing whitespace
      41: W291 trailing whitespace
      42: W291 trailing whitespace
      45: E302 expected 2 blank lines, found 1
      30: Line has trailing whitespace.
      39: Line has trailing whitespace.
      40: Line has trailing whitespace.
      41: Line has trailing whitespace.
      42: Line has trailing whitespace.

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/canonical/launchpad/emailtemplates/build-request.txt'
--- lib/canonical/launchpad/emailtemplates/build-request.txt 2010-07-30 16:24:59 +0000
+++ lib/canonical/launchpad/emailtemplates/build-request.txt 2010-09-21 20:08:05 +0000
@@ -4,4 +4,5 @@
4 * Distroseries: %(distroseries)s4 * Distroseries: %(distroseries)s
5 * Duration: %(duration)s5 * Duration: %(duration)s
6 * Build Log: %(log_url)s6 * Build Log: %(log_url)s
7 * Upload Log: %(upload_log_url)s
7 * Builder: %(builder_url)s8 * Builder: %(builder_url)s
89
=== modified file 'lib/lp/code/mail/sourcepackagerecipebuild.py'
--- lib/lp/code/mail/sourcepackagerecipebuild.py 2010-08-20 20:31:18 +0000
+++ lib/lp/code/mail/sourcepackagerecipebuild.py 2010-09-21 20:08:05 +0000
@@ -67,6 +67,7 @@
67 'duration': '',67 'duration': '',
68 'builder_url': '',68 'builder_url': '',
69 'build_url': canonical_url(self.build),69 'build_url': canonical_url(self.build),
70 'upload_log_url': '',
70 })71 })
71 if self.build.builder is not None:72 if self.build.builder is not None:
72 params['builder_url'] = canonical_url(self.build.builder)73 params['builder_url'] = canonical_url(self.build.builder)
@@ -75,6 +76,8 @@
75 params['duration'] = duration_formatter.approximateduration()76 params['duration'] = duration_formatter.approximateduration()
76 if self.build.log is not None:77 if self.build.log is not None:
77 params['log_url'] = self.build.log.getURL()78 params['log_url'] = self.build.log.getURL()
79 if self.build.upload_log is not None:
80 params['upload_log_url'] = self.build.upload_log_url
78 return params81 return params
7982
80 def _getFooter(self, params):83 def _getFooter(self, params):
8184
=== modified file 'lib/lp/code/mail/tests/test_sourcepackagerecipebuild.py'
--- lib/lp/code/mail/tests/test_sourcepackagerecipebuild.py 2010-08-27 11:19:54 +0000
+++ lib/lp/code/mail/tests/test_sourcepackagerecipebuild.py 2010-09-21 20:08:05 +0000
@@ -27,6 +27,7 @@
27 * Distroseries: distroseries27 * Distroseries: distroseries
28 * Duration: five minutes28 * Duration: five minutes
29 * Build Log: %s29 * Build Log: %s
30 * Upload Log:
30 * Builder: http://launchpad.dev/builders/bob31 * Builder: http://launchpad.dev/builders/bob
31"""32"""
3233
@@ -37,6 +38,7 @@
37 * Distroseries: distroseries38 * Distroseries: distroseries
38 * Duration: 39 * Duration:
39 * Build Log: 40 * Build Log:
41 * Upload Log:
40 * Builder: 42 * Builder:
41"""43"""
4244
@@ -44,6 +46,11 @@
4446
45 layer = LaunchpadFunctionalLayer47 layer = LaunchpadFunctionalLayer
4648
49 def makeStatusEmail(self, build):
50 mailer = SourcePackageRecipeBuildMailer.forStatus(build)
51 email = build.requester.preferredemail.email
52 return mailer.generateEmail(email, build.requester)
53
47 def test_generateEmail(self):54 def test_generateEmail(self):
48 """GenerateEmail produces the right headers and body."""55 """GenerateEmail produces the right headers and body."""
49 person = self.factory.makePerson(name='person')56 person = self.factory.makePerson(name='person')
@@ -59,9 +66,7 @@
59 naked_build.builder = self.factory.makeBuilder(name='bob')66 naked_build.builder = self.factory.makeBuilder(name='bob')
60 naked_build.log = self.factory.makeLibraryFileAlias()67 naked_build.log = self.factory.makeLibraryFileAlias()
61 Store.of(build).flush()68 Store.of(build).flush()
62 mailer = SourcePackageRecipeBuildMailer.forStatus(build)69 ctrl = self.makeStatusEmail(build)
63 email = build.requester.preferredemail.email
64 ctrl = mailer.generateEmail(email, build.requester)
65 self.assertEqual(70 self.assertEqual(
66 u'[recipe build #%d] of ~person recipe in distroseries: '71 u'[recipe build #%d] of ~person recipe in distroseries: '
67 'Successfully built' % (build.id), ctrl.subject)72 'Successfully built' % (build.id), ctrl.subject)
@@ -93,9 +98,7 @@
93 recipe=cake, distroseries=secret, archive=pantry,98 recipe=cake, distroseries=secret, archive=pantry,
94 status=BuildStatus.SUPERSEDED)99 status=BuildStatus.SUPERSEDED)
95 Store.of(build).flush()100 Store.of(build).flush()
96 mailer = SourcePackageRecipeBuildMailer.forStatus(build)101 ctrl = self.makeStatusEmail(build)
97 email = build.requester.preferredemail.email
98 ctrl = mailer.generateEmail(email, build.requester)
99 self.assertEqual(102 self.assertEqual(
100 u'[recipe build #%d] of ~person recipe in distroseries: '103 u'[recipe build #%d] of ~person recipe in distroseries: '
101 'Build for superseded Source' % (build.id), ctrl.subject)104 'Build for superseded Source' % (build.id), ctrl.subject)
@@ -114,6 +117,15 @@
114 self.assertEqual(117 self.assertEqual(
115 'SUPERSEDED', ctrl.headers['X-Launchpad-Build-State'])118 'SUPERSEDED', ctrl.headers['X-Launchpad-Build-State'])
116119
120 def test_generateEmail_upload_failure(self):
121 """GenerateEmail works when many fields are NULL."""
122 build = self.factory.makeSourcePackageRecipeBuild()
123 removeSecurityProxy(build).upload_log = (
124 self.factory.makeLibraryFileAlias())
125 upload_log_fragment = 'Upload Log: %s' % build.upload_log_url
126 ctrl = self.makeStatusEmail(build)
127 self.assertTrue(upload_log_fragment in ctrl.body)
128
117129
118def test_suite():130def test_suite():
119 return TestLoader().loadTestsFromName(__name__)131 return TestLoader().loadTestsFromName(__name__)