You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rust-packaging/0016-Add-support-for-prerel...

161 lines
5.8 KiB

From 00c0c5cec90d5d6abbfd4acb2f5d65439b4bfd27 Mon Sep 17 00:00:00 2001
From: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
Date: Sat, 26 Jan 2019 08:33:37 +0100
Subject: [PATCH 16/18] Add support for prerelease versions
Signed-off-by: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
---
data/macros.rust-srpm | 38 ++++++++++++++++++++++++++++++++++++
rust2rpm/metadata.py | 18 +++++++++++------
rust2rpm/templates/main.spec | 10 +++-------
test.py | 8 ++++++++
4 files changed, 61 insertions(+), 13 deletions(-)
diff --git a/data/macros.rust-srpm b/data/macros.rust-srpm
index f2bae9d..872b87f 100644
--- a/data/macros.rust-srpm
+++ b/data/macros.rust-srpm
@@ -1 +1,39 @@
%rust_arches x86_64 i686 armv7hl aarch64 ppc64 ppc64le s390x
+%version_no_tilde() %{lua:
+ local sep = rpm.expand('%1')
+ local ver = rpm.expand('%2')
+\
+ if sep == '%1' then
+ sep = '-'
+ end
+\
+ if ver == '%2' then
+ ver = rpm.expand('%version')
+ end
+ ver = ver:gsub('~', sep)
+\
+ print(ver)
+}
+%__crates_url https://crates.io/api/v1/crates/
+%crates_source() %{lua:
+ local crate = rpm.expand('%1')
+ local version = rpm.expand('%2')
+ local url = rpm.expand('%__crates_url')
+\
+ if crate == '%1' then
+ crate = rpm.expand('%real_crate')
+ end
+ if crate == '%real_crate' then
+ crate = rpm.expand('%crate')
+ end
+ if crate == '%crate' then
+ crate = rpm.expand('%name')
+ end
+\
+ if version == '%2' then
+ version = rpm.expand('%version')
+ end
+ version = version:gsub('~', '-')
+\
+ print(url .. crate .. '/' .. version .. '/download#/' .. crate .. '-' .. version .. '.crate')
+}
diff --git a/rust2rpm/metadata.py b/rust2rpm/metadata.py
index 328b67a..f0718d5 100644
--- a/rust2rpm/metadata.py
+++ b/rust2rpm/metadata.py
@@ -45,11 +45,13 @@ class Dependency:
# Any means any
continue
ver = req.spec
- if ver.prerelease:
- raise NotImplementedError(f"Pre-release requirement is not supported: {ver}")
if req.kind in (req.KIND_NEQ, req.KIND_EMPTY):
raise NotImplementedError(f"'!=' and empty kinds are not supported: {req}")
- coerced = semver.Version.coerce(str(ver))
+ coerced = str(semver.Version.coerce(str(ver)))
+ if ver.prerelease:
+ coerced = coerced.replace("-", "~")
+ # This will advance us to closest stable version (2.0.0-beta.6 → 2.0.0)
+ ver = ver.next_patch()
if req.kind == req.KIND_EQUAL:
req.kind = req.KIND_SHORTEQ
if req.kind in (req.KIND_CARET, req.KIND_COMPATIBLE):
@@ -107,7 +109,11 @@ class Dependency:
class Metadata:
def __init__(self, name, version):
self.name = name
- self.version = version
+ self._version = version
+ version_normalized = Dependency._normalize_req(f"={self._version}")
+ if len(version_normalized) != 1:
+ raise Exception(f"Incorrect version: {self._version}")
+ self.version = version_normalized[0][1]
self.license = None
self.license_file = None
self.readme = None
@@ -187,7 +193,7 @@ class Metadata:
def provides(self, feature=None):
if feature not in self.dependencies:
raise KeyError(f"Feature {feature!r} doesn't exist")
- return Dependency(self.name, f"={self.version}", features={feature})
+ return Dependency(self.name, f"={self._version}", features={feature})
@classmethod
def _resolve(cls, deps_by_feature, feature):
@@ -207,7 +213,7 @@ class Metadata:
return self._resolve(self.dependencies, feature)[1]
else:
features, deps = self.dependencies[feature]
- fdeps = set(Dependency(self.name, f"={self.version}", features={feature})
+ fdeps = set(Dependency(self.name, f"={self._version}", features={feature})
for feature in features)
return fdeps | deps
diff --git a/rust2rpm/templates/main.spec b/rust2rpm/templates/main.spec
index 84bd97d..1ebef7b 100644
--- a/rust2rpm/templates/main.spec
+++ b/rust2rpm/templates/main.spec
@@ -31,11 +31,7 @@ License: {{ license|default("# FIXME") }}
{{ license_comments }}
{% endif %}
URL: https://crates.io/crates/{{ crate }}
-{% if md.name != crate %}
-Source0: https://crates.io/api/v1/crates/%{real_crate}/%{version}/download#/%{crate}-%{version}.crate
-{% else %}
-Source0: https://crates.io/api/v1/crates/%{crate}/%{version}/download#/%{crate}-%{version}.crate
-{% endif %}
+Source: %{crates_source}
{% if patch_file is not none %}
{% if target == "opensuse" %}
# PATCH-FIX-OPENSUSE {{ patch_file }} -- Initial patched metadata
@@ -161,9 +157,9 @@ which use {% if feature is not none %}"{{ feature }}" feature of {% endif %}"%{c
%prep
{% if md.name != crate %}
-%autosetup -n %{real_crate}-%{version} -p1
+%autosetup -n %{real_crate}-%{version_no_tilde} -p1
{% else %}
-%autosetup -n %{crate}-%{version} -p1
+%autosetup -n %{crate}-%{version_no_tilde} -p1
{% endif %}
%cargo_prep
diff --git a/test.py b/test.py
index 30263b4..035df79 100644
--- a/test.py
+++ b/test.py
@@ -37,6 +37,14 @@ import rust2rpm
"crate(test) = 1.2.3"),
(">= 1.2, < 1.5",
"(crate(test) >= 1.2.0 with crate(test) < 1.5.0)"),
+ ("^2.0.0-alpha.6",
+ "(crate(test) >= 2.0.0~alpha.6 with crate(test) < 3.0.0)"),
+ ("^0.1.0-alpha.6",
+ "(crate(test) >= 0.1.0~alpha.6 with crate(test) < 0.2.0)"),
+ ("^0.0.1-alpha.6",
+ "(crate(test) >= 0.0.1~alpha.6 with crate(test) < 0.0.2)"),
+ ("^0.0.0-alpha.6",
+ "(crate(test) >= 0.0.0~alpha.6 with crate(test) < 0.0.1)"),
])
def test_dependency(req, rpmdep):
dep = rust2rpm.Dependency("test", req)
--
2.21.0