Merge lp:~cprov/launchpad/pubdistro-bug-1290481 into lp:launchpad

Proposed by Celso Providelo
Status: Merged
Approved by: William Grant
Approved revision: no longer in the source branch.
Merged at revision: 16956
Proposed branch: lp:~cprov/launchpad/pubdistro-bug-1290481
Merge into: lp:launchpad
Diff against target: 150 lines (+68/-7)
2 files modified
lib/lp/archivepublisher/scripts/publish_ftpmaster.py (+16/-5)
lib/lp/archivepublisher/tests/test_publish_ftpmaster.py (+52/-2)
To merge this branch: bzr merge lp:~cprov/launchpad/pubdistro-bug-1290481
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+210335@code.launchpad.net

Commit message

Suppress finalize.d parts (mirroring) running when publishing empty security suites. It prevents mirroring of unsigned custom uploads (signing is done in publish.d parts only when there was any publication).

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) :
review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/archivepublisher/scripts/publish_ftpmaster.py'
2--- lib/lp/archivepublisher/scripts/publish_ftpmaster.py 2012-06-22 17:26:53 +0000
3+++ lib/lp/archivepublisher/scripts/publish_ftpmaster.py 2014-03-11 03:51:26 +0000
4@@ -532,16 +532,20 @@
5 self.runParts(distribution, 'finalize.d', env)
6
7 def publishSecurityUploads(self, distribution):
8- """Quickly process just the pending security uploads."""
9+ """Quickly process just the pending security uploads.
10+
11+ Returns True if publications were made, False otherwise.
12+ """
13 self.logger.debug("Expediting security uploads.")
14 security_suites = self.getDirtySecuritySuites(distribution)
15 if len(security_suites) == 0:
16 self.logger.debug("Nothing to do for security publisher.")
17- return
18+ return False
19
20 self.publishDistroArchive(
21 distribution, distribution.main_archive,
22 security_suites=security_suites)
23+ return True
24
25 def publishDistroUploads(self, distribution):
26 """Publish the distro's complete uploads."""
27@@ -559,12 +563,17 @@
28 updates on the main archive. This is much faster, so it
29 makes sense to do a security-only run before the main
30 event to expedite critical fixes.
31+ :return has_published: True if any publication was made to the
32+ archive.
33 """
34+ has_published = False
35 try:
36 if security_only:
37- self.publishSecurityUploads(distribution)
38+ has_published = self.publishSecurityUploads(distribution)
39 else:
40 self.publishDistroUploads(distribution)
41+ # Let's assume the main archive is always modified
42+ has_published = True
43
44 # Swizzle the now-updated backup dists and the current dists
45 # around.
46@@ -578,6 +587,8 @@
47 self.recoverWorkingDists()
48 raise
49
50+ return has_published
51+
52 def prepareFreshSeries(self, distribution):
53 """If there are any new distroseries, prepare them for publishing.
54
55@@ -614,8 +625,8 @@
56 self.processAccepted(distribution)
57
58 self.rsyncBackupDists(distribution)
59- self.publish(distribution, security_only=True)
60- self.runFinalizeParts(distribution, security_only=True)
61+ if self.publish(distribution, security_only=True):
62+ self.runFinalizeParts(distribution, security_only=True)
63
64 if not self.options.security_only:
65 self.rsyncBackupDists(distribution)
66
67=== modified file 'lib/lp/archivepublisher/tests/test_publish_ftpmaster.py'
68--- lib/lp/archivepublisher/tests/test_publish_ftpmaster.py 2013-07-25 20:25:56 +0000
69+++ lib/lp/archivepublisher/tests/test_publish_ftpmaster.py 2014-03-11 03:51:26 +0000
70@@ -658,9 +658,23 @@
71 distro = script.distributions[0]
72 script.setUpDirs()
73 script.installDists = FakeMethod()
74- script.publishSecurityUploads(distro)
75+ has_published = script.publishSecurityUploads(distro)
76+ self.assertFalse(has_published)
77 self.assertEqual(0, script.installDists.call_count)
78
79+ def test_publishSecurityUploads_returns_true_when_publishes(self):
80+ distro = self.makeDistroWithPublishDirectory()
81+ distroseries = self.factory.makeDistroSeries(distribution=distro)
82+ self.factory.makeSourcePackagePublishingHistory(
83+ distroseries=distroseries,
84+ pocket=PackagePublishingPocket.SECURITY)
85+ script = self.makeScript(distro)
86+ script.setUp()
87+ script.setUpDirs()
88+ script.installDists = FakeMethod()
89+ has_published = script.publishSecurityUploads(distro)
90+ self.assertTrue(has_published)
91+
92 def test_publishDistroUploads_publishes_all_distro_archives(self):
93 distro = self.makeDistroWithPublishDirectory()
94 distroseries = self.factory.makeDistroSeries(distribution=distro)
95@@ -721,11 +735,21 @@
96
97 def test_security_run_publishes_only_security_updates(self):
98 script = self.makeScript(extra_args=['--security-only'])
99- script.publish = FakeMethod()
100+ script.runFinalizeParts = FakeMethod()
101+ script.publish = FakeMethod(result=True)
102 script.main()
103 self.assertEqual(1, script.publish.call_count)
104 args, kwargs = script.publish.calls[0]
105 self.assertEqual({'security_only': True}, kwargs)
106+ self.assertEqual(1, script.runFinalizeParts.call_count)
107+
108+ def test_security_run_empty_security_does_not_finalize(self):
109+ script = self.makeScript(extra_args=['--security-only'])
110+ script.runFinalizeParts = FakeMethod()
111+ script.publish = FakeMethod(result=False)
112+ script.main()
113+ self.assertEqual(1, script.publish.call_count)
114+ self.assertEqual(0, script.runFinalizeParts.call_count)
115
116 def test_publishDistroUploads_processes_all_archives(self):
117 distro = self.makeDistroWithPublishDirectory()
118@@ -786,6 +810,32 @@
119 "Did not find expected marker for %s."
120 % archive.purpose.title)
121
122+ def test_publish_always_returns_true_for_primary(self):
123+ script = self.makeScript()
124+ script.publishDistroUploads = FakeMethod()
125+ script.setUp()
126+ script.setUpDirs()
127+ result = script.publish(script.distributions[0], security_only=False)
128+ self.assertTrue(result)
129+
130+ def test_publish_returns_true_for_non_empty_security(self):
131+ script = self.makeScript(extra_args=['--security-only'])
132+ script.setUp()
133+ script.setUpDirs()
134+ script.installDists = FakeMethod()
135+ script.publishSecurityUploads = FakeMethod(result=True)
136+ result = script.publish(script.distributions[0], security_only=True)
137+ self.assertTrue(result)
138+
139+ def test_publish_returns_false_for_empty_security(self):
140+ script = self.makeScript(extra_args=['--security-only'])
141+ script.setUp()
142+ script.setUpDirs()
143+ script.installDists = FakeMethod()
144+ script.publishSecurityUploads = FakeMethod(result=False)
145+ result = script.publish(script.distributions[0], security_only=True)
146+ self.assertFalse(result)
147+
148 def test_publish_reraises_exception(self):
149 # If an Exception comes up while publishing, it bubbles up out
150 # of the publish method even though the method must intercept