Merge pull request #365 from rustwasm/fitzgen-lockfile-bindgen-version
Fitzgen lockfile bindgen versionmaster
commit
69982de8cc
@ -0,0 +1,83 @@ |
||||
//! Reading Cargo.lock lock file.
|
||||
|
||||
use std::fs; |
||||
use std::path::{Path, PathBuf}; |
||||
|
||||
use cargo_metadata; |
||||
use console::style; |
||||
use error::Error; |
||||
use toml; |
||||
|
||||
/// This struct represents the contents of `Cargo.lock`.
|
||||
#[derive(Clone, Debug, Deserialize)] |
||||
pub struct Lockfile { |
||||
package: Vec<Package>, |
||||
} |
||||
|
||||
/// This struct represents a single package entry in `Cargo.lock`
|
||||
#[derive(Clone, Debug, Deserialize)] |
||||
struct Package { |
||||
name: String, |
||||
version: String, |
||||
} |
||||
|
||||
impl Lockfile { |
||||
/// Read the `Cargo.lock` file for the crate at the given path.
|
||||
pub fn new(crate_path: &Path) -> Result<Lockfile, Error> { |
||||
let lock_path = get_lockfile_path(crate_path)?; |
||||
let lockfile = fs::read_to_string(lock_path)?; |
||||
toml::from_str(&lockfile).map_err(Error::from) |
||||
} |
||||
|
||||
/// Get the version of `wasm-bindgen` dependency used in the `Cargo.lock`.
|
||||
pub fn wasm_bindgen_version(&self) -> Option<&str> { |
||||
self.get_package_version("wasm-bindgen") |
||||
} |
||||
|
||||
/// Like `wasm_bindgen_version`, except it returns an error instead of
|
||||
/// `None`.
|
||||
pub fn require_wasm_bindgen(&self) -> Result<&str, Error> { |
||||
self.wasm_bindgen_version().ok_or_else(|| { |
||||
let message = format!( |
||||
"Ensure that you have \"{}\" as a dependency in your Cargo.toml file:\n\ |
||||
[dependencies]\n\ |
||||
wasm-bindgen = \"0.2\"", |
||||
style("wasm-bindgen").bold().dim(), |
||||
); |
||||
Error::CrateConfig { message } |
||||
}) |
||||
} |
||||
|
||||
/// Get the version of `wasm-bindgen` dependency used in the `Cargo.lock`.
|
||||
pub fn wasm_bindgen_test_version(&self) -> Option<&str> { |
||||
self.get_package_version("wasm-bindgen-test") |
||||
} |
||||
|
||||
fn get_package_version(&self, package: &str) -> Option<&str> { |
||||
self.package |
||||
.iter() |
||||
.find(|p| p.name == package) |
||||
.map(|p| &p.version[..]) |
||||
} |
||||
} |
||||
|
||||
/// Given the path to the crate that we are buliding, return a `PathBuf`
|
||||
/// containing the location of the lock file, by finding the workspace root.
|
||||
fn get_lockfile_path(crate_path: &Path) -> Result<PathBuf, Error> { |
||||
// Identify the crate's root directory, or return an error.
|
||||
let manifest = crate_path.join("Cargo.toml"); |
||||
let crate_root = cargo_metadata::metadata(Some(&manifest)) |
||||
.map_err(|_| Error::CrateConfig { |
||||
message: String::from("Error while processing crate metadata"), |
||||
})?.workspace_root; |
||||
// Check that a lock file can be found in the directory. Return an error
|
||||
// if it cannot, otherwise return the path buffer.
|
||||
let lockfile_path = Path::new(&crate_root).join("Cargo.lock"); |
||||
if !lockfile_path.is_file() { |
||||
Err(Error::CrateConfig { |
||||
message: format!("Could not find lockfile at {:?}", lockfile_path), |
||||
}) |
||||
} else { |
||||
Ok(lockfile_path) |
||||
} |
||||
} |
@ -0,0 +1,123 @@ |
||||
use utils::fixture; |
||||
use wasm_pack::lockfile::Lockfile; |
||||
|
||||
#[test] |
||||
fn it_gets_wasm_bindgen_version() { |
||||
let fixture = fixture::js_hello_world(); |
||||
fixture.cargo_check(); |
||||
let lock = Lockfile::new(&fixture.path).unwrap(); |
||||
assert_eq!(lock.wasm_bindgen_version(), Some("0.2.21"),); |
||||
} |
||||
|
||||
#[test] |
||||
fn it_gets_wasm_bindgen_test_version() { |
||||
let fixture = fixture::wbg_test_node(); |
||||
fixture.cargo_check(); |
||||
let lock = Lockfile::new(&fixture.path).unwrap(); |
||||
assert_eq!(lock.wasm_bindgen_test_version(), Some("0.2.21"),); |
||||
} |
||||
|
||||
#[test] |
||||
fn it_gets_wasm_bindgen_version_in_crate_inside_workspace() { |
||||
let fixture = fixture::Fixture::new(); |
||||
fixture |
||||
.file( |
||||
"Cargo.toml", |
||||
r#" |
||||
[workspace] |
||||
members = ["./blah"] |
||||
"#, |
||||
).file( |
||||
"blah/Cargo.toml", |
||||
r#" |
||||
[package] |
||||
authors = ["The wasm-pack developers"] |
||||
description = "so awesome rust+wasm package" |
||||
license = "WTFPL" |
||||
name = "blah" |
||||
repository = "https://github.com/rustwasm/wasm-pack.git" |
||||
version = "0.1.0" |
||||
|
||||
[lib] |
||||
crate-type = ["cdylib"] |
||||
|
||||
[dependencies] |
||||
wasm-bindgen = "=0.2.21" |
||||
"#, |
||||
).file( |
||||
"blah/src/lib.rs", |
||||
r#" |
||||
extern crate wasm_bindgen; |
||||
use wasm_bindgen::prelude::*; |
||||
|
||||
#[wasm_bindgen] |
||||
pub fn hello() -> u32 { 42 } |
||||
"#, |
||||
); |
||||
fixture.cargo_check(); |
||||
let lock = Lockfile::new(&fixture.path.join("blah")).unwrap(); |
||||
assert_eq!(lock.wasm_bindgen_version(), Some("0.2.21"),); |
||||
} |
||||
|
||||
#[test] |
||||
fn it_gets_wasm_bindgen_version_from_dependencies() { |
||||
let fixture = fixture::Fixture::new(); |
||||
fixture |
||||
.file( |
||||
"Cargo.toml", |
||||
r#" |
||||
[workspace] |
||||
members = ["./parent", "./child"] |
||||
"#, |
||||
).file( |
||||
"child/Cargo.toml", |
||||
r#" |
||||
[package] |
||||
authors = ["The wasm-pack developers"] |
||||
description = "so awesome rust+wasm package" |
||||
license = "WTFPL" |
||||
name = "child" |
||||
repository = "https://github.com/rustwasm/wasm-pack.git" |
||||
version = "0.1.0" |
||||
|
||||
[lib] |
||||
crate-type = ["cdylib"] |
||||
|
||||
[dependencies] |
||||
wasm-bindgen = "=0.2.21" |
||||
"#, |
||||
).file( |
||||
"child/src/lib.rs", |
||||
r#" |
||||
extern crate wasm_bindgen; |
||||
use wasm_bindgen::prelude::*; |
||||
|
||||
#[wasm_bindgen] |
||||
pub fn hello() -> u32 { 42 } |
||||
"#, |
||||
).file( |
||||
"parent/Cargo.toml", |
||||
r#" |
||||
[package] |
||||
authors = ["The wasm-pack developers"] |
||||
description = "so awesome rust+wasm package" |
||||
license = "WTFPL" |
||||
name = "parent" |
||||
repository = "https://github.com/rustwasm/wasm-pack.git" |
||||
version = "0.1.0" |
||||
|
||||
[lib] |
||||
crate-type = ["cdylib"] |
||||
"#, |
||||
).file( |
||||
"parent/src/lib.rs", |
||||
r#" |
||||
// Just re-export all of `child`.
|
||||
extern crate child; |
||||
pub use child::*; |
||||
"#, |
||||
); |
||||
fixture.cargo_check(); |
||||
let lock = Lockfile::new(&fixture.path.join("parent")).unwrap(); |
||||
assert_eq!(lock.wasm_bindgen_version(), Some("0.2.21"),); |
||||
} |
Loading…
Reference in new issue