diff --git a/CHANGELOG.md b/CHANGELOG.md index da014156..40da7c83 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ## CHANGELOG +### v0.32.14 + +* Fix: Keep env order for extended makefiles #523 + ### v0.32.13 (2021-03-05) * Enhancement: Support rust-script as an additional rust runner #516 diff --git a/examples/extending-env.toml b/examples/extending-env.toml new file mode 100755 index 00000000..7582327e --- /dev/null +++ b/examples/extending-env.toml @@ -0,0 +1,5 @@ + +extend = "env.toml" + +[env] +SIMPLE = "EXTENDED VALUE" diff --git a/src/lib/descriptor/mod.rs b/src/lib/descriptor/mod.rs index cc6a99da..f962ab1d 100755 --- a/src/lib/descriptor/mod.rs +++ b/src/lib/descriptor/mod.rs @@ -48,30 +48,31 @@ fn merge_env( if !key_str.starts_with("CARGO_MAKE_CURRENT_TASK_") { let value_clone = value.clone(); - if merged.contains_key(&key_str) { - let base_value = merged.swap_remove(&key_str).unwrap(); + match merged.get(&key_str) { + Some(base_value) => { + let base_value_clone = base_value.clone(); + match (base_value_clone, value_clone.clone()) { + ( + EnvValue::Profile(ref base_profile_env), + EnvValue::Profile(ref extended_profile_env), + ) => { + let mut base_profile_env_mut = base_profile_env.clone(); + let mut extended_profile_env_mut = extended_profile_env.clone(); - match (base_value, value_clone.clone()) { - ( - EnvValue::Profile(ref base_profile_env), - EnvValue::Profile(ref extended_profile_env), - ) => { - let mut base_profile_env_mut = base_profile_env.clone(); - let mut extended_profile_env_mut = extended_profile_env.clone(); + let merged_sub_env = + merge_env(&mut base_profile_env_mut, &mut extended_profile_env_mut); - let merged_sub_env = - merge_env(&mut base_profile_env_mut, &mut extended_profile_env_mut); - - merged.insert(key_str, EnvValue::Profile(merged_sub_env)); - } - _ => { - merged.insert(key_str, value_clone); - () - } - }; - } else { - merged.insert(key_str, value_clone); - } + merged.insert(key_str, EnvValue::Profile(merged_sub_env)); + } + _ => { + merged.insert(key_str, value_clone); + } + }; + } + None => { + merged.insert(key_str, value_clone); + } + }; } } diff --git a/src/lib/descriptor/mod_test.rs b/src/lib/descriptor/mod_test.rs index 55dc6b9d..e62d79fc 100755 --- a/src/lib/descriptor/mod_test.rs +++ b/src/lib/descriptor/mod_test.rs @@ -404,6 +404,21 @@ fn load_descriptors_no_load_workspace_makefile() { assert!(task.is_none()); } +#[test] +#[ignore] +fn load_env_extended_override() { + let toml_file = "./src/lib/test/makefiles/env-extended.toml"; + + envmnt::remove_all(&vec!["IF_UNDEFINED", "COMPOSITE_OF_MAPPED"]); + let config = load(toml_file, true, None, false).unwrap(); + environment::set_env_for_config(config.env, None, false); + + assert!(envmnt::is_equal("IF_UNDEFINED", "EXTENDED")); + assert!(envmnt::is_equal("COMPOSITE_OF_MAPPED", "VALUE: EXTENDED")); + + envmnt::remove_all(&vec!["IF_UNDEFINED", "COMPOSITE_OF_MAPPED"]); +} + #[test] #[ignore] fn load_env_override() { diff --git a/src/lib/test/makefiles/env-extended.toml b/src/lib/test/makefiles/env-extended.toml new file mode 100755 index 00000000..e4b3422a --- /dev/null +++ b/src/lib/test/makefiles/env-extended.toml @@ -0,0 +1,5 @@ + +extend = "./env.toml" + +[env] +IF_UNDEFINED = "EXTENDED"