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

Proposed by Colin Watson
Status: Merged
Merged at revision: 17409
Proposed branch: lp:~cjwatson/launchpad/contents-fixes
Merge into: lp:launchpad
Diff against target: 114 lines (+67/-11)
2 files modified
lib/lp/archivepublisher/scripts/publish_ftpmaster.py (+19/-9)
lib/lp/archivepublisher/tests/test_publish_ftpmaster.py (+48/-2)
To merge this branch: bzr merge lp:~cjwatson/launchpad/contents-fixes
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+253655@code.launchpad.net

Commit message

Fix a couple of bugs in updating Contents files.

Description of the change

Fix a couple of bugs in updating Contents files:

Only update Contents files for the primary archive, to match the behaviour of GenerateContentsFiles.

Only force suites to be updated if we actually update their Contents files, not merely if we check for updates.

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 2015-03-18 17:51:16 +0000
3+++ lib/lp/archivepublisher/scripts/publish_ftpmaster.py 2015-03-20 11:42:01 +0000
4@@ -560,7 +560,10 @@
5 distribution, archive, updated_suites=updated_suites)
6
7 def updateContentsFile(self, archive, distribution, suite, arch):
8- """Update a single Contents file if necessary."""
9+ """Update a single Contents file if necessary.
10+
11+ :return: True if a file was updated, otherwise False.
12+ """
13 config = self.configs[distribution][archive.purpose]
14 backup_dists = get_backup_dists(config)
15 content_dists = os.path.join(
16@@ -576,18 +579,25 @@
17 "Installing new Contents file for %s/%s.", suite,
18 arch.architecturetag)
19 shutil.copy2(new_contents, current_contents)
20+ return True
21+ return False
22
23 def updateContentsFiles(self, distribution):
24 """Pick up updated Contents files if necessary."""
25 updated_suites = []
26- for archive in get_publishable_archives(distribution):
27- for series in distribution.getNonObsoleteSeries():
28- for pocket in PackagePublishingPocket.items:
29- suite = series.getSuite(pocket)
30- for arch in series.enabled_architectures:
31- self.updateContentsFile(
32- archive, distribution, suite, arch)
33- updated_suites.append((archive, suite))
34+ # XXX cjwatson 2015-03-20: GenerateContentsFiles currently only
35+ # supports the primary archive.
36+ archive = distribution.main_archive
37+ for series in distribution.getNonObsoleteSeries():
38+ for pocket in PackagePublishingPocket.items:
39+ suite = series.getSuite(pocket)
40+ updated = False
41+ for arch in series.enabled_architectures:
42+ if self.updateContentsFile(
43+ archive, distribution, suite, arch):
44+ updated = True
45+ if updated:
46+ updated_suites.append((archive, suite))
47 return updated_suites
48
49 def publish(self, distribution, security_only=False):
50
51=== modified file 'lib/lp/archivepublisher/tests/test_publish_ftpmaster.py'
52--- lib/lp/archivepublisher/tests/test_publish_ftpmaster.py 2015-03-18 17:51:16 +0000
53+++ lib/lp/archivepublisher/tests/test_publish_ftpmaster.py 2015-03-20 11:42:01 +0000
54@@ -862,12 +862,58 @@
55 os.makedirs(content_suite)
56 write_marker_file(
57 [content_suite, "%s-staged.gz" % contents_filename], "Contents")
58- script.updateContentsFile(
59- distro.main_archive, distro, distroseries.name, das)
60+ self.assertTrue(script.updateContentsFile(
61+ distro.main_archive, distro, distroseries.name, das))
62 self.assertEqual(
63 "Contents",
64 read_marker_file([backup_suite, "%s.gz" % contents_filename]))
65
66+ def test_updateContentsFiles_updated_suites(self):
67+ # updateContentsFiles returns a list of suites for which it updated
68+ # Contents files.
69+ distro = self.makeDistroWithPublishDirectory()
70+ distroseries = self.factory.makeDistroSeries(distribution=distro)
71+ das = self.factory.makeDistroArchSeries(distroseries=distroseries)
72+ script = self.makeScript(distro)
73+ script.setUp()
74+ script.setUpDirs()
75+ archive_config = getPubConfig(distro.main_archive)
76+ contents_filename = "Contents-%s" % das.architecturetag
77+ backup_suite = os.path.join(
78+ archive_config.archiveroot + "-distscopy", "dists",
79+ distroseries.name)
80+ os.makedirs(backup_suite)
81+ content_suite = os.path.join(
82+ archive_config.distroroot, "contents-generation", distro.name,
83+ "dists", distroseries.name)
84+ os.makedirs(content_suite)
85+ write_marker_file(
86+ [content_suite, "%s-staged.gz" % contents_filename], "Contents")
87+ self.assertEqual(
88+ [(distro.main_archive, distroseries.name)],
89+ script.updateContentsFiles(distro))
90+
91+ def test_updateContentsFiles_only_primary_archive(self):
92+ # updateContentsFiles only considers the primary archive. (This
93+ # will need to change if GenerateContentsFiles ever gains support
94+ # for other archive purposes.)
95+ distro = self.makeDistroWithPublishDirectory()
96+ self.factory.makeArchive(
97+ distribution=distro, owner=distro.owner,
98+ purpose=ArchivePurpose.PARTNER)
99+ distroseries = self.factory.makeDistroSeries(distribution=distro)
100+ das = self.factory.makeDistroArchSeries(distroseries=distroseries)
101+ script = self.makeScript(distro)
102+ script.setUp()
103+ script.setUpDirs()
104+ script.updateContentsFile = FakeMethod()
105+ script.updateContentsFiles(distro)
106+ expected_args = [
107+ (distro.main_archive, distro, distroseries.getSuite(pocket), das)
108+ for pocket in PackagePublishingPocket.items]
109+ self.assertEqual(
110+ expected_args, script.updateContentsFile.extract_args())
111+
112 def test_publish_always_returns_true_for_primary(self):
113 script = self.makeScript()
114 script.publishDistroUploads = FakeMethod()