summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2024-04-04 21:50:08 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2024-04-05 21:22:39 +0200
commitf0c8e7292d3de3e4af5f923855c422a0bdb7f394 (patch)
treebcadc3abeedd80f3012d348d66894e28eabba1d9 /crates
parentee2666cf51598af595546d185a86dffe22dcfa7a (diff)
downloadrebel-f0c8e7292d3de3e4af5f923855c422a0bdb7f394.tar
rebel-f0c8e7292d3de3e4af5f923855c422a0bdb7f394.zip
driver: recipe: let subrecipes inherit meta from parent
Diffstat (limited to 'crates')
-rw-r--r--crates/driver/src/recipe.rs48
1 files changed, 39 insertions, 9 deletions
diff --git a/crates/driver/src/recipe.rs b/crates/driver/src/recipe.rs
index 1d3162d..f6207f7 100644
--- a/crates/driver/src/recipe.rs
+++ b/crates/driver/src/recipe.rs
@@ -80,22 +80,37 @@ fn handle_recipe_tasks(
fn read_recipe_tasks(
path: &Path,
basename: &str,
- recipename: &str,
tasks: &mut HashMap<TaskID, Vec<TaskDef>>,
-) -> Result<()> {
- let recipe = if recipename.is_empty() {
- basename.to_string()
- } else {
- format!("{basename}/{recipename}")
+) -> Result<RecipeMeta> {
+ let recipe_def = CURRENT_RECIPE.set(basename, || read_recipe(path))?;
+
+ let meta = TaskMeta {
+ basename: basename.to_string(),
+ recipename: "".to_string(),
+ recipe: basename.to_string(),
+ version: recipe_def.meta.version.clone(),
};
+ handle_recipe_tasks(tasks, recipe_def.tasks, &meta);
+
+ Ok(recipe_def.meta)
+}
+
+fn read_subrecipe_tasks(
+ path: &Path,
+ basename: &str,
+ recipename: &str,
+ recipe_meta: &RecipeMeta,
+ tasks: &mut HashMap<TaskID, Vec<TaskDef>>,
+) -> Result<()> {
+ let recipe = format!("{basename}/{recipename}");
let recipe_def = CURRENT_RECIPE.set(&recipe, || read_recipe(path))?;
let meta = TaskMeta {
basename: basename.to_string(),
recipename: recipename.to_string(),
recipe: recipe.clone(),
- version: recipe_def.meta.version.clone(),
+ version: recipe_meta.version.clone(),
};
handle_recipe_tasks(tasks, recipe_def.tasks, &meta);
@@ -105,9 +120,14 @@ fn read_recipe_tasks(
pub fn read_recipes<P: AsRef<Path>>(path: P) -> Result<HashMap<TaskID, Vec<TaskDef>>> {
let mut tasks = HashMap::<TaskID, Vec<TaskDef>>::new();
+ let mut recipe_metas = HashMap::<String, RecipeMeta>::new();
for entry in WalkDir::new(path)
- .sort_by_file_name()
+ .sort_by(|a, b| {
+ let stem_cmp = a.path().file_stem().cmp(&b.path().file_stem());
+ let ext_cmp = a.path().extension().cmp(&b.path().extension());
+ stem_cmp.then(ext_cmp)
+ })
.into_iter()
.filter_map(|e| e.ok())
{
@@ -127,7 +147,17 @@ pub fn read_recipes<P: AsRef<Path>>(path: P) -> Result<HashMap<TaskID, Vec<TaskD
continue;
};
- read_recipe_tasks(path, basename, recipename, &mut tasks)?;
+ if recipename.is_empty() {
+ recipe_metas.insert(
+ basename.to_string(),
+ read_recipe_tasks(path, basename, &mut tasks)?,
+ );
+ } else {
+ let Some(recipe_meta) = recipe_metas.get(basename) else {
+ continue;
+ };
+ read_subrecipe_tasks(path, basename, recipename, recipe_meta, &mut tasks)?;
+ }
}
Ok(tasks)