From 5e46951f84983f8927749d6c27a2efc881daf2c4 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 24 Feb 2021 07:22:26 +0100 Subject: [PATCH 1/5] Build sub-contracts into sub-folders of `target/ink/` --- src/crate_metadata.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/crate_metadata.rs b/src/crate_metadata.rs index 5633f0be..907aa8c5 100644 --- a/src/crate_metadata.rs +++ b/src/crate_metadata.rs @@ -19,7 +19,10 @@ use anyhow::{Context, Result}; use cargo_metadata::{Metadata as CargoMetadata, MetadataCommand, Package}; use semver::Version; use serde_json::{Map, Value}; -use std::{fs, path::PathBuf}; +use std::{ + fs, + path::{Path, PathBuf}, +}; use toml::value; use url::Url; @@ -43,11 +46,20 @@ impl CrateMetadata { /// Parses the contract manifest and returns relevant metadata. pub fn collect(manifest_path: &ManifestPath) -> Result { let (metadata, root_package) = get_cargo_metadata(manifest_path)?; - let target_directory = metadata.target_directory.as_path().join("ink"); + let mut target_directory = metadata.target_directory.as_path().join("ink"); // Normalize the package name. let package_name = root_package.name.replace("-", "_"); + let manifest_dir = match manifest_path.directory() { + Some(dir) => dir, + None => Path::new("./"), + }; + let absolute_manifest_path = manifest_dir.canonicalize()?; + if absolute_manifest_path != metadata.workspace_root { + target_directory = target_directory.join(package_name.clone()); + } + // {target_dir}/wasm32-unknown-unknown/release/{package_name}.wasm let mut original_wasm = target_directory.clone(); original_wasm.push("wasm32-unknown-unknown"); -- GitLab From 5847584c66e3bf23ba42234c066907aefc8c545f Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 24 Feb 2021 08:38:50 +0100 Subject: [PATCH 2/5] Reduce code duplication with util function --- src/cmd/metadata.rs | 13 ++----------- src/crate_metadata.rs | 13 ++++--------- src/util.rs | 39 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/src/cmd/metadata.rs b/src/cmd/metadata.rs index c301c301..c39ff54a 100644 --- a/src/cmd/metadata.rs +++ b/src/cmd/metadata.rs @@ -29,10 +29,7 @@ use contract_metadata::{ SourceLanguage, SourceWasm, User, }; use semver::Version; -use std::{ - fs, - path::{Path, PathBuf}, -}; +use std::{fs, path::PathBuf}; use url::Url; const METADATA_FILE: &str = "metadata.json"; @@ -123,12 +120,6 @@ impl GenerateMetadataCommand { if self.unstable_options.original_manifest { generate_metadata(&self.crate_metadata.manifest_path)?; } else { - let manifest_dir = match self.crate_metadata.manifest_path.directory() { - Some(dir) => dir, - None => Path::new("./"), - }; - let absolute_package_path = manifest_dir.canonicalize()?; - Workspace::new( &self.crate_metadata.cargo_meta, &self.crate_metadata.root_package.id, @@ -139,7 +130,7 @@ impl GenerateMetadataCommand { .with_profile_release_lto(false)?; Ok(()) })? - .with_metadata_gen_package(absolute_package_path)? + .with_metadata_gen_package(util::absolute_path(&self.crate_metadata.manifest_path)?)? .using_temp(generate_metadata)?; } diff --git a/src/crate_metadata.rs b/src/crate_metadata.rs index 907aa8c5..dafb2b01 100644 --- a/src/crate_metadata.rs +++ b/src/crate_metadata.rs @@ -14,15 +14,14 @@ // You should have received a copy of the GNU General Public License // along with cargo-contract. If not, see . +use crate::util; use crate::ManifestPath; + use anyhow::{Context, Result}; use cargo_metadata::{Metadata as CargoMetadata, MetadataCommand, Package}; use semver::Version; use serde_json::{Map, Value}; -use std::{ - fs, - path::{Path, PathBuf}, -}; +use std::{fs, path::PathBuf}; use toml::value; use url::Url; @@ -51,11 +50,7 @@ impl CrateMetadata { // Normalize the package name. let package_name = root_package.name.replace("-", "_"); - let manifest_dir = match manifest_path.directory() { - Some(dir) => dir, - None => Path::new("./"), - }; - let absolute_manifest_path = manifest_dir.canonicalize()?; + let absolute_manifest_path = util::absolute_path(&manifest_path)?; if absolute_manifest_path != metadata.workspace_root { target_directory = target_directory.join(package_name.clone()); } diff --git a/src/util.rs b/src/util.rs index ece7a0c0..03fc43f8 100644 --- a/src/util.rs +++ b/src/util.rs @@ -14,10 +14,16 @@ // You should have received a copy of the GNU General Public License // along with cargo-contract. If not, see . +use crate::workspace::ManifestPath; use crate::Verbosity; + use anyhow::{Context, Result}; use rustc_version::Channel; -use std::{ffi::OsStr, path::Path, process::Command}; +use std::{ + ffi::OsStr, + path::{Path, PathBuf}, + process::Command, +}; /// Check whether the current rust channel is valid: `nightly` is recommended. pub fn assert_channel() -> Result<()> { @@ -92,6 +98,15 @@ pub(crate) fn base_name(path: &Path) -> &str { .expect("must be valid utf-8") } +/// Returns the absolute path to the manifest directory. +pub(crate) fn absolute_path(manifest_path: &ManifestPath) -> Result { + let directory = match manifest_path.directory() { + Some(dir) => dir, + None => Path::new("./"), + }; + directory.canonicalize() +} + /// Prints to stdout if `verbosity.is_verbose()` is `true`. #[macro_export] macro_rules! maybe_println { @@ -104,7 +119,8 @@ macro_rules! maybe_println { #[cfg(test)] pub mod tests { - use std::path::Path; + use crate::workspace::ManifestPath; + use std::{fs, path::Path}; pub fn with_tmp_dir(f: F) where @@ -118,4 +134,23 @@ pub mod tests { // catch test panics in order to clean up temp dir which will be very large f(tmp_dir.path()).expect("Error executing test with tmp dir") } + + #[test] + fn must_return_absolute_path_from_absolute_path() { + with_tmp_dir(|path| { + // given + let cargo_toml_path = path.join("Cargo.toml"); + let _ = fs::File::create(&cargo_toml_path).expect("file creation failed"); + let manifest_path = + ManifestPath::new(cargo_toml_path).expect("manifest path creation failed"); + + // when + let absolute_path = + super::absolute_path(&manifest_path).expect("absolute path extraction failed"); + + // then + assert_eq!(absolute_path.as_path(), path); + Ok(()) + }) + } } -- GitLab From 0088e2c5d81a9a19a540d8f8e56d2f08698cebd4 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 24 Feb 2021 11:01:57 +0100 Subject: [PATCH 3/5] Make `absolute_directory` method on `ManifestPath` --- src/cmd/metadata.rs | 2 +- src/crate_metadata.rs | 3 +-- src/util.rs | 38 ++------------------------------------ src/workspace/manifest.rs | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/src/cmd/metadata.rs b/src/cmd/metadata.rs index c39ff54a..387e16bc 100644 --- a/src/cmd/metadata.rs +++ b/src/cmd/metadata.rs @@ -130,7 +130,7 @@ impl GenerateMetadataCommand { .with_profile_release_lto(false)?; Ok(()) })? - .with_metadata_gen_package(util::absolute_path(&self.crate_metadata.manifest_path)?)? + .with_metadata_gen_package(self.crate_metadata.manifest_path.absolute_directory()?)? .using_temp(generate_metadata)?; } diff --git a/src/crate_metadata.rs b/src/crate_metadata.rs index dafb2b01..736f716e 100644 --- a/src/crate_metadata.rs +++ b/src/crate_metadata.rs @@ -14,7 +14,6 @@ // You should have received a copy of the GNU General Public License // along with cargo-contract. If not, see . -use crate::util; use crate::ManifestPath; use anyhow::{Context, Result}; @@ -50,7 +49,7 @@ impl CrateMetadata { // Normalize the package name. let package_name = root_package.name.replace("-", "_"); - let absolute_manifest_path = util::absolute_path(&manifest_path)?; + let absolute_manifest_path = manifest_path.absolute_directory()?; if absolute_manifest_path != metadata.workspace_root { target_directory = target_directory.join(package_name.clone()); } diff --git a/src/util.rs b/src/util.rs index 03fc43f8..f1a58c99 100644 --- a/src/util.rs +++ b/src/util.rs @@ -14,16 +14,11 @@ // You should have received a copy of the GNU General Public License // along with cargo-contract. If not, see . -use crate::workspace::ManifestPath; use crate::Verbosity; use anyhow::{Context, Result}; use rustc_version::Channel; -use std::{ - ffi::OsStr, - path::{Path, PathBuf}, - process::Command, -}; +use std::{ffi::OsStr, path::Path, process::Command}; /// Check whether the current rust channel is valid: `nightly` is recommended. pub fn assert_channel() -> Result<()> { @@ -98,15 +93,6 @@ pub(crate) fn base_name(path: &Path) -> &str { .expect("must be valid utf-8") } -/// Returns the absolute path to the manifest directory. -pub(crate) fn absolute_path(manifest_path: &ManifestPath) -> Result { - let directory = match manifest_path.directory() { - Some(dir) => dir, - None => Path::new("./"), - }; - directory.canonicalize() -} - /// Prints to stdout if `verbosity.is_verbose()` is `true`. #[macro_export] macro_rules! maybe_println { @@ -119,8 +105,7 @@ macro_rules! maybe_println { #[cfg(test)] pub mod tests { - use crate::workspace::ManifestPath; - use std::{fs, path::Path}; + use std::path::Path; pub fn with_tmp_dir(f: F) where @@ -134,23 +119,4 @@ pub mod tests { // catch test panics in order to clean up temp dir which will be very large f(tmp_dir.path()).expect("Error executing test with tmp dir") } - - #[test] - fn must_return_absolute_path_from_absolute_path() { - with_tmp_dir(|path| { - // given - let cargo_toml_path = path.join("Cargo.toml"); - let _ = fs::File::create(&cargo_toml_path).expect("file creation failed"); - let manifest_path = - ManifestPath::new(cargo_toml_path).expect("manifest path creation failed"); - - // when - let absolute_path = - super::absolute_path(&manifest_path).expect("absolute path extraction failed"); - - // then - assert_eq!(absolute_path.as_path(), path); - Ok(()) - }) - } } diff --git a/src/workspace/manifest.rs b/src/workspace/manifest.rs index 40ef117c..69d9a272 100644 --- a/src/workspace/manifest.rs +++ b/src/workspace/manifest.rs @@ -66,6 +66,15 @@ impl ManifestPath { None } } + + /// Returns the absolute directory path of the manifest. + pub fn absolute_directory(&self) -> Result { + let directory = match self.directory() { + Some(dir) => dir, + None => Path::new("./"), + }; + directory.canonicalize() + } } impl TryFrom<&PathBuf> for ManifestPath { @@ -404,3 +413,30 @@ fn crate_type_exists(crate_type: &str, crate_types: &[value::Value]) -> bool { .iter() .any(|v| v.as_str().map_or(false, |s| s == crate_type)) } + +#[cfg(test)] +mod test { + use super::ManifestPath; + use crate::util::tests::with_tmp_dir; + use std::fs; + + #[test] + fn must_return_absolute_path_from_absolute_path() { + with_tmp_dir(|path| { + // given + let cargo_toml_path = path.join("Cargo.toml"); + let _ = fs::File::create(&cargo_toml_path).expect("file creation failed"); + let manifest_path = + ManifestPath::new(cargo_toml_path).expect("manifest path creation failed"); + + // when + let absolute_path = manifest_path + .absolute_directory() + .expect("absolute path extraction failed"); + + // then + assert_eq!(absolute_path.as_path(), path); + Ok(()) + }) + } +} -- GitLab From fbfe0a3930821e9aa508196c2592b2720d4287c0 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 24 Feb 2021 11:03:30 +0100 Subject: [PATCH 4/5] Revert unnecessary changes --- src/crate_metadata.rs | 1 - src/util.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/src/crate_metadata.rs b/src/crate_metadata.rs index 736f716e..acacc997 100644 --- a/src/crate_metadata.rs +++ b/src/crate_metadata.rs @@ -15,7 +15,6 @@ // along with cargo-contract. If not, see . use crate::ManifestPath; - use anyhow::{Context, Result}; use cargo_metadata::{Metadata as CargoMetadata, MetadataCommand, Package}; use semver::Version; diff --git a/src/util.rs b/src/util.rs index f1a58c99..ece7a0c0 100644 --- a/src/util.rs +++ b/src/util.rs @@ -15,7 +15,6 @@ // along with cargo-contract. If not, see . use crate::Verbosity; - use anyhow::{Context, Result}; use rustc_version::Channel; use std::{ffi::OsStr, path::Path, process::Command}; -- GitLab From 45d604d41721c4c4fe342671c87d66ae1dfd5d56 Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Wed, 24 Feb 2021 11:15:28 +0100 Subject: [PATCH 5/5] Ensure workspace root is also the canonical path --- src/crate_metadata.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/crate_metadata.rs b/src/crate_metadata.rs index acacc997..95e11d13 100644 --- a/src/crate_metadata.rs +++ b/src/crate_metadata.rs @@ -49,7 +49,8 @@ impl CrateMetadata { let package_name = root_package.name.replace("-", "_"); let absolute_manifest_path = manifest_path.absolute_directory()?; - if absolute_manifest_path != metadata.workspace_root { + let absolute_workspace_root = metadata.workspace_root.canonicalize()?; + if absolute_manifest_path != absolute_workspace_root { target_directory = target_directory.join(package_name.clone()); } -- GitLab