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

Proposed by Quentin Debhi
Status: Rejected
Rejected by: Quentin Debhi
Proposed branch: ~ruinedyourlife/launchpad:api-archive-metadata-overrides
Merge into: launchpad:master
Diff against target: 157 lines (+83/-1)
3 files modified
lib/lp/archivepublisher/publishing.py (+34/-1)
lib/lp/soyuz/interfaces/archive.py (+16/-0)
lib/lp/soyuz/model/archive.py (+33/-0)
Reviewer Review Type Date Requested Status
Launchpad code reviewers Pending
Review via email: mp+463681@code.launchpad.net

Commit message

Add metadata overrides API support for archives

Implement archive metadata reading and updating, for Origin, Label, and Suite fields

To post a comment you must log in.

Unmerged commits

6e42790... by Quentin Debhi

feat: patch & get metadata

In progress
[WAITING] docs:0 (build)
[WAITING] lint:0 (build)
[WAITING] 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..84982cc 100644
3--- a/lib/lp/archivepublisher/publishing.py
4+++ b/lib/lp/archivepublisher/publishing.py
5@@ -1183,12 +1183,30 @@ class Publisher:
6 "Oops, tainting RELEASE pocket of %s." % distroseries
7 )
8
9+ def _getMetadataOverrides(self, key):
10+ """Helper method to get overriden metadata value if it exists.
11+
12+ :return: The overridden value if it exists, otherwise None.
13+ """
14+ try:
15+ if (
16+ self.archive.metadata_overrides
17+ and key in self.archive.metadata_overrides
18+ ):
19+ return self.archive.metadata_overrides[key]
20+ return None
21+ except AttributeError:
22+ return None
23+
24 def _getLabel(self):
25 """Return the contents of the Release file Label field.
26
27 :return: a text that should be used as the value of the Release file
28 'Label' field.
29 """
30+ override = self._getMetadataOverrides("Label")
31+ if override:
32+ return override
33 if self.archive.is_ppa:
34 return self.archive.displayname
35 elif self.archive.purpose == ArchivePurpose.PARTNER:
36@@ -1208,12 +1226,26 @@ class Publisher:
37 """
38 # XXX al-maisan, 2008-11-19, bug=299981. If this file is released
39 # from a copy archive then modify the origin to indicate so.
40+ override = self._getMetadataOverrides("Origin")
41+ if override:
42+ return override
43 if self.archive.purpose == ArchivePurpose.PARTNER:
44 return "Canonical"
45 if not self.archive.is_ppa:
46 return self.distro.displayname
47 return "LP-PPA-%s" % get_ppa_reference(self.archive)
48
49+ def _getSuite(self, distroseries, pocket):
50+ """Return the suite name for a distroseries and pocket."""
51+ override = self._getMetadataOverrides("Suite")
52+ if override:
53+ # TODO: or we can do the series formatting here if it's not
54+ # needed anywhere else, since we have access to the codename?
55+ # e.g.: override.format(series=distroseries.codename)
56+ return override
57+
58+ return distroseries.getSuite(pocket)
59+
60 def _getCurrentFiles(self, suite, release_file_name, extra_files):
61 # Gather information on entries in the current Release file.
62 release_path = os.path.join(
63@@ -1417,7 +1449,7 @@ class Publisher:
64 def _writeSuite(self, distroseries, pocket):
65 """Write out the Release files for the provided suite."""
66 # XXX: kiko 2006-08-24: Untested method.
67- suite = distroseries.getSuite(pocket)
68+ suite = self._getSuite(distroseries, pocket)
69 suite_dir = os.path.join(self._config.distsroot, suite)
70 all_components = [
71 comp.name
72@@ -1495,6 +1527,7 @@ class Publisher:
73 else:
74 drsummary += pocket.name.capitalize()
75
76+ # TODO: check if metadata overrides exist
77 self.log.debug("Writing Release file for %s" % suite)
78 release_file = Release()
79 release_file["Origin"] = self._getOrigin()
80diff --git a/lib/lp/soyuz/interfaces/archive.py b/lib/lp/soyuz/interfaces/archive.py
81index e1521ce..0f17ae8 100644
82--- a/lib/lp/soyuz/interfaces/archive.py
83+++ b/lib/lp/soyuz/interfaces/archive.py
84@@ -84,6 +84,7 @@ from zope.schema import (
85 Bool,
86 Choice,
87 Datetime,
88+ Dict,
89 Int,
90 List,
91 Object,
92@@ -2664,6 +2665,21 @@ class IArchiveEdit(Interface):
93 :param names: A list of token names.
94 """
95
96+ @operation_parameters(
97+ metadata_overrides=Dict(
98+ title=_("Metadata overrides"),
99+ key_type=TextLine(),
100+ value_type=TextLine(),
101+ )
102+ )
103+ @export_write_operation()
104+ @operation_for_version("devel")
105+ def updateMetadataOverrides(metadata_overrides):
106+ """Edit the metadata overrides for this archive.
107+
108+ :param metadata_overrides: A dictionary of metadata overrides.
109+ """
110+
111
112 class IArchiveDelete(Interface):
113 """Archive interface for operations restricted by delete privilege."""
114diff --git a/lib/lp/soyuz/model/archive.py b/lib/lp/soyuz/model/archive.py
115index b86c2e9..516a2eb 100644
116--- a/lib/lp/soyuz/model/archive.py
117+++ b/lib/lp/soyuz/model/archive.py
118@@ -2731,6 +2731,39 @@ class Archive(StormBase):
119 token_set = getUtility(IArchiveAuthTokenSet)
120 token_set.deactivateNamedTokensForArchive(self, names)
121
122+ def _validateAndPatchMetadataOverrides(self, new_metadata_overrides):
123+ allowed_keys = {"Origin", "Label", "Suite"}
124+ if not all(
125+ key in allowed_keys for key in new_metadata_overrides.keys()
126+ ):
127+ raise ValueError(
128+ "Invalid metadata override key. Allowed keys are "
129+ f"{allowed_keys}."
130+ )
131+
132+ for key, value in new_metadata_overrides.items():
133+ if not isinstance(value, str) or not value:
134+ raise ValueError(
135+ f"Value for '{key}' must be a non-empty string."
136+ )
137+
138+ # TODO: this is where i could handle series formating
139+ # e.g.: value = value.replace("{series}", actual_series)
140+
141+ updated_metadata_overrides = (
142+ self.metadata_overrides.copy() if self.metadata_overrides else {}
143+ )
144+ updated_metadata_overrides.update(new_metadata_overrides)
145+
146+ return updated_metadata_overrides
147+
148+ def updateMetadataOverrides(self, metadata_overrides):
149+ """See `IArchive`."""
150+ updated_metadata_overrides = self.validateAndPatchMetadataOverrides(
151+ metadata_overrides
152+ )
153+ self.metadata_overrides = updated_metadata_overrides
154+
155 def newSubscription(
156 self, subscriber, registrant, date_expires=None, description=None
157 ):

Subscribers

People subscribed via source and target branches

to status/vote changes: