Merge ~ruinedyourlife/launchpad:feat-publishing-archive-metadata-overrides into launchpad:master

Proposed by Quentin Debhi
Status: Work in progress
Proposed branch: ~ruinedyourlife/launchpad:feat-publishing-archive-metadata-overrides
Merge into: launchpad:master
Prerequisite: ~ruinedyourlife/launchpad:feat-archive-metadata-overrides
Diff against target: 177 lines (+130/-7)
2 files modified
lib/lp/archivepublisher/publishing.py (+24/-6)
lib/lp/archivepublisher/tests/test_publisher.py (+106/-1)
Reviewer Review Type Date Requested Status
Launchpad code reviewers Pending
Review via email: mp+463914@code.launchpad.net

Commit message

Apply metadata overrides in archive publishing

Utilize `metadata_overrides` for Origin, Label, and Suite during archive publishing.

To post a comment you must log in.
ac7f1b9... by Quentin Debhi

wip: metadata overrides publisher test

c8513d6... by Quentin Debhi

feat: no overrides for primary archive

9ec0859... by Quentin Debhi

wip: primary archive test

Unmerged commits

9ec0859... by Quentin Debhi

wip: primary archive test

Succeeded
[SUCCEEDED] docs:0 (build)
[SUCCEEDED] lint:0 (build)
[SUCCEEDED] mypy:0 (build)
13 of 3 results
c8513d6... by Quentin Debhi

feat: no overrides for primary archive

ac7f1b9... by Quentin Debhi

wip: metadata overrides publisher test

Succeeded
[SUCCEEDED] docs:0 (build)
[SUCCEEDED] lint:0 (build)
[SUCCEEDED] mypy:0 (build)
13 of 3 results
3a41b6f... by Quentin Debhi

feat: publishing archive with metadata overrides

Succeeded
[SUCCEEDED] docs:0 (build)
[SUCCEEDED] lint:0 (build)
[SUCCEEDED] mypy:0 (build)
13 of 3 results

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/archivepublisher/publishing.py b/lib/lp/archivepublisher/publishing.py
2index bddf01e..723e7a1 100644
3--- a/lib/lp/archivepublisher/publishing.py
4+++ b/lib/lp/archivepublisher/publishing.py
5@@ -1496,10 +1496,21 @@ class Publisher:
6 drsummary += pocket.name.capitalize()
7
8 self.log.debug("Writing Release file for %s" % suite)
9+ metadata_overrides = (
10+ {}
11+ if self.archive.purpose == ArchivePurpose.PRIMARY
12+ else (self.archive.metadata_overrides or {})
13+ )
14 release_file = Release()
15- release_file["Origin"] = self._getOrigin()
16- release_file["Label"] = self._getLabel()
17- release_file["Suite"] = suite
18+ release_file["Origin"] = metadata_overrides.get(
19+ "Origin", self._getOrigin()
20+ )
21+ release_file["Label"] = metadata_overrides.get(
22+ "Label", self._getLabel()
23+ )
24+ release_file["Suite"] = metadata_overrides.get("Suite", suite).replace(
25+ "{series}", distroseries.name
26+ )
27 release_file["Version"] = distroseries.version
28 release_file["Codename"] = distroseries.name
29 release_file["Date"] = datetime.utcnow().strftime(
30@@ -1592,12 +1603,19 @@ class Publisher:
31 all_series_files.add(path)
32 all_series_files.add(os.path.join(component, arch_path, "Release"))
33
34+ metadata_overrides = self.archive.metadata_overrides or {}
35 release_file = Release()
36- release_file["Archive"] = suite
37+ release_file["Archive"] = metadata_overrides.get(
38+ "Suite", suite
39+ ).replace("{series}", distroseries.name)
40 release_file["Version"] = distroseries.version
41 release_file["Component"] = component
42- release_file["Origin"] = self._getOrigin()
43- release_file["Label"] = self._getLabel()
44+ release_file["Origin"] = metadata_overrides.get(
45+ "Origin", self._getOrigin()
46+ )
47+ release_file["Label"] = metadata_overrides.get(
48+ "Label", self._getLabel()
49+ )
50 release_file["Architecture"] = arch_name
51
52 release_path = os.path.join(suite_dir, component, arch_path, "Release")
53diff --git a/lib/lp/archivepublisher/tests/test_publisher.py b/lib/lp/archivepublisher/tests/test_publisher.py
54index e72b7c9..6690ae8 100644
55--- a/lib/lp/archivepublisher/tests/test_publisher.py
56+++ b/lib/lp/archivepublisher/tests/test_publisher.py
57@@ -90,7 +90,7 @@ from lp.soyuz.enums import (
58 from lp.soyuz.interfaces.archive import IArchiveSet
59 from lp.soyuz.interfaces.archivefile import IArchiveFileSet
60 from lp.soyuz.tests.test_publishing import TestNativePublishingBase
61-from lp.testing import TestCaseWithFactory
62+from lp.testing import TestCaseWithFactory, login_celebrity, login_person
63 from lp.testing.fakemethod import FakeMethod
64 from lp.testing.gpgkeys import gpgkeysdir
65 from lp.testing.keyserver import InProcessKeyServerFixture
66@@ -2692,6 +2692,111 @@ class TestPublisher(TestPublisherBase):
67 )
68 self.assertTrue(file_exists(source_release))
69
70+ def testReleaseFilePPAArchiveMetadataOverridesApplied(self):
71+ cprov = getUtility(IPersonSet).getByName("cprov")
72+ cprov.archive.displayname = "PPA for Celso Provid\xe8lo"
73+ login_person(cprov)
74+ cprov.archive.setMetadataOverrides(
75+ {
76+ "Origin": "test_origin",
77+ "Label": "test_label",
78+ "Suite": "test_suite",
79+ "Snapshots": "test_snapshots",
80+ }
81+ )
82+ archive_publisher = getPublisher(cprov.archive, [], self.logger)
83+
84+ self.getPubSource(filecontent=b"Hello world", archive=cprov.archive)
85+ archive_publisher.A_publish(False)
86+ self.layer.txn.commit()
87+ archive_publisher.C_writeIndexes(False)
88+ archive_publisher.D_writeReleaseFiles(False)
89+
90+ release = self.parseRelease(
91+ os.path.join(
92+ archive_publisher._config.distsroot,
93+ "breezy-autotest",
94+ "Release",
95+ )
96+ )
97+
98+ self.assertEqual("test_origin", release["origin"])
99+ self.assertEqual("test_label", release["label"])
100+ self.assertEqual("test_suite", release["suite"])
101+
102+ arch_sources_path = os.path.join(
103+ archive_publisher._config.distsroot,
104+ "breezy-autotest",
105+ "main",
106+ "source",
107+ "Sources.gz",
108+ )
109+ with gzip.open(arch_sources_path, "rb") as arch_sources_file:
110+ self.assertReleaseContentsMatch(
111+ release, "main/source/Sources", arch_sources_file.read()
112+ )
113+
114+ arch_release_path = os.path.join(
115+ archive_publisher._config.distsroot,
116+ "breezy-autotest",
117+ "main",
118+ "source",
119+ "Release",
120+ )
121+ with open(arch_release_path, "rb") as arch_release_file:
122+ self.assertReleaseContentsMatch(
123+ release, "main/source/Release", arch_release_file.read()
124+ )
125+
126+ arch_release = self.parseRelease(arch_release_path)
127+ self.assertEqual("test_origin", arch_release["origin"])
128+
129+ def testReleaseFilePrimaryArchiveMetadataOverridesNotApplied(self):
130+ publisher = Publisher(
131+ self.logger,
132+ self.config,
133+ self.disk_pool,
134+ self.ubuntutest.main_archive,
135+ )
136+ login_celebrity("admin")
137+ self.ubuntutest.main_archive.setMetadataOverrides(
138+ {
139+ "Origin": "test_origin",
140+ "Label": "test_label",
141+ "Suite": "test_suite",
142+ "Snapshots": "test_snapshots",
143+ }
144+ )
145+
146+ self.getPubSource(filecontent=b"Hello world")
147+
148+ publisher.A_publish(False)
149+ publisher.C_doFTPArchive(False)
150+
151+ self.assertIn("breezy-autotest", publisher.release_files_needed)
152+
153+ release = self.parseRelease(
154+ os.path.join(self.config.distsroot, "breezy-autotest", "Release")
155+ )
156+
157+ self.assertEqual("ubuntutest", release["origin"])
158+ self.assertEqual("ubuntutest", release["label"])
159+
160+ arch_release_path = os.path.join(
161+ self.config.distsroot,
162+ "breezy-autotest",
163+ "main",
164+ "source",
165+ "Release",
166+ )
167+ with open(arch_release_path, "rb") as arch_release_file:
168+ self.assertReleaseContentsMatch(
169+ release, "main/source/Release", arch_release_file.read()
170+ )
171+
172+ arch_release = self.parseRelease(arch_release_path)
173+ self.assertEqual("ubuntutest", arch_release["origin"])
174+
175 def testCreateSeriesAliasesNoAlias(self):
176 """createSeriesAliases has nothing to do by default."""
177 publisher = Publisher(

Subscribers

People subscribed via source and target branches

to status/vote changes: