From 1103bb62ccef73d948a5a422ad3659be8eb0c7a1 Mon Sep 17 00:00:00 2001 From: Toru Ogawa Date: Tue, 16 Oct 2018 19:05:51 +0900 Subject: [PATCH 1/8] atleast_version -> min_version, max_version --- src/lib.rs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 88dd310..108c17b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -71,6 +71,7 @@ use std::error; use std::ffi::{OsStr, OsString}; use std::fmt; use std::io; +use std::ops::Bound; use std::path::{PathBuf, Path}; use std::process::{Command, Output}; use std::str; @@ -84,10 +85,11 @@ pub fn target_supported() -> bool { (host == target || env::var_os("PKG_CONFIG_ALLOW_CROSS").is_some()) } -#[derive(Clone, Default)] +#[derive(Clone)] pub struct Config { statik: Option, - atleast_version: Option, + min_version: Bound, + max_version: Bound, extra_args: Vec, cargo_metadata: bool, env_metadata: bool, @@ -264,7 +266,8 @@ impl Config { pub fn new() -> Config { Config { statik: None, - atleast_version: None, + min_version: Bound::Unbounded, + max_version: Bound::Unbounded, extra_args: vec![], print_system_libs: true, cargo_metadata: true, @@ -283,7 +286,8 @@ impl Config { /// Indicate that the library must be at least version `vers`. pub fn atleast_version(&mut self, vers: &str) -> &mut Config { - self.atleast_version = Some(vers.to_string()); + self.min_version = Bound::Included(vers.to_string()); + self.max_version = Bound::Unbounded; self } @@ -408,7 +412,7 @@ impl Config { if self.print_system_libs { cmd.env("PKG_CONFIG_ALLOW_SYSTEM_LIBS", "1"); } - if let Some(ref version) = self.atleast_version { + if let Bound::Included(ref version) = self.min_version { cmd.arg(&format!("{} >= {}", name, version)); } else { cmd.arg(name); @@ -438,6 +442,22 @@ impl Config { } } + +// Implement Default manualy since Bound does not implement Default. +impl Default for Config { + fn default() -> Config { + Config { + statik: None, + min_version: Bound::Unbounded, + max_version: Bound::Unbounded, + extra_args: vec![], + print_system_libs: false, + cargo_metadata: false, + env_metadata: false, + } + } +} + impl Library { fn new() -> Library { Library { From 54b3283a27b24b4d760a92b9c8d096b256eb26c5 Mon Sep 17 00:00:00 2001 From: Toru Ogawa Date: Tue, 16 Oct 2018 19:20:43 +0900 Subject: [PATCH 2/8] add tests for atleast_version --- tests/test.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/test.rs b/tests/test.rs index fad0fcf..49f9dad 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -116,3 +116,18 @@ fn version() { reset(); assert_eq!(&find("foo").unwrap().version[..], "3.10.0.SVN"); } + +#[test] +fn atleast_version_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().atleast_version("3.10").probe("foo").unwrap(); +} + +#[test] +#[should_panic] +fn atleast_version_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().atleast_version("3.11").probe("foo").unwrap(); +} From d40116af37bba88fda9ee6a05c87708075ea6b2d Mon Sep 17 00:00:00 2001 From: Toru Ogawa Date: Tue, 16 Oct 2018 19:21:19 +0900 Subject: [PATCH 3/8] reflect conditions to cmd --- src/lib.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 108c17b..e24f1da 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -412,10 +412,24 @@ impl Config { if self.print_system_libs { cmd.env("PKG_CONFIG_ALLOW_SYSTEM_LIBS", "1"); } - if let Bound::Included(ref version) = self.min_version { - cmd.arg(&format!("{} >= {}", name, version)); - } else { - cmd.arg(name); + cmd.arg(name); + match self.min_version { + Bound::Included(ref version) => { + cmd.arg(&format!("{} >= {}", name, version)); + } + Bound::Excluded(ref version) => { + cmd.arg(&format!("{} > {}", name, version)); + } + _ => (), + } + match self.max_version { + Bound::Included(ref version) => { + cmd.arg(&format!("{} <= {}", name, version)); + } + Bound::Excluded(ref version) => { + cmd.arg(&format!("{} < {}", name, version)); + } + _ => (), } cmd } From b19cbf0adeb28a8cba3d21953525ef6e0fbb10cd Mon Sep 17 00:00:00 2001 From: Toru Ogawa Date: Tue, 16 Oct 2018 19:25:45 +0900 Subject: [PATCH 4/8] add eq_version --- src/lib.rs | 7 +++++++ tests/test.rs | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index e24f1da..9a44d3f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -291,6 +291,13 @@ impl Config { self } + /// Indicate that the library must be equal to version `vers`. + pub fn eq_version(&mut self, vers: &str) -> &mut Config { + self.min_version = Bound::Included(vers.to_string()); + self.max_version = Bound::Included(vers.to_string()); + self + } + /// Add an argument to pass to pkg-config. /// /// It's placed after all of the arguments generated by this library. diff --git a/tests/test.rs b/tests/test.rs index 49f9dad..a7215b8 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -131,3 +131,18 @@ fn atleast_version_ng() { reset(); pkg_config::Config::new().atleast_version("3.11").probe("foo").unwrap(); } + +#[test] +fn eq_version_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().eq_version("3.10.0.SVN").probe("foo").unwrap(); +} + +#[test] +#[should_panic] +fn eq_version_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().eq_version("3.10.0").probe("foo").unwrap(); +} From 9651f74cb1ca46e08d7be1b55c07111eaa5c413e Mon Sep 17 00:00:00 2001 From: Toru Ogawa Date: Tue, 16 Oct 2018 19:38:29 +0900 Subject: [PATCH 5/8] add range support --- src/lib.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 9a44d3f..ebe4983 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -71,7 +71,7 @@ use std::error; use std::ffi::{OsStr, OsString}; use std::fmt; use std::io; -use std::ops::Bound; +use std::ops::{Bound, RangeBounds}; use std::path::{PathBuf, Path}; use std::process::{Command, Output}; use std::str; @@ -298,6 +298,24 @@ impl Config { self } + /// Indicate that the library's version must be in `range`. + pub fn range_version<'a, R>(&mut self, range: R) -> &mut Config + where + R: RangeBounds<&'a str> + { + self.min_version = match range.start_bound() { + Bound::Included(vers) => Bound::Included(vers.to_string()), + Bound::Excluded(vers) => Bound::Excluded(vers.to_string()), + Bound::Unbounded => Bound::Unbounded, + }; + self.max_version = match range.end_bound() { + Bound::Included(vers) => Bound::Included(vers.to_string()), + Bound::Excluded(vers) => Bound::Excluded(vers.to_string()), + Bound::Unbounded => Bound::Unbounded, + }; + self + } + /// Add an argument to pass to pkg-config. /// /// It's placed after all of the arguments generated by this library. From 590088bfa0402a41e36098b35aec2029edd58079 Mon Sep 17 00:00:00 2001 From: Toru Ogawa Date: Tue, 16 Oct 2018 19:38:38 +0900 Subject: [PATCH 6/8] add tests --- tests/test.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tests/test.rs b/tests/test.rs index a7215b8..3afce53 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -146,3 +146,55 @@ fn eq_version_ng() { reset(); pkg_config::Config::new().eq_version("3.10.0").probe("foo").unwrap(); } + +#[test] +fn range_version_range_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version("3.10".."3.12").probe("foo").unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version("3.12".."3.15").probe("foo").unwrap(); +} + +#[test] +fn range_version_range_from_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version("3.10"..).probe("foo").unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_from_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version("3.12"..).probe("foo").unwrap(); +} + +#[test] +fn range_version_range_to_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version(.."3.12").probe("foo").unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_to_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version(.."3.9").probe("foo").unwrap(); +} + +#[test] +fn range_version_full() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version(..).probe("foo").unwrap(); +} From 337c65c0ac3ff1dd5738a66f684a090570af1a72 Mon Sep 17 00:00:00 2001 From: Toru Ogawa Date: Tue, 16 Oct 2018 19:48:46 +0900 Subject: [PATCH 7/8] eq_version -> exactly_version --- src/lib.rs | 2 +- tests/test.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ebe4983..32da0b2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -292,7 +292,7 @@ impl Config { } /// Indicate that the library must be equal to version `vers`. - pub fn eq_version(&mut self, vers: &str) -> &mut Config { + pub fn exactly_version(&mut self, vers: &str) -> &mut Config { self.min_version = Bound::Included(vers.to_string()); self.max_version = Bound::Included(vers.to_string()); self diff --git a/tests/test.rs b/tests/test.rs index 3afce53..d6e01eb 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -133,18 +133,18 @@ fn atleast_version_ng() { } #[test] -fn eq_version_ok() { +fn exactly_version_ok() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().eq_version("3.10.0.SVN").probe("foo").unwrap(); + pkg_config::Config::new().exactly_version("3.10.0.SVN").probe("foo").unwrap(); } #[test] #[should_panic] -fn eq_version_ng() { +fn exactly_version_ng() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().eq_version("3.10.0").probe("foo").unwrap(); + pkg_config::Config::new().exactly_version("3.10.0").probe("foo").unwrap(); } #[test] From c4c4727c59f439afc07dfa622511ec7a19d47ebd Mon Sep 17 00:00:00 2001 From: Toru Ogawa Date: Tue, 16 Oct 2018 20:00:50 +0900 Subject: [PATCH 8/8] update tests --- tests/test.rs | 44 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index d6e01eb..cbdc7f4 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -151,7 +151,7 @@ fn exactly_version_ng() { fn range_version_range_ok() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().range_version("3.10".."3.12").probe("foo").unwrap(); + pkg_config::Config::new().range_version("4.2.0".."4.4.0").probe("escape").unwrap(); } #[test] @@ -159,14 +159,29 @@ fn range_version_range_ok() { fn range_version_range_ng() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().range_version("3.12".."3.15").probe("foo").unwrap(); + pkg_config::Config::new().range_version("4.0.0".."4.2.0").probe("escape").unwrap(); +} + +#[test] +fn range_version_range_inclusive_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version("4.0.0"..="4.2.0").probe("escape").unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_inclusive_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version("3.8.0"..="4.0.0").probe("escape").unwrap(); } #[test] fn range_version_range_from_ok() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().range_version("3.10"..).probe("foo").unwrap(); + pkg_config::Config::new().range_version("4.0.0"..).probe("escape").unwrap(); } #[test] @@ -174,14 +189,14 @@ fn range_version_range_from_ok() { fn range_version_range_from_ng() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().range_version("3.12"..).probe("foo").unwrap(); + pkg_config::Config::new().range_version("4.4.0"..).probe("escape").unwrap(); } #[test] fn range_version_range_to_ok() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().range_version(.."3.12").probe("foo").unwrap(); + pkg_config::Config::new().range_version(.."4.4.0").probe("escape").unwrap(); } #[test] @@ -189,12 +204,27 @@ fn range_version_range_to_ok() { fn range_version_range_to_ng() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().range_version(.."3.9").probe("foo").unwrap(); + pkg_config::Config::new().range_version(.."4.2.0").probe("escape").unwrap(); +} + +#[test] +fn range_version_range_to_inclusive_ok() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version(..="4.2.0").probe("escape").unwrap(); +} + +#[test] +#[should_panic] +fn range_version_range_to_inclusive_ng() { + let _g = LOCK.lock(); + reset(); + pkg_config::Config::new().range_version(..="4.0.0").probe("escape").unwrap(); } #[test] fn range_version_full() { let _g = LOCK.lock(); reset(); - pkg_config::Config::new().range_version(..).probe("foo").unwrap(); + pkg_config::Config::new().range_version(..).probe("escape").unwrap(); }