|
|
|
From 769506caf08edb5ea2342d9add22e4db1b347375 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 | 23 +++++++++++++++++++++++
|
|
|
|
rust2rpm/metadata.py | 18 ++++++++++++------
|
|
|
|
rust2rpm/templates/main.spec | 6 +-----
|
|
|
|
test.py | 8 ++++++++
|
|
|
|
4 files changed, 44 insertions(+), 11 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/data/macros.rust-srpm b/data/macros.rust-srpm
|
|
|
|
index f2bae9d..bd21cb5 100644
|
|
|
|
--- a/data/macros.rust-srpm
|
|
|
|
+++ b/data/macros.rust-srpm
|
|
|
|
@@ -1 +1,24 @@
|
|
|
|
%rust_arches x86_64 i686 armv7hl aarch64 ppc64 ppc64le s390x
|
|
|
|
+%__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..f67e023 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
|
|
|
|
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
|
|
|
|
|