Merge lp:~cjwatson/launchpad/immutable-contents into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 17757
Proposed branch: lp:~cjwatson/launchpad/immutable-contents
Merge into: lp:launchpad
Diff against target: 229 lines (+71/-21)
6 files modified
lib/lp/archivepublisher/publishing.py (+10/-8)
lib/lp/archivepublisher/scripts/generate_contents_files.py (+6/-0)
lib/lp/archivepublisher/scripts/publish_ftpmaster.py (+6/-1)
lib/lp/archivepublisher/scripts/publishdistro.py (+3/-2)
lib/lp/archivepublisher/tests/test_generate_contents_files.py (+25/-9)
lib/lp/archivepublisher/tests/test_publish_ftpmaster.py (+21/-1)
To merge this branch: bzr merge lp:~cjwatson/launchpad/immutable-contents
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+272102@code.launchpad.net

Commit message

Don't generate Contents files for immutable suites.

Description of the change

Don't generate Contents files for immutable suites. We won't update their Release files and so checksums there will become outdated.

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/publishing.py'
2--- lib/lp/archivepublisher/publishing.py 2015-03-18 17:51:16 +0000
3+++ lib/lp/archivepublisher/publishing.py 2015-09-23 13:33:45 +0000
4@@ -2,6 +2,7 @@
5 # GNU Affero General Public License version 3 (see the file LICENSE).
6
7 __all__ = [
8+ 'cannot_modify_suite',
9 'FORMAT_TO_SUBCOMPONENT',
10 'GLOBAL_PUBLISHER_LOCK',
11 'Publisher',
12@@ -191,6 +192,13 @@
13 return os.path.join(component_root, subcomp, arch_path, "Packages")
14
15
16+def cannot_modify_suite(archive, distroseries, pocket):
17+ """Return True for Release pockets of stable series in primary archives."""
18+ return (not distroseries.isUnstable() and
19+ not archive.allowUpdatesToReleasePocket() and
20+ pocket == PackagePublishingPocket.RELEASE)
21+
22+
23 class I18nIndex(_multivalued):
24 """Represents an i18n/Index file."""
25 _multivalued_fields = {
26@@ -482,7 +490,7 @@
27 for distroseries, pocket in chain(source_suites, binary_suites):
28 if self.isDirty(distroseries, pocket):
29 continue
30- if (self.cannotModifySuite(distroseries, pocket)
31+ if (cannot_modify_suite(self.archive, distroseries, pocket)
32 or not self.isAllowed(distroseries, pocket)):
33 # We don't want to mark release pockets dirty in a
34 # stable distroseries, no matter what other bugs
35@@ -725,12 +733,6 @@
36 if separate_long_descriptions:
37 translation_en.close()
38
39- def cannotModifySuite(self, distroseries, pocket):
40- """Return True if the distroseries is stable and pocket is release."""
41- return (not distroseries.isUnstable() and
42- not self.archive.allowUpdatesToReleasePocket() and
43- pocket == PackagePublishingPocket.RELEASE)
44-
45 def checkDirtySuiteBeforePublishing(self, distroseries, pocket):
46 """Last check before publishing a dirty suite.
47
48@@ -738,7 +740,7 @@
49 in RELEASE pocket (primary archives) we certainly have a problem,
50 better stop.
51 """
52- if self.cannotModifySuite(distroseries, pocket):
53+ if cannot_modify_suite(self.archive, distroseries, pocket):
54 raise AssertionError(
55 "Oops, tainting RELEASE pocket of %s." % distroseries)
56
57
58=== modified file 'lib/lp/archivepublisher/scripts/generate_contents_files.py'
59--- lib/lp/archivepublisher/scripts/generate_contents_files.py 2015-02-13 10:43:03 +0000
60+++ lib/lp/archivepublisher/scripts/generate_contents_files.py 2015-09-23 13:33:45 +0000
61@@ -14,6 +14,7 @@
62 from zope.component import getUtility
63
64 from lp.archivepublisher.config import getPubConfig
65+from lp.archivepublisher.publishing import cannot_modify_suite
66 from lp.registry.interfaces.distribution import IDistributionSet
67 from lp.registry.interfaces.pocket import PackagePublishingPocket
68 from lp.services.command_spawner import (
69@@ -133,9 +134,14 @@
70
71 def getSuites(self):
72 """Return suites that need Contents files."""
73+ # XXX cjwatson 2015-09-23: This script currently only supports the
74+ # primary archive.
75+ archive = self.distribution.main_archive
76 for series in self.distribution.getNonObsoleteSeries():
77 for pocket in PackagePublishingPocket.items:
78 suite = series.getSuite(pocket)
79+ if cannot_modify_suite(archive, series, pocket):
80+ continue
81 if file_exists(os.path.join(self.config.distsroot, suite)):
82 yield suite
83
84
85=== modified file 'lib/lp/archivepublisher/scripts/publish_ftpmaster.py'
86--- lib/lp/archivepublisher/scripts/publish_ftpmaster.py 2015-03-20 14:02:46 +0000
87+++ lib/lp/archivepublisher/scripts/publish_ftpmaster.py 2015-09-23 13:33:45 +0000
88@@ -18,7 +18,10 @@
89
90 from lp.archivepublisher.config import getPubConfig
91 from lp.archivepublisher.interfaces.publisherconfig import IPublisherConfigSet
92-from lp.archivepublisher.publishing import GLOBAL_PUBLISHER_LOCK
93+from lp.archivepublisher.publishing import (
94+ cannot_modify_suite,
95+ GLOBAL_PUBLISHER_LOCK,
96+ )
97 from lp.archivepublisher.scripts.processaccepted import ProcessAccepted
98 from lp.archivepublisher.scripts.publishdistro import PublishDistro
99 from lp.registry.interfaces.distribution import IDistributionSet
100@@ -600,6 +603,8 @@
101 for series in distribution.getNonObsoleteSeries():
102 for pocket in PackagePublishingPocket.items:
103 suite = series.getSuite(pocket)
104+ if cannot_modify_suite(archive, series, pocket):
105+ continue
106 updated = False
107 for arch in series.enabled_architectures:
108 if self.updateContentsFile(
109
110=== modified file 'lib/lp/archivepublisher/scripts/publishdistro.py'
111--- lib/lp/archivepublisher/scripts/publishdistro.py 2015-08-25 16:10:09 +0000
112+++ lib/lp/archivepublisher/scripts/publishdistro.py 2015-09-23 13:33:45 +0000
113@@ -13,6 +13,7 @@
114
115 from lp.app.errors import NotFoundError
116 from lp.archivepublisher.publishing import (
117+ cannot_modify_suite,
118 getPublisher,
119 GLOBAL_PUBLISHER_LOCK,
120 )
121@@ -295,8 +296,8 @@
122 for suite in self.options.dirty_suites:
123 distroseries, pocket = self.findSuite(
124 distribution, suite)
125- if not publisher.cannotModifySuite(
126- distroseries, pocket):
127+ if not cannot_modify_suite(
128+ archive, distroseries, pocket):
129 publisher.markPocketDirty(distroseries, pocket)
130 self.publishArchive(archive, publisher)
131 work_done = True
132
133=== modified file 'lib/lp/archivepublisher/tests/test_generate_contents_files.py'
134--- lib/lp/archivepublisher/tests/test_generate_contents_files.py 2015-03-18 17:51:16 +0000
135+++ lib/lp/archivepublisher/tests/test_generate_contents_files.py 2015-09-23 13:33:45 +0000
136@@ -18,6 +18,7 @@
137 )
138 from lp.archivepublisher.scripts.publish_ftpmaster import PublishFTPMaster
139 from lp.registry.interfaces.pocket import PackagePublishingPocket
140+from lp.registry.interfaces.series import SeriesStatus
141 from lp.services.log.logger import DevNullLogger
142 from lp.services.osutils import write_file
143 from lp.services.scripts.base import LaunchpadScriptFailure
144@@ -190,21 +191,36 @@
145 # pockets that have packages to publish.
146 distro = self.makeDistro()
147 distroseries = self.factory.makeDistroSeries(distribution=distro)
148- package = self.factory.makeSuiteSourcePackage(distroseries)
149+ suite = distroseries.getSuite(PackagePublishingPocket.BACKPORTS)
150 script = self.makeScript(distro)
151- os.makedirs(os.path.join(script.config.distsroot, package.suite))
152- self.assertEqual([package.suite], list(script.getSuites()))
153+ os.makedirs(os.path.join(script.config.distsroot, suite))
154+ self.assertEqual([suite], list(script.getSuites()))
155
156 def test_getSuites_includes_release_pocket(self):
157 # getSuites also includes the release pocket, which is named
158 # after the distroseries without a suffix.
159 distro = self.makeDistro()
160- distroseries = self.factory.makeDistroSeries(distribution=distro)
161- package = self.factory.makeSuiteSourcePackage(
162- distroseries, pocket=PackagePublishingPocket.RELEASE)
163- script = self.makeScript(distro)
164- os.makedirs(os.path.join(script.config.distsroot, package.suite))
165- self.assertEqual([package.suite], list(script.getSuites()))
166+ distroseries = self.factory.makeDistroSeries(
167+ distribution=distro, status=SeriesStatus.DEVELOPMENT)
168+ script = self.makeScript(distro)
169+ suite = distroseries.getSuite(PackagePublishingPocket.RELEASE)
170+ os.makedirs(os.path.join(script.config.distsroot, suite))
171+ self.assertEqual([suite], list(script.getSuites()))
172+
173+ def test_getSuites_excludes_immutable_suites(self):
174+ # getSuites excludes suites that we would refuse to publish.
175+ distro = self.makeDistro()
176+ distroseries = self.factory.makeDistroSeries(
177+ distribution=distro, status=SeriesStatus.CURRENT)
178+ script = self.makeScript(distro)
179+ pockets = [
180+ PackagePublishingPocket.RELEASE,
181+ PackagePublishingPocket.UPDATES,
182+ ]
183+ suites = [distroseries.getSuite(pocket) for pocket in pockets]
184+ for suite in suites:
185+ os.makedirs(os.path.join(script.config.distsroot, suite))
186+ self.assertEqual([suites[1]], list(script.getSuites()))
187
188 def test_writeAptContentsConf_writes_header(self):
189 # writeAptContentsConf writes apt-contents.conf. At a minimum
190
191=== modified file 'lib/lp/archivepublisher/tests/test_publish_ftpmaster.py'
192--- lib/lp/archivepublisher/tests/test_publish_ftpmaster.py 2015-03-20 14:02:46 +0000
193+++ lib/lp/archivepublisher/tests/test_publish_ftpmaster.py 2015-09-23 13:33:45 +0000
194@@ -927,7 +927,8 @@
195 self.factory.makeArchive(
196 distribution=distro, owner=distro.owner,
197 purpose=ArchivePurpose.PARTNER)
198- distroseries = self.factory.makeDistroSeries(distribution=distro)
199+ distroseries = self.factory.makeDistroSeries(
200+ distribution=distro, status=SeriesStatus.DEVELOPMENT)
201 das = self.factory.makeDistroArchSeries(distroseries=distroseries)
202 script = self.makeScript(distro)
203 script.setUp()
204@@ -940,6 +941,25 @@
205 self.assertEqual(
206 expected_args, script.updateContentsFile.extract_args())
207
208+ def test_updateContentsFiles_skips_immutable_suites(self):
209+ # updateContentsFiles does not generate Contents files for immutable
210+ # suites.
211+ distro = self.makeDistroWithPublishDirectory()
212+ distroseries = self.factory.makeDistroSeries(
213+ distribution=distro, status=SeriesStatus.CURRENT)
214+ das = self.factory.makeDistroArchSeries(distroseries=distroseries)
215+ script = self.makeScript(distro)
216+ script.setUp()
217+ script.setUpDirs()
218+ script.updateContentsFile = FakeMethod()
219+ script.updateContentsFiles(distro)
220+ expected_args = [
221+ (distro.main_archive, distro, distroseries.getSuite(pocket), das)
222+ for pocket in PackagePublishingPocket.items
223+ if pocket != PackagePublishingPocket.RELEASE]
224+ self.assertEqual(
225+ expected_args, script.updateContentsFile.extract_args())
226+
227 def test_publish_always_returns_true_for_primary(self):
228 script = self.makeScript()
229 script.publishDistroUploads = FakeMethod()