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