summaryrefslogtreecommitdiffstats
path: root/debputy/plugins/gnome.py
diff options
context:
space:
mode:
Diffstat (limited to 'debputy/plugins/gnome.py')
-rw-r--r--debputy/plugins/gnome.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/debputy/plugins/gnome.py b/debputy/plugins/gnome.py
new file mode 100644
index 0000000..6ea56eb
--- /dev/null
+++ b/debputy/plugins/gnome.py
@@ -0,0 +1,71 @@
+import re
+from typing import Any
+
+from debputy.plugin.api import (
+ DebputyPluginInitializer,
+ BinaryCtrlAccessor,
+ PackageProcessingContext,
+)
+from debputy.util import _error
+
+GNOME_VERSION1_RE = re.compile(r"^(\d+:)?(\d+)\.(\d+)\.[\d.]+.*$")
+GNOME_VERSION2_RE = re.compile(
+ r"^(\d+:)?(\d+)(?:\.[\d.]+|~(alpha|beta|rc)[\d.]*|[+~])?.*$"
+)
+
+
+def initialize(api: DebputyPluginInitializer) -> None:
+ api.metadata_or_maintscript_detector(
+ "gnome-versions",
+ gnome_versions,
+ # Probably not necessary, but this is the most faithful conversion
+ package_type=["deb", "udeb"],
+ )
+ # Looking for "clean_la_files"? The `debputy` plugin provides a replacement
+ # feature.
+
+
+def gnome_versions(
+ _unused: Any,
+ ctrl: BinaryCtrlAccessor,
+ context: PackageProcessingContext,
+) -> None:
+ # Conversion note: In debhelper, $dh{VERSION} is actually the "source" version
+ # (though sometimes it has a binNMU version too). In `debputy`, we have access
+ # to the "true" binary version (dpkg-gencontrol -v<VERSION>). In 99% of all cases,
+ # the difference is irrelevant as people rarely use dpkg-gencontrol -v<VERSION>.
+ version = context.binary_package_version
+ m = GNOME_VERSION1_RE.match(version)
+ epoch = ""
+ gnome_version = ""
+ gnome_next_version = ""
+ if m:
+ major_version = int(m.group(2))
+ if major_version < 40:
+ epoch = m.group(1)
+ minor_version = int(m.group(3))
+ gnome_version = f"{major_version}.{minor_version}"
+ if major_version == 3 and minor_version == 38:
+ prefix = ""
+ else:
+ prefix = f"{major_version}."
+ gnome_next_version = f"{prefix}{minor_version + 2}"
+ if gnome_version == "":
+ m = GNOME_VERSION2_RE.match(version)
+ if not m:
+ _error(
+ f"Unable to determine the GNOME major version from {version} for package"
+ f" {context.binary_package.name}. If this is not a GNOME package or it does"
+ f" not follow the GNOME version standard, please disable the GNOME plugin"
+ f" (debputy-plugin-gnome)."
+ )
+ epoch = m.group(1)
+ version = int(m.group(2))
+ gnome_version = f"{version}~"
+ gnome_next_version = f"{version + 1}~"
+ if epoch is None:
+ epoch = ""
+ ctrl.substvars["gnome:Version"] = f"{epoch}{gnome_version}"
+ ctrl.substvars["gnome:UpstreamVersion"] = f"{gnome_version}"
+ ctrl.substvars["gnome:NextVersion"] = f"{epoch}{gnome_next_version}"
+ ctrl.substvars["gnome:NextUpstreamVersion"] = f"{gnome_next_version}"