mirror of
https://github.com/denoland/deno.git
synced 2024-12-18 05:14:21 -05:00
fix(task): only pass args to root task (#27213)
When we run `deno task` with args like `deno task foo arg` the argument should only be passed to the root task, not to its dependencies. Fixes https://github.com/denoland/deno/issues/27206
This commit is contained in:
parent
2fbc5fea83
commit
d5b63bb642
4 changed files with 51 additions and 7 deletions
|
@ -241,12 +241,15 @@ pub async fn execute_script(
|
||||||
description: None,
|
description: None,
|
||||||
},
|
},
|
||||||
kill_signal,
|
kill_signal,
|
||||||
|
cli_options.argv(),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
for task_config in &packages_task_configs {
|
for task_config in &packages_task_configs {
|
||||||
let exit_code = task_runner.run_tasks(task_config, &kill_signal).await?;
|
let exit_code = task_runner
|
||||||
|
.run_tasks(task_config, &kill_signal, cli_options.argv())
|
||||||
|
.await?;
|
||||||
if exit_code > 0 {
|
if exit_code > 0 {
|
||||||
return Ok(exit_code);
|
return Ok(exit_code);
|
||||||
}
|
}
|
||||||
|
@ -263,6 +266,7 @@ struct RunSingleOptions<'a> {
|
||||||
cwd: &'a Path,
|
cwd: &'a Path,
|
||||||
custom_commands: HashMap<String, Rc<dyn ShellCommand>>,
|
custom_commands: HashMap<String, Rc<dyn ShellCommand>>,
|
||||||
kill_signal: KillSignal,
|
kill_signal: KillSignal,
|
||||||
|
argv: &'a [String],
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TaskRunner<'a> {
|
struct TaskRunner<'a> {
|
||||||
|
@ -279,9 +283,10 @@ impl<'a> TaskRunner<'a> {
|
||||||
&self,
|
&self,
|
||||||
pkg_tasks_config: &PackageTaskInfo,
|
pkg_tasks_config: &PackageTaskInfo,
|
||||||
kill_signal: &KillSignal,
|
kill_signal: &KillSignal,
|
||||||
|
argv: &[String],
|
||||||
) -> Result<i32, deno_core::anyhow::Error> {
|
) -> Result<i32, deno_core::anyhow::Error> {
|
||||||
match sort_tasks_topo(pkg_tasks_config) {
|
match sort_tasks_topo(pkg_tasks_config) {
|
||||||
Ok(sorted) => self.run_tasks_in_parallel(sorted, kill_signal).await,
|
Ok(sorted) => self.run_tasks_in_parallel(sorted, kill_signal, argv).await,
|
||||||
Err(err) => match err {
|
Err(err) => match err {
|
||||||
TaskError::NotFound(name) => {
|
TaskError::NotFound(name) => {
|
||||||
if self.task_flags.is_run {
|
if self.task_flags.is_run {
|
||||||
|
@ -317,6 +322,7 @@ impl<'a> TaskRunner<'a> {
|
||||||
&self,
|
&self,
|
||||||
tasks: Vec<ResolvedTask<'a>>,
|
tasks: Vec<ResolvedTask<'a>>,
|
||||||
kill_signal: &KillSignal,
|
kill_signal: &KillSignal,
|
||||||
|
args: &[String],
|
||||||
) -> Result<i32, deno_core::anyhow::Error> {
|
) -> Result<i32, deno_core::anyhow::Error> {
|
||||||
struct PendingTasksContext<'a> {
|
struct PendingTasksContext<'a> {
|
||||||
completed: HashSet<usize>,
|
completed: HashSet<usize>,
|
||||||
|
@ -338,13 +344,21 @@ impl<'a> TaskRunner<'a> {
|
||||||
&mut self,
|
&mut self,
|
||||||
runner: &'b TaskRunner<'b>,
|
runner: &'b TaskRunner<'b>,
|
||||||
kill_signal: &KillSignal,
|
kill_signal: &KillSignal,
|
||||||
|
argv: &'a [String],
|
||||||
) -> Option<
|
) -> Option<
|
||||||
LocalBoxFuture<'b, Result<(i32, &'a ResolvedTask<'a>), AnyError>>,
|
LocalBoxFuture<'b, Result<(i32, &'a ResolvedTask<'a>), AnyError>>,
|
||||||
>
|
>
|
||||||
where
|
where
|
||||||
'a: 'b,
|
'a: 'b,
|
||||||
{
|
{
|
||||||
for task in self.tasks.iter() {
|
let mut tasks_iter = self.tasks.iter().peekable();
|
||||||
|
while let Some(task) = tasks_iter.next() {
|
||||||
|
let args = if tasks_iter.peek().is_none() {
|
||||||
|
argv
|
||||||
|
} else {
|
||||||
|
&[]
|
||||||
|
};
|
||||||
|
|
||||||
if self.completed.contains(&task.id)
|
if self.completed.contains(&task.id)
|
||||||
|| self.running.contains(&task.id)
|
|| self.running.contains(&task.id)
|
||||||
{
|
{
|
||||||
|
@ -366,7 +380,13 @@ impl<'a> TaskRunner<'a> {
|
||||||
match task.task_or_script {
|
match task.task_or_script {
|
||||||
TaskOrScript::Task(_, def) => {
|
TaskOrScript::Task(_, def) => {
|
||||||
runner
|
runner
|
||||||
.run_deno_task(task.folder_url, task.name, def, kill_signal)
|
.run_deno_task(
|
||||||
|
task.folder_url,
|
||||||
|
task.name,
|
||||||
|
def,
|
||||||
|
kill_signal,
|
||||||
|
args,
|
||||||
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
TaskOrScript::Script(scripts, _) => {
|
TaskOrScript::Script(scripts, _) => {
|
||||||
|
@ -376,6 +396,7 @@ impl<'a> TaskRunner<'a> {
|
||||||
task.name,
|
task.name,
|
||||||
scripts,
|
scripts,
|
||||||
kill_signal,
|
kill_signal,
|
||||||
|
args,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
@ -399,7 +420,7 @@ impl<'a> TaskRunner<'a> {
|
||||||
|
|
||||||
while context.has_remaining_tasks() {
|
while context.has_remaining_tasks() {
|
||||||
while queue.len() < self.concurrency {
|
while queue.len() < self.concurrency {
|
||||||
if let Some(task) = context.get_next_task(self, kill_signal) {
|
if let Some(task) = context.get_next_task(self, kill_signal, args) {
|
||||||
queue.push(task);
|
queue.push(task);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
|
@ -429,6 +450,7 @@ impl<'a> TaskRunner<'a> {
|
||||||
task_name: &str,
|
task_name: &str,
|
||||||
definition: &TaskDefinition,
|
definition: &TaskDefinition,
|
||||||
kill_signal: KillSignal,
|
kill_signal: KillSignal,
|
||||||
|
argv: &'a [String],
|
||||||
) -> Result<i32, deno_core::anyhow::Error> {
|
) -> Result<i32, deno_core::anyhow::Error> {
|
||||||
let cwd = match &self.task_flags.cwd {
|
let cwd = match &self.task_flags.cwd {
|
||||||
Some(path) => canonicalize_path(&PathBuf::from(path))
|
Some(path) => canonicalize_path(&PathBuf::from(path))
|
||||||
|
@ -447,6 +469,7 @@ impl<'a> TaskRunner<'a> {
|
||||||
cwd: &cwd,
|
cwd: &cwd,
|
||||||
custom_commands,
|
custom_commands,
|
||||||
kill_signal,
|
kill_signal,
|
||||||
|
argv,
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
@ -457,6 +480,7 @@ impl<'a> TaskRunner<'a> {
|
||||||
task_name: &str,
|
task_name: &str,
|
||||||
scripts: &IndexMap<String, String>,
|
scripts: &IndexMap<String, String>,
|
||||||
kill_signal: KillSignal,
|
kill_signal: KillSignal,
|
||||||
|
argv: &[String],
|
||||||
) -> Result<i32, deno_core::anyhow::Error> {
|
) -> Result<i32, deno_core::anyhow::Error> {
|
||||||
// ensure the npm packages are installed if using a managed resolver
|
// ensure the npm packages are installed if using a managed resolver
|
||||||
if let Some(npm_resolver) = self.npm_resolver.as_managed() {
|
if let Some(npm_resolver) = self.npm_resolver.as_managed() {
|
||||||
|
@ -489,6 +513,7 @@ impl<'a> TaskRunner<'a> {
|
||||||
cwd: &cwd,
|
cwd: &cwd,
|
||||||
custom_commands: custom_commands.clone(),
|
custom_commands: custom_commands.clone(),
|
||||||
kill_signal: kill_signal.clone(),
|
kill_signal: kill_signal.clone(),
|
||||||
|
argv,
|
||||||
})
|
})
|
||||||
.await?;
|
.await?;
|
||||||
if exit_code > 0 {
|
if exit_code > 0 {
|
||||||
|
@ -510,11 +535,12 @@ impl<'a> TaskRunner<'a> {
|
||||||
cwd,
|
cwd,
|
||||||
custom_commands,
|
custom_commands,
|
||||||
kill_signal,
|
kill_signal,
|
||||||
|
argv,
|
||||||
} = opts;
|
} = opts;
|
||||||
|
|
||||||
output_task(
|
output_task(
|
||||||
opts.task_name,
|
opts.task_name,
|
||||||
&task_runner::get_script_with_args(script, self.cli_options.argv()),
|
&task_runner::get_script_with_args(script, argv),
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(
|
Ok(
|
||||||
|
@ -525,7 +551,7 @@ impl<'a> TaskRunner<'a> {
|
||||||
env_vars: self.env_vars.clone(),
|
env_vars: self.env_vars.clone(),
|
||||||
custom_commands,
|
custom_commands,
|
||||||
init_cwd: self.cli_options.initial_cwd(),
|
init_cwd: self.cli_options.initial_cwd(),
|
||||||
argv: self.cli_options.argv(),
|
argv,
|
||||||
root_node_modules_dir: self.npm_resolver.root_node_modules_path(),
|
root_node_modules_dir: self.npm_resolver.root_node_modules_path(),
|
||||||
stdio: None,
|
stdio: None,
|
||||||
kill_signal,
|
kill_signal,
|
||||||
|
|
|
@ -56,6 +56,11 @@
|
||||||
"args": "task a",
|
"args": "task a",
|
||||||
"output": "./cycle_2.out",
|
"output": "./cycle_2.out",
|
||||||
"exitCode": 1
|
"exitCode": 1
|
||||||
|
},
|
||||||
|
"arg_task_with_deps": {
|
||||||
|
"cwd": "arg_task_with_deps",
|
||||||
|
"args": "task a a",
|
||||||
|
"output": "./arg_task_with_deps.out"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
4
tests/specs/task/dependencies/arg_task_with_deps.out
Normal file
4
tests/specs/task/dependencies/arg_task_with_deps.out
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
Task b echo 'b'
|
||||||
|
b
|
||||||
|
Task a echo "a"
|
||||||
|
a
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"tasks": {
|
||||||
|
"a": {
|
||||||
|
"command": "echo",
|
||||||
|
"dependencies": ["b"]
|
||||||
|
},
|
||||||
|
"b": "echo 'b'"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue