diff --git a/0007-split-features-into-subpackages.patch b/0007-split-features-into-subpackages.patch index 519b6ac..ac08472 100644 --- a/0007-split-features-into-subpackages.patch +++ b/0007-split-features-into-subpackages.patch @@ -1,4 +1,4 @@ -From 5471c1916a5e947ba1b21343b70abd6d4aaf97de Mon Sep 17 00:00:00 2001 +From 2cac5e5ad5ff5472923ce333bef59679612bbaa2 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Fri, 26 Oct 2018 11:20:13 +0200 Subject: [PATCH 07/10] split features into subpackages @@ -7,12 +7,13 @@ References: https://discussion.fedoraproject.org/t/rfc-new-crates-packaging-desi Signed-off-by: Igor Gnatenko --- data/cargo.attr | 4 +- - data/macros.cargo | 10 ++ + data/macros.cargo | 10 + rust2rpm/__main__.py | 11 +- rust2rpm/inspector.py | 22 ++- - rust2rpm/metadata.py | 315 +++++++++++++++++------------------ - rust2rpm/templates/main.spec | 142 ++++++++-------- - 6 files changed, 260 insertions(+), 244 deletions(-) + rust2rpm/metadata.py | 317 ++++++++++++++++---------------- + rust2rpm/templates/main.spec | 142 +++++++------- + test.py | 347 ++++------------------------------- + 7 files changed, 298 insertions(+), 555 deletions(-) diff --git a/data/cargo.attr b/data/cargo.attr index 392a72b..4910b5c 100644 @@ -143,10 +144,10 @@ index 2d488b2..9e79e88 100644 if __name__ == "__main__": main() diff --git a/rust2rpm/metadata.py b/rust2rpm/metadata.py -index 5adeb65..119dea5 100644 +index 5adeb65..4929cdd 100644 --- a/rust2rpm/metadata.py +++ b/rust2rpm/metadata.py -@@ -1,208 +1,205 @@ +@@ -1,208 +1,207 @@ __all__ = ["Dependency", "Metadata"] -import itertools @@ -260,8 +261,8 @@ index 5adeb65..119dea5 100644 - spec = semver.Spec(s.replace(" ", "")) - parsed = [] + def _normalize_req(req): -+ if "*" in req: -+ return NotImplemented ++ if "*" in req and req != "*": ++ raise NotImplementedError(f"'*' is not supported: {req}") + spec = semver.Spec(req.replace(" ", "")) + reqs = [] for req in spec.specs: @@ -271,8 +272,10 @@ index 5adeb65..119dea5 100644 + # Any means any continue + ver = req.spec -+ if ver.prerelease or req.kind in (req.KIND_NEQ, req.KIND_EMPTY): -+ return NotImplemented ++ 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)) - if req.kind in (req.KIND_CARET, req.KIND_TILDE): - if ver.prerelease: @@ -697,6 +700,365 @@ index 7dbcc3f..0d9a80b 100644 -{% endif %} %changelog {% include target ~ "-changelog.spec.inc" %} +diff --git a/test.py b/test.py +index b856fdd..30263b4 100644 +--- a/test.py ++++ b/test.py +@@ -1,318 +1,43 @@ +-import os +-import shutil +-import subprocess +-import sys +-import tempfile +-import textwrap +- + import pytest + + import rust2rpm + +-DUMMY_LIB = """ +-pub fn say_hello() { +- println!("Hello, World!"); +-} +-""" +-DEPGEN = os.path.join(os.path.dirname(__file__), "cargodeps.py") +- +- +-@pytest.mark.parametrize("req, features, rpmdep", [ +- ("=1.0.0", [], +- "crate(test) = 1.0.0"), +- ("=1.0.0", ["feature"], +- "(crate(test) = 1.0.0 with crate(test/feature))"), +- (">=1.0.0,<2.0.0", [], ++@pytest.mark.parametrize("req, rpmdep", [ ++ ("^1.2.3", ++ "(crate(test) >= 1.2.3 with crate(test) < 2.0.0)"), ++ ("^1.2", ++ "(crate(test) >= 1.2.0 with crate(test) < 2.0.0)"), ++ ("^1", + "(crate(test) >= 1.0.0 with crate(test) < 2.0.0)"), +- (">=1.0.0,<2.0.0", ["feature"], +- "((crate(test) >= 1.0.0 with crate(test) < 2.0.0) with crate(test/feature))"), ++ ("^0.2.3", ++ "(crate(test) >= 0.2.3 with crate(test) < 0.3.0)"), ++ ("^0.2", ++ "(crate(test) >= 0.2.0 with crate(test) < 0.3.0)"), ++ ("^0.0.3", ++ "(crate(test) >= 0.0.3 with crate(test) < 0.0.4)"), ++ ("^0.0", ++ "(crate(test) >= 0.0.0 with crate(test) < 0.1.0)"), ++ ("^0", ++ "(crate(test) >= 0.0.0 with crate(test) < 1.0.0)"), ++ ("~1.2.3", ++ "(crate(test) >= 1.2.3 with crate(test) < 1.3.0)"), ++ ("~1.2", ++ "(crate(test) >= 1.2.0 with crate(test) < 1.3.0)"), ++ ("~1", ++ "(crate(test) >= 1.0.0 with crate(test) < 2.0.0)"), ++ ("*", ++ "crate(test)"), ++ (">= 1.2.0", ++ "crate(test) >= 1.2.0"), ++ ("> 1", ++ "crate(test) > 1.0.0"), ++ ("< 2", ++ "crate(test) < 2.0.0"), ++ ("= 1.2.3", ++ "crate(test) = 1.2.3"), ++ (">= 1.2, < 1.5", ++ "(crate(test) >= 1.2.0 with crate(test) < 1.5.0)"), + ]) +-def test_dependency(req, features, rpmdep): +- dep = rust2rpm.Dependency("test", req, features) ++def test_dependency(req, rpmdep): ++ dep = rust2rpm.Dependency("test", req) + assert str(dep) == rpmdep +- +-@pytest.fixture +-def cargo_toml(request): +- def make_cargo_toml(contents): +- toml = os.path.join(tmpdir, "Cargo.toml") +- with open(toml, "w") as fobj: +- fobj.write(textwrap.dedent(contents)) +- return toml +- +- tmpdir = tempfile.mkdtemp(prefix="cargo-deps-") +- srcdir = os.path.join(tmpdir, "src") +- os.mkdir(srcdir) +- with open(os.path.join(srcdir, "lib.rs"), "w") as fobj: +- fobj.write(DUMMY_LIB) +- +- def finalize(): +- shutil.rmtree(tmpdir) +- request.addfinalizer(finalize) +- +- return make_cargo_toml +- +-@pytest.mark.parametrize("toml, provides, requires", [ +- +- # Basic provides +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- """, +- ["crate(hello) = 0.0.0"], +- []), +- +- # Basic provides for feature +- (""" +- [package] +- name = "hello" +- version = "1.2.3" +- +- [features] +- color = [] +- """, +- ["crate(hello) = 1.2.3", +- "crate(hello/color) = 1.2.3"], +- []), +- +- # Provides for optional dependencies +- (""" +- [package] +- name = "hello" +- version = "1.2.3" +- +- [dependencies] +- non_optional = "1" +- serde = { version = "1", optional = true } +- rand = { version = "0.4", optional = true } +- +- [features] +- std = [] +- v1 = ["rand"] +- """, +- ["crate(hello) = 1.2.3", +- "crate(hello/rand) = 1.2.3", +- "crate(hello/serde) = 1.2.3", +- "crate(hello/std) = 1.2.3", +- "crate(hello/v1) = 1.2.3"], +- ["(crate(non_optional) >= 1.0.0 with crate(non_optional) < 2.0.0)", +- "(crate(rand) >= 0.4.0 with crate(rand) < 0.5.0)", +- "(crate(serde) >= 1.0.0 with crate(serde) < 2.0.0)"]), +- +- # Caret requirements +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "^0" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 0.0.0 with crate(libc) < 1.0.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "^0.0" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 0.0.0 with crate(libc) < 0.1.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "^0.0.3" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 0.0.3 with crate(libc) < 0.0.4)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "^0.2.3" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 0.2.3 with crate(libc) < 0.3.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "^1" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.0.0 with crate(libc) < 2.0.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "^1.2" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.2.0 with crate(libc) < 2.0.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "^1.2.3" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.2.3 with crate(libc) < 2.0.0)"]), +- +- # Tilde requirements +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "~1" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.0.0 with crate(libc) < 2.0.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "~1.2" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.2.0 with crate(libc) < 1.3.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "~1.2.3" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.2.3 with crate(libc) < 1.3.0)"]), +- +- # Wildcard requirements +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "*" +- """, +- ["crate(hello) = 0.0.0"], +- ["crate(libc)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "1.*" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.0.0 with crate(libc) < 2.0.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "1.2.*" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.2.0 with crate(libc) < 1.3.0)"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "1.*.*" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.0.0 with crate(libc) < 2.0.0)"]), +- +- # Inequality requirements +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = ">= 1.2.0" +- """, +- ["crate(hello) = 0.0.0"], +- ["crate(libc) >= 1.2.0"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "> 1" +- """, +- ["crate(hello) = 0.0.0"], +- ["crate(libc) > 1.0.0"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "< 2" +- """, +- ["crate(hello) = 0.0.0"], +- ["crate(libc) < 2.0.0"]), +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = "= 1.2.3" +- """, +- ["crate(hello) = 0.0.0"], +- ["crate(libc) = 1.2.3"]), +- +- # Multiple requirements +- (""" +- [package] +- name = "hello" +- version = "0.0.0" +- +- [dependencies] +- libc = ">= 1.2, < 1.5" +- """, +- ["crate(hello) = 0.0.0"], +- ["(crate(libc) >= 1.2.0 with crate(libc) < 1.5.0)"]), +- +- # Pre-release requirements +- (""" +- [package] +- name = "hello" +- version = "0.0.0-alpha" +- +- [dependencies] +- foo-bar = "1.2.3-beta" +- """, +- ["crate(hello) = 0.0.0~alpha"], +- ["(crate(foo-bar) >= 1.2.3~beta with crate(foo-bar) < 1.2.3)"]), +- +-]) +-def test_depgen(toml, provides, requires, cargo_toml): +- md = rust2rpm.Metadata.from_file(cargo_toml(toml)) +- assert [str(x) for x in md.provides] == provides +- assert [str(x) for x in md.requires] == requires -- 2.19.1 diff --git a/0008-add-support-for-dependencies-with-same-name.patch b/0008-add-support-for-dependencies-with-same-name.patch index 1932281..d63d0c4 100644 --- a/0008-add-support-for-dependencies-with-same-name.patch +++ b/0008-add-support-for-dependencies-with-same-name.patch @@ -1,4 +1,4 @@ -From 8905032db2b0198c6426011807f3b75fc91c38b5 Mon Sep 17 00:00:00 2001 +From a1d3a84645aa7bbe5ca07b60bead1ddf90a21cc1 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Tue, 30 Oct 2018 20:37:38 +0100 Subject: [PATCH 08/10] add support for dependencies with same name @@ -11,7 +11,7 @@ Signed-off-by: Igor Gnatenko 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/rust2rpm/metadata.py b/rust2rpm/metadata.py -index 119dea5..febf1e5 100644 +index 4929cdd..328b67a 100644 --- a/rust2rpm/metadata.py +++ b/rust2rpm/metadata.py @@ -1,5 +1,6 @@ @@ -21,7 +21,7 @@ index 119dea5..febf1e5 100644 import copy import json import subprocess -@@ -124,9 +125,11 @@ class Metadata: +@@ -126,9 +127,11 @@ class Metadata: self.description = md.get("description") # dependencies + build-dependencies → runtime @@ -36,7 +36,7 @@ index 119dea5..febf1e5 100644 deps_by_feature = {} for feature, f_deps in md["features"].items(): -@@ -137,18 +140,23 @@ class Metadata: +@@ -139,18 +142,23 @@ class Metadata: features.add(dep) else: pkg, _, f = dep.partition("/") diff --git a/0009-add-support-for-feeding-user-configuration.patch b/0009-add-support-for-feeding-user-configuration.patch index d811dac..233c11c 100644 --- a/0009-add-support-for-feeding-user-configuration.patch +++ b/0009-add-support-for-feeding-user-configuration.patch @@ -1,4 +1,4 @@ -From 9ef415cbd5e204849793a16fa1b8a9ed40c0be73 Mon Sep 17 00:00:00 2001 +From 197150ee2e862edcd46f7ab02c9e4d17e49ca75d Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Wed, 31 Oct 2018 18:03:21 +0100 Subject: [PATCH 09/10] add support for feeding user configuration diff --git a/0010-trivial-use-f-strings-everywhere.patch b/0010-trivial-use-f-strings-everywhere.patch index dd42d58..32bae14 100644 --- a/0010-trivial-use-f-strings-everywhere.patch +++ b/0010-trivial-use-f-strings-everywhere.patch @@ -1,4 +1,4 @@ -From be0464ab8a235b4c3b49e711140c2de2f0dcf6d8 Mon Sep 17 00:00:00 2001 +From 83ea3796cd28ec7689b39e7dc7a70bd11af1abf1 Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Wed, 31 Oct 2018 17:00:58 +0100 Subject: [PATCH 10/10] trivial: use f-strings everywhere diff --git a/rust-packaging.spec b/rust-packaging.spec index f80f490..98fa000 100644 --- a/rust-packaging.spec +++ b/rust-packaging.spec @@ -1,12 +1,11 @@ -# Tests need fixing after patches -%bcond_with check +%bcond_without check %{?python_enable_dependency_generator} # https://pagure.io/koji/issue/659 %global debug_package %{nil} Name: rust-packaging Version: 6 -Release: 16%{?dist} +Release: 17%{?dist} Summary: RPM macros for building Rust packages on various architectures License: MIT @@ -83,6 +82,9 @@ py.test-%{python3_version} -vv test.py %{python3_sitelib}/rust2rpm/ %changelog +* Sat Nov 03 2018 Igor Gnatenko - 6-17 +- Update patchset + * Sat Nov 03 2018 Igor Gnatenko - 6-16 - Make package archful