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/0014-Add-support-for-prerel...

86 lines
3.4 KiB

From 29a3c1b84e0971fc0c2edf483ae3b04139c19b32 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>
---
rust2rpm/metadata.py | 18 ++++++++++++------
test.py | 8 ++++++++
2 files changed, 20 insertions(+), 6 deletions(-)
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/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