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