From ca052caa28c7d29e49ef387863d26098767eae7b Mon Sep 17 00:00:00 2001 From: sagie gur ari Date: Fri, 21 Jul 2017 06:12:49 +0000 Subject: [PATCH] more environment variables for workspace support --- Cargo.toml | 2 +- README.md | 3 ++ docs/_includes/content.md | 3 ++ .../src/cargo_make/environment/mod.rs.html | 26 +++++++++++- docs/api/src/cargo_make/types.rs.html | 12 ++++++ src/environment/mod.rs | 14 ++++++- src/environment/mod_test.rs | 41 +++++++++++++++++++ src/types.rs | 6 +++ src/types_test.rs | 7 ++++ 9 files changed, 111 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c1970af3..2e50fd85 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-make" -version = "0.3.32" +version = "0.3.33" authors = ["Sagie Gur-Ari "] description = "Rust task runner and build tool." license = "Apache-2.0" diff --git a/README.md b/README.md index 43e6a875..d65473a4 100644 --- a/README.md +++ b/README.md @@ -437,6 +437,8 @@ In addition, cargo-make will also add few environment variables that can be help * **CARGO_MAKE_RUST_TARGET_OS** - windows, macos, ios, linux, android, etc ... (see rust cfg feature) * **CARGO_MAKE_RUST_TARGET_POINTER_WIDTH** - 32, 64 * **CARGO_MAKE_RUST_TARGET_VENDOR** - apple, pc, unknown +* **CARGO_MAKE_CRATE_IS_WORKSPACE** - Holds TRUE/FALSE based if this is a workspace crate or not (defined even if no Cargo.toml is found) +* **CARGO_MAKE_CRATE_WORKSPACE_MEMBERS** - Holds list of member paths (defined as empty value if no Cargo.toml is found) The following environment variables will be set by cargo-make if Cargo.toml file exists and the relevant value is defined: @@ -795,6 +797,7 @@ See [contributing guide](.github/CONTRIBUTING.md) | Date | Version | Description | | ----------- | ------- | ----------- | +| 2017-07-21 | v0.3.33 | Added more environment variables for workspace support | | 2017-07-20 | v0.3.32 | Added --list-all-steps cli option | | 2017-07-17 | v0.3.28 | workspace level ci flow | | 2017-07-16 | v0.3.27 | cargo make ci-flow on travis now automatically runs code coverage and uploads to codecov | diff --git a/docs/_includes/content.md b/docs/_includes/content.md index f323e1ce..24a0b87f 100644 --- a/docs/_includes/content.md +++ b/docs/_includes/content.md @@ -406,6 +406,8 @@ In addition, cargo-make will also add few environment variables that can be help * **CARGO_MAKE_RUST_TARGET_OS** - windows, macos, ios, linux, android, etc ... (see rust cfg feature) * **CARGO_MAKE_RUST_TARGET_POINTER_WIDTH** - 32, 64 * **CARGO_MAKE_RUST_TARGET_VENDOR** - apple, pc, unknown +* **CARGO_MAKE_CRATE_IS_WORKSPACE** - Holds TRUE/FALSE based if this is a workspace crate or not (defined even if no Cargo.toml is found) +* **CARGO_MAKE_CRATE_WORKSPACE_MEMBERS** - Holds list of member paths (defined as empty value if no Cargo.toml is found) The following environment variables will be set by cargo-make if Cargo.toml file exists and the relevant value is defined: @@ -764,6 +766,7 @@ See [contributing guide](https://github.com/sagiegurari/cargo-make/blob/master/. | Date | Version | Description | | ----------- | ------- | ----------- | +| 2017-07-21 | v0.3.33 | Added more environment variables for workspace support | | 2017-07-20 | v0.3.32 | Added --list-all-steps cli option | | 2017-07-17 | v0.3.28 | workspace level ci flow | | 2017-07-16 | v0.3.27 | cargo make ci-flow on travis now automatically runs code coverage and uploads to codecov | diff --git a/docs/api/src/cargo_make/environment/mod.rs.html b/docs/api/src/cargo_make/environment/mod.rs.html index 3de1d556..de213003 100644 --- a/docs/api/src/cargo_make/environment/mod.rs.html +++ b/docs/api/src/cargo_make/environment/mod.rs.html @@ -220,6 +220,18 @@ 175 176 177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189
 //! # env
 //!
@@ -237,7 +249,7 @@
 use log::Logger;
 use std::env;
 use std::path::PathBuf;
-use types::{Config, CrateInfo, PackageInfo};
+use types::{Config, CrateInfo, PackageInfo, Workspace};
 
 /// Updates the env for the current execution based on the descriptor.
 fn set_env(
@@ -288,6 +300,18 @@
     if package_info.repository.is_some() {
         env::set_var("CARGO_MAKE_CRATE_REPOSITORY", &package_info.repository.unwrap());
     }
+
+    let is_workspace_var_value = if crate_info.workspace.is_none() {
+        "FALSE"
+    } else {
+        "TRUE"
+    };
+    env::set_var("CARGO_MAKE_CRATE_IS_WORKSPACE", is_workspace_var_value);
+
+    let workspace = crate_info.workspace.unwrap_or(Workspace::new());
+    let members = workspace.members.unwrap_or(vec![]);
+    let members_string = members.join(",");
+    env::set_var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS", &members_string);
 }
 
 fn setup_env_for_git_repo(logger: &Logger) {
diff --git a/docs/api/src/cargo_make/types.rs.html b/docs/api/src/cargo_make/types.rs.html
index 8457915a..94cdd608 100644
--- a/docs/api/src/cargo_make/types.rs.html
+++ b/docs/api/src/cargo_make/types.rs.html
@@ -536,6 +536,12 @@
 491
 492
 493
+494
+495
+496
+497
+498
+499
 
 //! # types
 //!
@@ -958,6 +964,12 @@
     pub members: Option<Vec<String>>
 }
 
+impl Workspace {
+    pub fn new() -> Workspace {
+        Workspace { members: None }
+    }
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone)]
 /// Holds crate package information loaded from the Cargo.toml file package section.
 pub struct PackageInfo {
diff --git a/src/environment/mod.rs b/src/environment/mod.rs
index 118f9186..7b2d68c9 100644
--- a/src/environment/mod.rs
+++ b/src/environment/mod.rs
@@ -14,7 +14,7 @@ use self::rustinfo::Channel;
 use log::Logger;
 use std::env;
 use std::path::PathBuf;
-use types::{Config, CrateInfo, PackageInfo};
+use types::{Config, CrateInfo, PackageInfo, Workspace};
 
 /// Updates the env for the current execution based on the descriptor.
 fn set_env(
@@ -65,6 +65,18 @@ fn setup_env_for_crate(logger: &Logger) {
     if package_info.repository.is_some() {
         env::set_var("CARGO_MAKE_CRATE_REPOSITORY", &package_info.repository.unwrap());
     }
+
+    let is_workspace_var_value = if crate_info.workspace.is_none() {
+        "FALSE"
+    } else {
+        "TRUE"
+    };
+    env::set_var("CARGO_MAKE_CRATE_IS_WORKSPACE", is_workspace_var_value);
+
+    let workspace = crate_info.workspace.unwrap_or(Workspace::new());
+    let members = workspace.members.unwrap_or(vec![]);
+    let members_string = members.join(",");
+    env::set_var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS", &members_string);
 }
 
 fn setup_env_for_git_repo(logger: &Logger) {
diff --git a/src/environment/mod_test.rs b/src/environment/mod_test.rs
index 37b64fd5..a9595bf3 100644
--- a/src/environment/mod_test.rs
+++ b/src/environment/mod_test.rs
@@ -65,6 +65,8 @@ fn setup_env_for_crate_load_toml_found() {
     env::set_var("CARGO_MAKE_CRATE_DOCUMENTATION", "EMPTY");
     env::set_var("CARGO_MAKE_CRATE_HOMEPAGE", "EMPTY");
     env::set_var("CARGO_MAKE_CRATE_REPOSITORY", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_IS_WORKSPACE", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS", "EMPTY");
 
     setup_env_for_crate(&logger);
 
@@ -76,6 +78,8 @@ fn setup_env_for_crate_load_toml_found() {
     assert_eq!(env::var("CARGO_MAKE_CRATE_DOCUMENTATION").unwrap(), "https://sagiegurari.github.io/cargo-make");
     assert_eq!(env::var("CARGO_MAKE_CRATE_HOMEPAGE").unwrap(), "https://sagiegurari.github.io/cargo-make");
     assert_eq!(env::var("CARGO_MAKE_CRATE_REPOSITORY").unwrap(), "https://github.com/sagiegurari/cargo-make.git");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_IS_WORKSPACE").unwrap(), "FALSE");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS").unwrap(), "");
 }
 
 #[test]
@@ -90,6 +94,8 @@ fn setup_env_for_crate_load_toml_not_found_and_cwd() {
     env::set_var("CARGO_MAKE_CRATE_DOCUMENTATION", "EMPTY");
     env::set_var("CARGO_MAKE_CRATE_HOMEPAGE", "EMPTY");
     env::set_var("CARGO_MAKE_CRATE_REPOSITORY", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_IS_WORKSPACE", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS", "EMPTY");
 
     env::set_var("CARGO_MAKE_WORKING_DIRECTORY", "EMPTY");
     assert!(env::var("CARGO_MAKE_WORKING_DIRECTORY").unwrap() == "EMPTY");
@@ -108,6 +114,8 @@ fn setup_env_for_crate_load_toml_not_found_and_cwd() {
     assert_eq!(env::var("CARGO_MAKE_CRATE_DOCUMENTATION").unwrap(), "EMPTY");
     assert_eq!(env::var("CARGO_MAKE_CRATE_HOMEPAGE").unwrap(), "EMPTY");
     assert_eq!(env::var("CARGO_MAKE_CRATE_REPOSITORY").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_IS_WORKSPACE").unwrap(), "FALSE");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS").unwrap(), "");
 
     setup_env_for_crate(&logger);
 
@@ -119,6 +127,39 @@ fn setup_env_for_crate_load_toml_not_found_and_cwd() {
     assert_eq!(env::var("CARGO_MAKE_CRATE_DOCUMENTATION").unwrap(), "https://sagiegurari.github.io/cargo-make");
     assert_eq!(env::var("CARGO_MAKE_CRATE_HOMEPAGE").unwrap(), "https://sagiegurari.github.io/cargo-make");
     assert_eq!(env::var("CARGO_MAKE_CRATE_REPOSITORY").unwrap(), "https://github.com/sagiegurari/cargo-make.git");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_IS_WORKSPACE").unwrap(), "FALSE");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS").unwrap(), "");
+}
+
+#[test]
+fn setup_env_for_crate_workspace() {
+    let logger = log::create("error");
+
+    env::set_var("CARGO_MAKE_CRATE_NAME", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_FS_NAME", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_VERSION", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_DESCRIPTION", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_LICENSE", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_DOCUMENTATION", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_HOMEPAGE", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_REPOSITORY", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_IS_WORKSPACE", "EMPTY");
+    env::set_var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS", "EMPTY");
+
+    setup_cwd(&logger, Some("examples/workspace"));
+    setup_env_for_crate(&logger);
+    setup_cwd(&logger, Some("../.."));
+
+    assert_eq!(env::var("CARGO_MAKE_CRATE_NAME").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_FS_NAME").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_VERSION").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_DESCRIPTION").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_LICENSE").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_DOCUMENTATION").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_HOMEPAGE").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_REPOSITORY").unwrap(), "EMPTY");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_IS_WORKSPACE").unwrap(), "TRUE");
+    assert_eq!(env::var("CARGO_MAKE_CRATE_WORKSPACE_MEMBERS").unwrap(), "member1,member2");
 }
 
 #[test]
diff --git a/src/types.rs b/src/types.rs
index 3ac18f6b..d6298f8c 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -419,6 +419,12 @@ pub struct Workspace {
     pub members: Option>
 }
 
+impl Workspace {
+    pub fn new() -> Workspace {
+        Workspace { members: None }
+    }
+}
+
 #[derive(Serialize, Deserialize, Debug, Clone)]
 /// Holds crate package information loaded from the Cargo.toml file package section.
 pub struct PackageInfo {
diff --git a/src/types_test.rs b/src/types_test.rs
index 6b702518..0c101fea 100644
--- a/src/types_test.rs
+++ b/src/types_test.rs
@@ -650,3 +650,10 @@ fn crate_info_load() {
     let package = crate_info.package.unwrap();
     assert_eq!(package.name.unwrap(), "cargo-make");
 }
+
+#[test]
+fn workspace_new() {
+    let workspace = Workspace::new();
+
+    assert!(workspace.members.is_none());
+}