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
diff --git a/lib/lp/archivepublisher/publishing.py b/lib/lp/archivepublisher/publishing.py
index bddf01e..84982cc 100644
--- a/lib/lp/archivepublisher/publishing.py
+++ b/lib/lp/archivepublisher/publishing.py
@@ -1183,12 +1183,30 @@ class Publisher:
1183 "Oops, tainting RELEASE pocket of %s." % distroseries1183 "Oops, tainting RELEASE pocket of %s." % distroseries
1184 )1184 )
11851185
1186 def _getMetadataOverrides(self, key):
1187 """Helper method to get overriden metadata value if it exists.
1188
1189 :return: The overridden value if it exists, otherwise None.
1190 """
1191 try:
1192 if (
1193 self.archive.metadata_overrides
1194 and key in self.archive.metadata_overrides
1195 ):
1196 return self.archive.metadata_overrides[key]
1197 return None
1198 except AttributeError:
1199 return None
1200
1186 def _getLabel(self):1201 def _getLabel(self):
1187 """Return the contents of the Release file Label field.1202 """Return the contents of the Release file Label field.
11881203
1189 :return: a text that should be used as the value of the Release file1204 :return: a text that should be used as the value of the Release file
1190 'Label' field.1205 'Label' field.
1191 """1206 """
1207 override = self._getMetadataOverrides("Label")
1208 if override:
1209 return override
1192 if self.archive.is_ppa:1210 if self.archive.is_ppa:
1193 return self.archive.displayname1211 return self.archive.displayname
1194 elif self.archive.purpose == ArchivePurpose.PARTNER:1212 elif self.archive.purpose == ArchivePurpose.PARTNER:
@@ -1208,12 +1226,26 @@ class Publisher:
1208 """1226 """
1209 # XXX al-maisan, 2008-11-19, bug=299981. If this file is released1227 # XXX al-maisan, 2008-11-19, bug=299981. If this file is released
1210 # from a copy archive then modify the origin to indicate so.1228 # from a copy archive then modify the origin to indicate so.
1229 override = self._getMetadataOverrides("Origin")
1230 if override:
1231 return override
1211 if self.archive.purpose == ArchivePurpose.PARTNER:1232 if self.archive.purpose == ArchivePurpose.PARTNER:
1212 return "Canonical"1233 return "Canonical"
1213 if not self.archive.is_ppa:1234 if not self.archive.is_ppa:
1214 return self.distro.displayname1235 return self.distro.displayname
1215 return "LP-PPA-%s" % get_ppa_reference(self.archive)1236 return "LP-PPA-%s" % get_ppa_reference(self.archive)
12161237
1238 def _getSuite(self, distroseries, pocket):
1239 """Return the suite name for a distroseries and pocket."""
1240 override = self._getMetadataOverrides("Suite")
1241 if override:
1242 # TODO: or we can do the series formatting here if it's not
1243 # needed anywhere else, since we have access to the codename?
1244 # e.g.: override.format(series=distroseries.codename)
1245 return override
1246
1247 return distroseries.getSuite(pocket)
1248
1217 def _getCurrentFiles(self, suite, release_file_name, extra_files):1249 def _getCurrentFiles(self, suite, release_file_name, extra_files):
1218 # Gather information on entries in the current Release file.1250 # Gather information on entries in the current Release file.
1219 release_path = os.path.join(1251 release_path = os.path.join(
@@ -1417,7 +1449,7 @@ class Publisher:
1417 def _writeSuite(self, distroseries, pocket):1449 def _writeSuite(self, distroseries, pocket):
1418 """Write out the Release files for the provided suite."""1450 """Write out the Release files for the provided suite."""
1419 # XXX: kiko 2006-08-24: Untested method.1451 # XXX: kiko 2006-08-24: Untested method.
1420 suite = distroseries.getSuite(pocket)1452 suite = self._getSuite(distroseries, pocket)
1421 suite_dir = os.path.join(self._config.distsroot, suite)1453 suite_dir = os.path.join(self._config.distsroot, suite)
1422 all_components = [1454 all_components = [
1423 comp.name1455 comp.name
@@ -1495,6 +1527,7 @@ class Publisher:
1495 else:1527 else:
1496 drsummary += pocket.name.capitalize()1528 drsummary += pocket.name.capitalize()
14971529
1530 # TODO: check if metadata overrides exist
1498 self.log.debug("Writing Release file for %s" % suite)1531 self.log.debug("Writing Release file for %s" % suite)
1499 release_file = Release()1532 release_file = Release()
1500 release_file["Origin"] = self._getOrigin()1533 release_file["Origin"] = self._getOrigin()
diff --git a/lib/lp/soyuz/interfaces/archive.py b/lib/lp/soyuz/interfaces/archive.py
index e1521ce..0f17ae8 100644
--- a/lib/lp/soyuz/interfaces/archive.py
+++ b/lib/lp/soyuz/interfaces/archive.py
@@ -84,6 +84,7 @@ from zope.schema import (
84 Bool,84 Bool,
85 Choice,85 Choice,
86 Datetime,86 Datetime,
87 Dict,
87 Int,88 Int,
88 List,89 List,
89 Object,90 Object,
@@ -2664,6 +2665,21 @@ class IArchiveEdit(Interface):
2664 :param names: A list of token names.2665 :param names: A list of token names.
2665 """2666 """
26662667
2668 @operation_parameters(
2669 metadata_overrides=Dict(
2670 title=_("Metadata overrides"),
2671 key_type=TextLine(),
2672 value_type=TextLine(),
2673 )
2674 )
2675 @export_write_operation()
2676 @operation_for_version("devel")
2677 def updateMetadataOverrides(metadata_overrides):
2678 """Edit the metadata overrides for this archive.
2679
2680 :param metadata_overrides: A dictionary of metadata overrides.
2681 """
2682
26672683
2668class IArchiveDelete(Interface):2684class IArchiveDelete(Interface):
2669 """Archive interface for operations restricted by delete privilege."""2685 """Archive interface for operations restricted by delete privilege."""
diff --git a/lib/lp/soyuz/model/archive.py b/lib/lp/soyuz/model/archive.py
index b86c2e9..516a2eb 100644
--- a/lib/lp/soyuz/model/archive.py
+++ b/lib/lp/soyuz/model/archive.py
@@ -2731,6 +2731,39 @@ class Archive(StormBase):
2731 token_set = getUtility(IArchiveAuthTokenSet)2731 token_set = getUtility(IArchiveAuthTokenSet)
2732 token_set.deactivateNamedTokensForArchive(self, names)2732 token_set.deactivateNamedTokensForArchive(self, names)
27332733
2734 def _validateAndPatchMetadataOverrides(self, new_metadata_overrides):
2735 allowed_keys = {"Origin", "Label", "Suite"}
2736 if not all(
2737 key in allowed_keys for key in new_metadata_overrides.keys()
2738 ):
2739 raise ValueError(
2740 "Invalid metadata override key. Allowed keys are "
2741 f"{allowed_keys}."
2742 )
2743
2744 for key, value in new_metadata_overrides.items():
2745 if not isinstance(value, str) or not value:
2746 raise ValueError(
2747 f"Value for '{key}' must be a non-empty string."
2748 )
2749
2750 # TODO: this is where i could handle series formating
2751 # e.g.: value = value.replace("{series}", actual_series)
2752
2753 updated_metadata_overrides = (
2754 self.metadata_overrides.copy() if self.metadata_overrides else {}
2755 )
2756 updated_metadata_overrides.update(new_metadata_overrides)
2757
2758 return updated_metadata_overrides
2759
2760 def updateMetadataOverrides(self, metadata_overrides):
2761 """See `IArchive`."""
2762 updated_metadata_overrides = self.validateAndPatchMetadataOverrides(
2763 metadata_overrides
2764 )
2765 self.metadata_overrides = updated_metadata_overrides
2766
2734 def newSubscription(2767 def newSubscription(
2735 self, subscriber, registrant, date_expires=None, description=None2768 self, subscriber, registrant, date_expires=None, description=None
2736 ):2769 ):

Subscribers

People subscribed via source and target branches

to status/vote changes: