From 00c0c5cec90d5d6abbfd4acb2f5d65439b4bfd27 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Sat, 26 Jan 2019 08:33:37 +0100 Subject: [PATCH 16/18] Add support for prerelease versions Signed-off-by: Igor Gnatenko --- 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