diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..677b60d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/err-derive-0.2.1.crate diff --git a/0001-Move-to-proc-macro-error-v0.3.4.patch b/0001-Move-to-proc-macro-error-v0.3.4.patch new file mode 100644 index 0000000..cd6a538 --- /dev/null +++ b/0001-Move-to-proc-macro-error-v0.3.4.patch @@ -0,0 +1,241 @@ +diff -up err-derive-0.2.1/build.rs.orig err-derive-0.2.1/build.rs +--- err-derive-0.2.1/build.rs.orig 2019-10-09 12:21:01.000000000 +0200 ++++ err-derive-0.2.1/build.rs 2019-12-06 22:41:25.114969835 +0100 +@@ -1,22 +1,7 @@ +-use rustc_version::version; +- +-fn version_ge(minor_min: u64) -> bool { +- let version = version().unwrap(); +- +- version.major == 1 && version.minor >= minor_min +-} ++#[rustversion::before(1.32)] ++compile_error!("`err-derive` depends on `skeptic`, which requires rustc >= 1.32"); + + fn main() { +- if !version_ge(32) { +- panic!("`err-derive` depends on `quote 1.0`, which requires rustc >= 1.32"); +- } +- generate_doc_tests() +-} +- +-#[cfg(feature = "skeptic")] +-fn generate_doc_tests() { ++ #[cfg(feature = "skeptic")] + skeptic::generate_doc_tests(&["README.md"]); + } +- +-#[cfg(not(feature = "skeptic"))] +-fn generate_doc_tests() { } +diff -up err-derive-0.2.1/Cargo.toml.orig err-derive-0.2.1/Cargo.toml +--- err-derive-0.2.1/Cargo.toml.orig 2019-12-06 22:41:25.113969837 +0100 ++++ err-derive-0.2.1/Cargo.toml 2019-12-06 22:42:14.978892161 +0100 +@@ -40,8 +40,8 @@ version = "1.0.5" + version = "0.12.0" + [dev-dependencies.skeptic] + version = "0.13" +-[build-dependencies.rustc_version] +-version = "0.2.3" ++[build-dependencies.rustversion] ++version = "1.0" + + [build-dependencies.skeptic] + version = "0.13" +diff -up err-derive-0.2.1/src/lib.rs.orig err-derive-0.2.1/src/lib.rs +--- err-derive-0.2.1/src/lib.rs.orig 2019-10-09 13:08:03.000000000 +0200 ++++ err-derive-0.2.1/src/lib.rs 2019-12-06 22:41:25.115969834 +0100 +@@ -132,21 +132,13 @@ use syn::spanned::Spanned; + + extern crate proc_macro_error; + +-use proc_macro_error::{filter_macro_errors, span_error}; ++use proc_macro_error::{abort, proc_macro_error}; + use syn::Attribute; + + decl_derive!([Error, attributes(error, source, cause)] => error_derive); + ++#[proc_macro_error(allow_not_macro, assert_unwind_safe)] + fn error_derive(s: synstructure::Structure) -> TokenStream { +- // proc_macro_error requires all `quote!` call to be inside the `filter_macro_errors!` macro, +- // by using an inner method we satisfy this requirement while still getting proper syntax +- // highlighting +- filter_macro_errors! { +- error_derive_inner(s).into() +- } +-} +- +-fn error_derive_inner(s: synstructure::Structure) -> TokenStream2 { + let source_body = s.each_variant(|v| { + if let Some(source) = v.bindings().iter().find(|binding| { + has_attr(&binding.ast().attrs, "source") || has_attr(&binding.ast().attrs, "cause") +@@ -205,11 +197,7 @@ fn error_derive_inner(s: synstructure::S + + let from = from_body(&s); + +- quote! { +- #error +- #display +- #from +- } ++ quote!(#error #display #from).into() + } + + fn display_body(s: &synstructure::Structure) -> quote::__rt::TokenStream { +@@ -217,10 +205,10 @@ fn display_body(s: &synstructure::Struct + let span = v.ast().ident.span(); + let msg = match find_error_msg(&v.ast().attrs) { + Some(msg) => msg, +- None => span_error!(span, "Variant is missing display attribute."), ++ None => abort!(span, "Variant is missing display attribute."), + }; + if msg.nested.is_empty() { +- span_error!(span, "Expected at least one argument to error attribute"); ++ abort!(span, "Expected at least one argument to error attribute"); + } + + let format_string = match msg.nested[0] { +@@ -232,7 +220,7 @@ fn display_body(s: &synstructure::Struct + { + nv.lit.clone() + } +- _ => span_error!( ++ _ => abort!( + msg.nested.span(), + "Error attribute must begin `display = \"\"` to control the Display message." + ), +@@ -241,14 +229,14 @@ fn display_body(s: &synstructure::Struct + syn::NestedMeta::Lit(syn::Lit::Int(ref i)) => { + let bi = &v.bindings()[i + .base10_parse::() +- .unwrap_or_else(|_| span_error!(i.span(), "integer literal overflows usize"))]; ++ .unwrap_or_else(|_| abort!(i.span(), "integer literal overflows usize"))]; + quote!(#bi) + } + syn::NestedMeta::Meta(syn::Meta::Path(ref path)) => { + let id = match path.get_ident() { + Some(id) => id, + // Allows std::u8::MAX (for example) +- None => return quote!(#arg) ++ None => return quote!(#arg), + }; + let id_s = id.to_string(); + if id_s.starts_with('_') { +@@ -256,7 +244,7 @@ fn display_body(s: &synstructure::Struct + let bi = match v.bindings().get(idx) { + Some(bi) => bi, + None => { +- span_error!( ++ abort!( + id.span(), + "display attempted to access field `{}` in `{}::{}` which \ + does not exist (there {} {} field{})", +@@ -279,10 +267,10 @@ fn display_body(s: &synstructure::Struct + } + // Arg is not a field - might be in global scope + return quote!(#id); +- }, ++ } + // Allows u8::max_value() (for example) + syn::NestedMeta::Meta(syn::Meta::List(ref list)) => return quote!(#list), +- _ => span_error!(msg.nested.span(), "Invalid argument to error attribute!"), ++ _ => abort!(msg.nested.span(), "Invalid argument to error attribute!"), + }); + + quote! { +@@ -302,11 +290,11 @@ fn find_error_msg(attrs: &[syn::Attribut + { + let span = attr.span(); + if error_msg.is_some() { +- span_error!(span, "Cannot have two display attributes") ++ abort!(span, "Cannot have two display attributes") + } else if let syn::Meta::List(list) = meta { + error_msg = Some(list); + } else { +- span_error!(span, "error attribute must take a list in parentheses") ++ abort!(span, "error attribute must take a list in parentheses") + } + } + } +@@ -324,7 +312,7 @@ fn has_attr(attributes: &[Attribute], at + .map_or(false, |ident| ident == attr_name) + { + if found_attr { +- span_error!(attr.span(), "Cannot have two `{}` attributes", attr_name); ++ abort!(attr.span(), "Cannot have two `{}` attributes", attr_name); + } + found_attr = true; + } +@@ -341,7 +329,7 @@ fn has_attr(attributes: &[Attribute], at + ident.to_string().split(", ").any(|part| part == attr_name) + }) { + if found_attr { +- span_error!( ++ abort!( + path.span(), + "Cannot have two `{}` attributes", + attr_name +@@ -371,7 +359,7 @@ fn from_body(s: &synstructure::Structure + let exclude = has_attr(&binding.ast().attrs, "no_from"); + + if is_source && is_cause { +- span_error!( ++ abort!( + span, + "#[error(cause)] is deprecated, use #[error(source)] instead" + ) +@@ -387,7 +375,7 @@ fn from_body(s: &synstructure::Structure + }) { + if v.bindings().len() > 1 { + if is_explicit { +- span_error!( ++ abort!( + span, + "Variants containing `from` can only contain a single field" + ); +@@ -402,15 +390,18 @@ fn from_body(s: &synstructure::Structure + .iter() + .any(|existing_from_type| *existing_from_type == from_ident) + { +- span_error!( +- from_ident.span(), +- "`from` can only be applied for a type once{}", +- if is_explicit { +- "" +- } else { +- ", hint: use #[error(no_from)] to disable automatic From derive" +- } +- ); ++ if is_explicit { ++ abort!( ++ from_ident.span(), ++ "`from` can only be applied for a type once" ++ ); ++ } else { ++ abort!( ++ from_ident.span(), ++ "`from` can only be applied for a type once"; ++ hint = "use #[error(no_from)] to disable automatic From derive" ++ ); ++ } + } + + from_types.push(from_ident); +diff -up err-derive-0.2.1/tests/tests.rs.orig err-derive-0.2.1/tests/tests.rs +--- err-derive-0.2.1/tests/tests.rs.orig 2019-10-08 21:38:59.000000000 +0200 ++++ err-derive-0.2.1/tests/tests.rs 2019-12-06 22:41:25.115969834 +0100 +@@ -125,7 +125,7 @@ pub enum TestsNonFieldDisplayValues { + #[error(display = "{}", u8::max_value())] + D, + #[error(display = "{}", std::u8::MAX)] +- E ++ E, + } + + impl TestsNonFieldDisplayValues { +@@ -156,4 +156,4 @@ fn non_field_display() { + + let s = format!("{}", TestsNonFieldDisplayValues::E); + assert_eq!(&s, "255"); +-} +\ No newline at end of file ++} diff --git a/err-derive-fix-metadata.diff b/err-derive-fix-metadata.diff new file mode 100644 index 0000000..2a75e81 --- /dev/null +++ b/err-derive-fix-metadata.diff @@ -0,0 +1,11 @@ +--- err-derive-0.2.1/Cargo.toml 1970-01-01T00:00:00+00:00 ++++ err-derive-0.2.1/Cargo.toml 2019-12-06T21:22:49.380718+00:00 +@@ -25,7 +25,7 @@ + [lib] + proc-macro = true + [dependencies.proc-macro-error] +-version = "0.2.6" ++version = "0.4" + + [dependencies.proc-macro2] + version = "1.0.1" diff --git a/rust-err-derive.spec b/rust-err-derive.spec new file mode 100644 index 0000000..8b325de --- /dev/null +++ b/rust-err-derive.spec @@ -0,0 +1,104 @@ +# Generated by rust2rpm 12 +%bcond_without check +%global debug_package %{nil} + +%global crate err-derive + +Name: rust-%{crate} +Version: 0.2.1 +Release: 1%{?dist} +Summary: Derive macro for `std::error::Error` + +# Upstream license specification: MIT/Apache-2.0 +License: MIT or ASL 2.0 +URL: https://crates.io/crates/err-derive +Source: %{crates_source} +# Initial patched metadata +# - Bump proc-macro-error to 0.4 +Patch0: err-derive-fix-metadata.diff +# https://gitlab.com/torkleyy/err-derive/commit/d78cdb827e42b64fc8a820633048ae733ad857de +Patch1: 0001-Move-to-proc-macro-error-v0.3.4.patch + +ExclusiveArch: %{rust_arches} +%if %{__cargo_skip_build} +BuildArch: noarch +%endif + +BuildRequires: rust-packaging + +%global _description %{expand: +Derive macro for `std::error::Error`.} + +%description %{_description} + +%package devel +Summary: %{summary} +BuildArch: noarch + +%description devel %{_description} + +This package contains library source intended for building other packages +which use "%{crate}" crate. + +%files devel +%license LICENSE LICENSE-APACHE LICENSE-MIT +%doc README.md +%{cargo_registry}/%{crate}-%{version_no_tilde}/ + +%package -n %{name}+default-devel +Summary: %{summary} +BuildArch: noarch + +%description -n %{name}+default-devel %{_description} + +This package contains library source intended for building other packages +which use "default" feature of "%{crate}" crate. + +%files -n %{name}+default-devel +%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml + +%package -n %{name}+skeptic-devel +Summary: %{summary} +BuildArch: noarch + +%description -n %{name}+skeptic-devel %{_description} + +This package contains library source intended for building other packages +which use "skeptic" feature of "%{crate}" crate. + +%files -n %{name}+skeptic-devel +%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml + +%package -n %{name}+std-devel +Summary: %{summary} +BuildArch: noarch + +%description -n %{name}+std-devel %{_description} + +This package contains library source intended for building other packages +which use "std" feature of "%{crate}" crate. + +%files -n %{name}+std-devel +%ghost %{cargo_registry}/%{crate}-%{version_no_tilde}/Cargo.toml + +%prep +%autosetup -n %{crate}-%{version_no_tilde} -p1 +%cargo_prep + +%generate_buildrequires +%cargo_generate_buildrequires + +%build +%cargo_build + +%install +%cargo_install + +%if %{with check} +%check +%cargo_test +%endif + +%changelog +* Fri Dec 06 22:22:49 CET 2019 Robert-André Mauchin - 0.2.1-1 +- Initial package diff --git a/sources b/sources new file mode 100644 index 0000000..7f0b313 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (err-derive-0.2.1.crate) = d5aa26b8088272612b78057b89535cf9f032c22e25c86c65cdf872dd57c0f4ca5dbcaf7ea72319833d4487b634160e2d9ffa266cc09d4e00e67f82f68457affd diff --git a/tests/.fmf/version b/tests/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/tests/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/tests/provision.fmf b/tests/provision.fmf new file mode 100644 index 0000000..503a97c --- /dev/null +++ b/tests/provision.fmf @@ -0,0 +1,5 @@ +--- +standard-inventory-qcow2: + qemu: + # `cargo test` usually eats more than 1G. + m: 4G diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..695b7d9 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,13 @@ +--- +- hosts: localhost + roles: + - role: standard-test-basic + tags: + - classic + repositories: + - repo: "https://src.fedoraproject.org/tests/rust.git" + dest: rust + tests: + - rust/cargo-test + environment: + pkg: rust-err-derive