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.
161 lines
5.8 KiB
161 lines
5.8 KiB
From cfe4e77674ccb6e25e54a3749f4ef91b377e808f Mon Sep 17 00:00:00 2001
|
|
From: Igor Gnatenko <ignatenkobrain@fedoraproject.org>
|
|
Date: Sat, 26 Jan 2019 08:33:37 +0100
|
|
Subject: [PATCH 14/14] 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.20.1
|
|
|