diff --git a/Cargo.toml b/Cargo.toml index 0e53b4ab..af9825e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cargo-make" -version = "0.2.6" +version = "0.2.7" authors = ["Sagie Gur-Ari "] description = "Rust task runner and build tool." license = "Apache-2.0" diff --git a/README.md b/README.md index 82847e88..44f270f1 100644 --- a/README.md +++ b/README.md @@ -263,6 +263,40 @@ hello Now you can see that 'hello' was printed twice. +It is also possible to define platform specific aliases, for example: + +````toml +[tasks.my_task] +linux_alias = "linux_my_task" +windows_alias = "windows_my_task" +mac_alias = "mac_my_task" + +[tasks.linux_my_task] + +[tasks.mac_my_task] + +[tasks.windows_my_task] +```` + +If platform specific alias is found and matches current platform it will take precedence over the non platform alias definition.
+For example: + +````toml +[tasks.my_task] +linux_alias = "run" +alias = "do_nothing" + +[tasks.run] +script = [ + "echo hello" +] + +[tasks.do_nothing] +```` + +If you run task **my_task** on windows or mac, it will invoke the **do_nothing** task.
+However, if executed on a linux platform, it will invoke the **run** task. + ### Default Tasks and Extending There is no real need to define the tasks that were shown in the previous example.
@@ -423,6 +457,7 @@ See [contributing guide](.github/CONTRIBUTING.md) | Date | Version | Description | | ----------- | ------- | ----------- | +| 2017-06-26 | v0.2.7 | Platform specific alias | | 2017-06-26 | v0.2.6 | Enable task attributes override | | 2017-06-25 | v0.2.3 | Added disabled task attribute support | | 2017-06-24 | v0.2.0 | Internal fixes (renamed dependencies attribute) | diff --git a/docs/api/src/cargo_make/cli.rs.html b/docs/api/src/cargo_make/cli.rs.html index 962ca166..6632a083 100644 --- a/docs/api/src/cargo_make/cli.rs.html +++ b/docs/api/src/cargo_make/cli.rs.html @@ -113,6 +113,11 @@ 68 69 70 +71 +72 +73 +74 +75
 //! # cli
 //!
@@ -183,6 +188,11 @@
     fn run_empty_task() {
         run("bad.toml", "empty", "error");
     }
+
+    #[test]
+    fn run_file_and_task() {
+        run("./examples/dependencies.toml", "A", "error");
+    }
 }
 
diff --git a/docs/api/src/cargo_make/command.rs.html b/docs/api/src/cargo_make/command.rs.html index e96d7b60..28ba2283 100644 --- a/docs/api/src/cargo_make/command.rs.html +++ b/docs/api/src/cargo_make/command.rs.html @@ -275,6 +275,15 @@ 230 231 232 +233 +234 +235 +236 +237 +238 +239 +240 +241
 //! # command
 //!
@@ -463,6 +472,9 @@
             args: None,
             disabled: None,
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             script: None,
             dependencies: None
@@ -481,6 +493,9 @@
             install_crate: None,
             disabled: None,
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             script: None,
             dependencies: None
@@ -500,6 +515,9 @@
             args: None,
             disabled: None,
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             dependencies: None
         };
diff --git a/docs/api/src/cargo_make/descriptor.rs.html b/docs/api/src/cargo_make/descriptor.rs.html
index 10b663c0..0c1f4ef6 100644
--- a/docs/api/src/cargo_make/descriptor.rs.html
+++ b/docs/api/src/cargo_make/descriptor.rs.html
@@ -438,6 +438,42 @@
 393
 394
 395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
 
 //! # descriptor
 //!
@@ -497,6 +533,9 @@
                 let mut merged_task = Task {
                     disabled: None,
                     alias: None,
+                    linux_alias: None,
+                    windows_alias: None,
+                    mac_alias: None,
                     install_crate: None,
                     install_script: None,
                     command: None,
@@ -662,6 +701,9 @@
             Task {
                 disabled: None,
                 alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
                 install_crate: Some("my crate".to_string()),
                 install_script: None,
                 command: Some("test".to_string()),
@@ -676,6 +718,9 @@
         let task = output.get("test").unwrap();
         assert!(task.disabled.is_none());
         assert!(task.alias.is_none());
+        assert!(task.linux_alias.is_none());
+        assert!(task.windows_alias.is_none());
+        assert!(task.mac_alias.is_none());
         assert!(task.install_crate.is_some());
         assert!(task.install_script.is_none());
         assert!(task.command.is_some());
@@ -694,6 +739,9 @@
             Task {
                 disabled: None,
                 alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
                 install_crate: Some("my crate".to_string()),
                 install_script: None,
                 command: Some("test".to_string()),
@@ -708,6 +756,9 @@
         let task = output.get("test").unwrap();
         assert!(task.disabled.is_none());
         assert!(task.alias.is_none());
+        assert!(task.linux_alias.is_none());
+        assert!(task.windows_alias.is_none());
+        assert!(task.mac_alias.is_none());
         assert!(task.install_crate.is_some());
         assert!(task.install_script.is_none());
         assert!(task.command.is_some());
@@ -726,6 +777,9 @@
             Task {
                 disabled: None,
                 alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
                 install_crate: Some("my crate".to_string()),
                 install_script: None,
                 command: Some("test".to_string()),
@@ -740,6 +794,9 @@
             Task {
                 disabled: None,
                 alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
                 install_crate: None,
                 install_script: None,
                 command: Some("test".to_string()),
@@ -755,6 +812,9 @@
         let mut task = output.get("test").unwrap();
         assert!(task.disabled.is_none());
         assert!(task.alias.is_none());
+        assert!(task.linux_alias.is_none());
+        assert!(task.windows_alias.is_none());
+        assert!(task.mac_alias.is_none());
         assert!(task.install_crate.is_some());
         assert!(task.install_script.is_none());
         assert!(task.command.is_some());
@@ -765,6 +825,9 @@
         task = output.get("test2").unwrap();
         assert!(task.disabled.is_none());
         assert!(task.alias.is_none());
+        assert!(task.linux_alias.is_none());
+        assert!(task.windows_alias.is_none());
+        assert!(task.mac_alias.is_none());
         assert!(task.install_crate.is_none());
         assert!(task.install_script.is_none());
         assert!(task.command.is_some());
@@ -783,6 +846,9 @@
             Task {
                 disabled: None,
                 alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
                 install_crate: Some("my crate".to_string()),
                 install_script: None,
                 command: Some("test1".to_string()),
@@ -797,6 +863,9 @@
             Task {
                 disabled: Some(true),
                 alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
                 install_crate: None,
                 install_script: None,
                 command: Some("test2".to_string()),
@@ -812,6 +881,9 @@
         let task = output.get("test").unwrap();
         assert!(task.disabled.is_some());
         assert!(task.alias.is_none());
+        assert!(task.linux_alias.is_none());
+        assert!(task.windows_alias.is_none());
+        assert!(task.mac_alias.is_none());
         assert!(task.install_crate.is_some());
         assert!(task.install_script.is_none());
         assert!(task.command.is_some());
diff --git a/docs/api/src/cargo_make/installer.rs.html b/docs/api/src/cargo_make/installer.rs.html
index 013051df..d77b2f63 100644
--- a/docs/api/src/cargo_make/installer.rs.html
+++ b/docs/api/src/cargo_make/installer.rs.html
@@ -209,6 +209,18 @@
 164
 165
 166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
 
 //! # installer
 //!
@@ -316,6 +328,9 @@
             args: None,
             disabled: None,
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             script: None,
             dependencies: None
@@ -333,6 +348,9 @@
             args: Some(vec!["test".to_string()]),
             disabled: None,
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             script: None,
             dependencies: None
@@ -351,6 +369,9 @@
             args: None,
             disabled: None,
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             script: None,
             dependencies: None
@@ -369,6 +390,9 @@
             args: None,
             disabled: None,
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             script: None,
             dependencies: None
         };
diff --git a/docs/api/src/cargo_make/runner.rs.html b/docs/api/src/cargo_make/runner.rs.html
index 7ae34d37..725ad07b 100644
--- a/docs/api/src/cargo_make/runner.rs.html
+++ b/docs/api/src/cargo_make/runner.rs.html
@@ -203,6 +203,187 @@
 158
 159
 160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
 
 //! # runner
 //!
@@ -250,9 +431,31 @@
 ) -> String {
     match config.tasks.get(name) {
         Some(task_config) => {
-            match task_config.alias {
-                Some(ref alias) => get_task_name(logger, config, alias),
-                _ => name.to_string(),
+            let alias = if cfg!(windows) {
+                match task_config.windows_alias {
+                    Some(ref value) => Some(value),
+                    _ => None,
+                }
+            } else if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
+                match task_config.mac_alias {
+                    Some(ref value) => Some(value),
+                    _ => None,
+                }
+            } else {
+                match task_config.linux_alias {
+                    Some(ref value) => Some(value),
+                    _ => None,
+                }
+            };
+
+            match alias {
+                Some(ref os_alias) => get_task_name(logger, config, os_alias),
+                _ => {
+                    match task_config.alias {
+                        Some(ref alias) => get_task_name(logger, config, alias),
+                        _ => name.to_string(),
+                    }
+                }
             }
         }
         None => {
@@ -364,6 +567,165 @@
 
     logger.info::<()>("Build done", &[&time_string, "."], None);
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use log;
+    use std::collections::HashMap;
+    use types::Task;
+
+    #[test]
+    fn set_env_empty() {
+        let logger = log::create("error");
+        let config = Config { env: HashMap::new(), tasks: HashMap::new() };
+
+        set_env(&logger, &config);
+    }
+
+    #[test]
+    fn set_env_values() {
+        let logger = log::create("error");
+        let mut config = Config { env: HashMap::new(), tasks: HashMap::new() };
+        config.env.insert("MY_ENV_KEY".to_string(), "MY_ENV_VALUE".to_string());
+
+        assert_eq!(env::var("MY_ENV_KEY").unwrap_or("NONE".to_string()), "NONE".to_string());
+
+        set_env(&logger, &config);
+
+        assert_eq!(env::var("MY_ENV_KEY").unwrap(), "MY_ENV_VALUE");
+    }
+
+    #[test]
+    #[should_panic]
+    fn get_task_name_not_found() {
+        let logger = log::create("error");
+        let config = Config { env: HashMap::new(), tasks: HashMap::new() };
+
+        get_task_name(&logger, &config, "test");
+    }
+
+    #[test]
+    fn get_task_name_no_alias() {
+        let logger = log::create("error");
+        let mut config = Config { env: HashMap::new(), tasks: HashMap::new() };
+
+        config.tasks.insert(
+            "test".to_string(),
+            Task {
+                alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
+                disabled: None,
+                install_crate: None,
+                install_script: None,
+                command: None,
+                args: None,
+                script: None,
+                dependencies: None
+            }
+        );
+
+        let name = get_task_name(&logger, &config, "test");
+
+        assert_eq!(name, "test");
+    }
+
+    #[test]
+    fn get_task_name_alias() {
+        let logger = log::create("error");
+        let mut config = Config { env: HashMap::new(), tasks: HashMap::new() };
+
+        config.tasks.insert(
+            "test".to_string(),
+            Task {
+                alias: Some("test2".to_string()),
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
+                disabled: None,
+                install_crate: None,
+                install_script: None,
+                command: None,
+                args: None,
+                script: None,
+                dependencies: None
+            }
+        );
+
+        config.tasks.insert(
+            "test2".to_string(),
+            Task {
+                alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
+                disabled: None,
+                install_crate: None,
+                install_script: None,
+                command: None,
+                args: None,
+                script: None,
+                dependencies: None
+            }
+        );
+
+        let name = get_task_name(&logger, &config, "test");
+
+        assert_eq!(name, "test2");
+    }
+
+    #[test]
+    fn get_task_name_platform_alias() {
+        let logger = log::create("error");
+        let mut config = Config { env: HashMap::new(), tasks: HashMap::new() };
+
+        let mut task = Task {
+            alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
+            disabled: None,
+            install_crate: None,
+            install_script: None,
+            command: None,
+            args: None,
+            script: None,
+            dependencies: None
+        };
+        if cfg!(windows) {
+            task.windows_alias = Some("test2".to_string());
+        } else if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
+            task.mac_alias = Some("test2".to_string());
+        } else {
+            task.linux_alias = Some("test2".to_string());
+        };
+
+        config.tasks.insert("test".to_string(), task);
+
+        config.tasks.insert(
+            "test2".to_string(),
+            Task {
+                alias: None,
+                linux_alias: None,
+                windows_alias: None,
+                mac_alias: None,
+                disabled: None,
+                install_crate: None,
+                install_script: None,
+                command: None,
+                args: None,
+                script: None,
+                dependencies: None
+            }
+        );
+
+        let name = get_task_name(&logger, &config, "test");
+
+        assert_eq!(name, "test2");
+    }
+}
 
diff --git a/docs/api/src/cargo_make/types.rs.html b/docs/api/src/cargo_make/types.rs.html index b0529699..8c4775f7 100644 --- a/docs/api/src/cargo_make/types.rs.html +++ b/docs/api/src/cargo_make/types.rs.html @@ -233,6 +233,45 @@ 188 189 190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229
 //! # types
 //!
@@ -248,6 +287,12 @@
     pub disabled: Option<bool>,
     /// if defined, task points to another task and all other properties are ignored
     pub alias: Option<String>,
+    /// acts like alias if runtime OS is Linux (takes precedence over alias)
+    pub linux_alias: Option<String>,
+    /// acts like alias if runtime OS is Windows (takes precedence over alias)
+    pub windows_alias: Option<String>,
+    /// acts like alias if runtime OS is Mac (takes precedence over alias)
+    pub mac_alias: Option<String>,
     /// if defined, the provided crate will be installed (if needed) before running the task
     pub install_crate: Option<String>,
     /// if defined, the provided script will be executed before running the task
@@ -275,6 +320,18 @@
             self.alias = task.alias.clone();
         }
 
+        if task.linux_alias.is_some() {
+            self.linux_alias = task.linux_alias.clone();
+        }
+
+        if task.windows_alias.is_some() {
+            self.windows_alias = task.windows_alias.clone();
+        }
+
+        if task.mac_alias.is_some() {
+            self.mac_alias = task.mac_alias.clone();
+        }
+
         if task.install_crate.is_some() {
             self.install_crate = task.install_crate.clone();
         }
@@ -346,6 +403,9 @@
             command: Some("test1".to_string()),
             disabled: Some(false),
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             args: None,
             script: Some(vec!["1".to_string(), "2".to_string()]),
@@ -356,6 +416,9 @@
             command: None,
             disabled: Some(true),
             alias: Some("alias2".to_string()),
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             args: None,
             script: None,
@@ -368,6 +431,9 @@
         assert!(base.command.is_some());
         assert!(base.disabled.is_some());
         assert!(base.alias.is_some());
+        assert!(base.linux_alias.is_none());
+        assert!(base.windows_alias.is_none());
+        assert!(base.mac_alias.is_none());
         assert!(base.install_script.is_none());
         assert!(base.args.is_none());
         assert!(base.script.is_some());
@@ -387,6 +453,9 @@
             command: Some("test1".to_string()),
             disabled: Some(false),
             alias: None,
+            linux_alias: None,
+            windows_alias: None,
+            mac_alias: None,
             install_script: None,
             args: None,
             script: Some(vec!["1".to_string(), "2".to_string()]),
@@ -397,6 +466,9 @@
             command: Some("test2".to_string()),
             disabled: Some(true),
             alias: Some("alias2".to_string()),
+            linux_alias: Some("linux".to_string()),
+            windows_alias: Some("windows".to_string()),
+            mac_alias: Some("mac".to_string()),
             install_script: Some(vec!["i1".to_string(), "i2".to_string()]),
             args: Some(vec!["a1".to_string(), "a2".to_string()]),
             script: Some(vec!["1".to_string(), "2".to_string(), "3".to_string()]),
@@ -409,6 +481,9 @@
         assert!(base.command.is_some());
         assert!(base.disabled.is_some());
         assert!(base.alias.is_some());
+        assert!(base.linux_alias.is_some());
+        assert!(base.windows_alias.is_some());
+        assert!(base.mac_alias.is_some());
         assert!(base.install_script.is_some());
         assert!(base.args.is_some());
         assert!(base.script.is_some());
@@ -418,6 +493,9 @@
         assert_eq!(base.command.unwrap(), "test2");
         assert!(base.disabled.unwrap());
         assert_eq!(base.alias.unwrap(), "alias2");
+        assert_eq!(base.linux_alias.unwrap(), "linux");
+        assert_eq!(base.windows_alias.unwrap(), "windows");
+        assert_eq!(base.mac_alias.unwrap(), "mac");
         assert_eq!(base.install_script.unwrap().len(), 2);
         assert_eq!(base.args.unwrap().len(), 2);
         assert_eq!(base.script.unwrap().len(), 3);
diff --git a/examples/depedencies.toml b/examples/dependencies.toml
similarity index 100%
rename from examples/depedencies.toml
rename to examples/dependencies.toml
diff --git a/src/cli.rs b/src/cli.rs
index 68e85be5..29a70108 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -67,4 +67,9 @@ mod tests {
     fn run_empty_task() {
         run("bad.toml", "empty", "error");
     }
+
+    #[test]
+    fn run_file_and_task() {
+        run("./examples/dependencies.toml", "A", "error");
+    }
 }