diff --git a/src/eval.rs b/src/eval.rs index 08c0ccc..2fa77c1 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -215,7 +215,6 @@ pub fn tree_value( }) .to_string(); - // TODO exec_expression_with_path() to use the tree path. // NOTE: an environment must not be calculated here otherwise any // exec expression will implicitly depend on the entire environment, // and potentially many variables (including itself). Exec expressions diff --git a/src/model.rs b/src/model.rs index e55df9e..c8f2d40 100644 --- a/src/model.rs +++ b/src/model.rs @@ -1250,7 +1250,11 @@ impl ApplicationContext { /// Construct an ApplicationContext from a path using default MainOptions. pub fn from_path(pathbuf: std::path::PathBuf) -> Result { - Self::from_path_and_root(pathbuf, None) + if let Some(root_dir) = pathbuf.parent().map(std::path::Path::to_owned) { + Self::from_path_and_root(pathbuf, Some(&root_dir)) + } else { + Self::from_path_and_root(pathbuf, None) + } } /// Construct an ApplicationContext from a path using default MainOptions. diff --git a/src/query.rs b/src/query.rs index 4a3969b..41e0b56 100644 --- a/src/query.rs +++ b/src/query.rs @@ -317,7 +317,6 @@ pub fn tree_context( garden: Option<&str>, ) -> Result { let mut ctx = model::TreeContext::new("", config.get_id(), None, None); - // TODO: grafted trees if let Some(context) = tree_from_name(config, tree, None, None) { ctx.tree = context.tree; } else { diff --git a/tests/data/garden.yaml b/tests/data/garden.yaml index ea37c1e..2808417 100644 --- a/tests/data/garden.yaml +++ b/tests/data/garden.yaml @@ -92,6 +92,8 @@ trees: url: https://example.com/replacement/tree replace: true + trees/prebuilt: "file://${repos}/example.git" + templates: echo-template-extended: extend: echo-template diff --git a/tests/data/trees/prebuilt/README.md b/tests/data/trees/prebuilt/README.md new file mode 100644 index 0000000..a30364b --- /dev/null +++ b/tests/data/trees/prebuilt/README.md @@ -0,0 +1,4 @@ +# Test tree data + +This directory is used by the tests to simulate the existence of the +`example/tree`, which is referenced by `tests/data/graden.yaml`. diff --git a/tests/eval_test.rs b/tests/eval_test.rs index 27a0b1c..b9e867b 100644 --- a/tests/eval_test.rs +++ b/tests/eval_test.rs @@ -112,6 +112,18 @@ fn exec_expression() -> Result<()> { Ok(()) } +#[test] +fn exec_expression_in_tree_context() -> Result<()> { + let app_context = + garden::model::ApplicationContext::from_path_string("tests/data/garden.yaml")?; + let config = app_context.get_root_config(); + let context = garden::query::tree_context(&config, "trees/prebuilt", None)?; + let value = garden::eval::tree_value(&app_context, &config, "$ pwd", &context.tree, None); + assert!(value.ends_with("/trees/prebuilt")); + + Ok(()) +} + /// Ensure that shell $variables can be used. #[test] fn shell_variable_syntax() -> Result<()> {