diff --git a/e2e/tasks/test_task_depends_post_inf_loop b/e2e/tasks/test_task_depends_post_inf_loop new file mode 100644 index 0000000000..f07da162bf --- /dev/null +++ b/e2e/tasks/test_task_depends_post_inf_loop @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# ensures depends_post on multiple tasks works. +cat <mise.toml +[tasks.one] +run = "echo one" +depends_post=[ + 'two', + 'three' +] + +[tasks.two] +run = "echo two" + +[tasks.three] +run = "echo three" +EOF + +assert "mise task deps" "one + two + └── one + three + └── one" +assert "mise run one" + +# TODO: this does not work with how mise is designed currently. Tasks can only ever be run once per run session. This will require hefty refactoring if it is ever supported +# uses depends and depends_post on the same task +#cat <mise.toml +#tasks."util:donothing" = "" +#[tasks.hi] +#depends = "util:donothing" +#run = "echo hi" +#depends_post = "util:donothing" +#EOF +#assert "mise run hi" diff --git a/src/cli/tasks/deps.rs b/src/cli/tasks/deps.rs index 1469bc4798..7d6bc35bc2 100644 --- a/src/cli/tasks/deps.rs +++ b/src/cli/tasks/deps.rs @@ -92,10 +92,18 @@ impl TasksDeps { /// fn print_deps_tree(&self, tasks: Vec) -> Result<()> { let deps = Deps::new(tasks.clone())?; + let all_tasks_to_run = tasks + .iter() + .flat_map(|t| { + let (_, postdeps) = t.resolve_depends(&tasks).unwrap(); + postdeps + }) + .chain(tasks.clone()) + .collect_vec(); // filter out nodes that are not selected let start_indexes = deps.graph.node_indices().filter(|&idx| { let task = &deps.graph[idx]; - tasks.iter().any(|t| t.name == task.name) + all_tasks_to_run.iter().any(|t| t.name == task.name) }); // iterate over selected graph nodes and print tree for idx in start_indexes { diff --git a/src/task/mod.rs b/src/task/mod.rs index 7335a4994c..885ac66501 100644 --- a/src/task/mod.rs +++ b/src/task/mod.rs @@ -291,12 +291,13 @@ impl Task { .flatten_ok() .filter_ok(|t| tasks_to_run.contains(t)) .collect_vec(); - let depends_post = tasks_to_run + let depends_post = self + .depends_post .iter() - .flat_map(|t| t.depends_post.iter().map(|td| match_tasks(&tasks, td))) + .map(|td| match_tasks(&tasks, td)) .flatten_ok() .filter_ok(|t| t.name != self.name) - .collect::>>()?; + .collect::>()?; let depends = depends .into_iter() .chain(wait_for)