0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 09:31:22 -05:00

feat(task): add --cwd flag for configuring the working directory (#14823)

This commit is contained in:
Kayla Washburn 2022-06-08 15:30:16 -06:00 committed by GitHub
parent a0a13b3a1b
commit 94068b7109
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 81 additions and 6 deletions

View file

@ -163,6 +163,7 @@ pub struct RunFlags {
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
pub struct TaskFlags {
pub cwd: Option<String>,
pub task: String,
}
@ -1465,6 +1466,14 @@ fn task_subcommand<'a>() -> Command<'a> {
Command::new("task")
.trailing_var_arg(true)
.args(config_args())
.arg(
Arg::new("cwd")
.long("cwd")
.value_name("DIR")
.help("Specify the directory to run the task in")
.takes_value(true)
.value_hint(ValueHint::DirPath)
)
// Ideally the task name and trailing arguments should be two separate clap
// arguments, but there is a bug in clap that's preventing us from doing
// this (https://github.com/clap-rs/clap/issues/1538). Once that's fixed,
@ -2567,7 +2576,15 @@ fn task_parse(
) {
config_args_parse(flags, matches);
let mut task_name = "".to_string();
let mut task_flags = TaskFlags {
cwd: None,
task: String::new(),
};
if let Some(cwd) = matches.value_of("cwd") {
task_flags.cwd = Some(cwd.to_string());
}
if let Some(mut index) = matches.index_of("task_name_and_args") {
index += 1; // skip `task`
@ -2578,6 +2595,10 @@ fn task_parse(
flags.config_flag = ConfigFlag::Path(raw_args[index + 1].to_string());
index += 2;
}
"--cwd" => {
task_flags.cwd = Some(raw_args[index + 1].to_string());
index += 2;
}
"--no-config" => {
flags.config_flag = ConfigFlag::Disabled;
index += 1;
@ -2591,7 +2612,7 @@ fn task_parse(
}
if index < raw_args.len() {
task_name = raw_args[index].to_string();
task_flags.task = raw_args[index].to_string();
index += 1;
if index < raw_args.len() {
@ -2602,7 +2623,7 @@ fn task_parse(
}
}
flags.subcommand = DenoSubcommand::Task(TaskFlags { task: task_name });
flags.subcommand = DenoSubcommand::Task(task_flags);
}
fn test_parse(flags: &mut Flags, matches: &clap::ArgMatches) {
@ -5597,6 +5618,7 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "build".to_string(),
}),
argv: svec!["hello", "world"],
@ -5609,6 +5631,19 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "build".to_string(),
}),
..Flags::default()
}
);
let r = flags_from_vec(svec!["deno", "task", "--cwd", "foo", "build"]);
assert_eq!(
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: Some("foo".to_string()),
task: "build".to_string(),
}),
..Flags::default()
@ -5632,6 +5667,7 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "build".to_string(),
}),
argv: svec!["--", "hello", "world"],
@ -5639,6 +5675,21 @@ mod tests {
..Flags::default()
}
);
let r = flags_from_vec(svec![
"deno", "task", "--cwd", "foo", "build", "--", "hello", "world"
]);
assert_eq!(
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: Some("foo".to_string()),
task: "build".to_string(),
}),
argv: svec!["--", "hello", "world"],
..Flags::default()
}
);
}
#[test]
@ -5649,6 +5700,7 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "build".to_string(),
}),
argv: svec!["--"],
@ -5664,6 +5716,7 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "build".to_string(),
}),
argv: svec!["-1", "--test"],
@ -5679,6 +5732,7 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "build".to_string(),
}),
argv: svec!["--test"],
@ -5694,6 +5748,7 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "".to_string(),
}),
..Flags::default()
@ -5708,6 +5763,7 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "".to_string(),
}),
config_flag: ConfigFlag::Path("deno.jsonc".to_string()),
@ -5723,6 +5779,7 @@ mod tests {
r.unwrap(),
Flags {
subcommand: DenoSubcommand::Task(TaskFlags {
cwd: None,
task: "".to_string(),
}),
config_flag: ConfigFlag::Path("deno.jsonc".to_string()),

View file

@ -12,6 +12,13 @@ itest!(task_no_args {
exit_code: 1,
});
itest!(task_cwd {
args: "task -q --config task/deno.json --cwd .. echo_cwd",
output: "task/task_cwd.out",
envs: vec![("NO_COLOR".to_string(), "1".to_string())],
exit_code: 0,
});
itest!(task_non_existent {
args: "task --config task/deno.json non_existent",
output: "task/task_non_existent.out",

View file

@ -5,6 +5,7 @@
"deno_echo": "deno eval 'console.log(5)'",
"strings": "deno run main.ts && deno eval \"console.log(\\\"test\\\")\"",
"piped": "echo 12345 | (deno eval 'const b = new Uint8Array(1);Deno.stdin.readSync(b);console.log(b)' && deno eval 'const b = new Uint8Array(1);Deno.stdin.readSync(b);console.log(b)')",
"exit_code_5": "echo $(echo 10 ; exit 2) && exit 5"
"exit_code_5": "echo $(echo 10 ; exit 2) && exit 5",
"echo_cwd": "echo $(pwd)"
}
}

1
cli/tests/testdata/task/task_cwd.out vendored Normal file
View file

@ -0,0 +1 @@
[WILDCARD]tests

View file

@ -5,6 +5,8 @@ Available tasks:
deno eval 'console.log(5)'
- echo
echo 1
- echo_cwd
echo $(pwd)
- exit_code_5
echo $(echo 10 ; exit 2) && exit 5
- piped

View file

@ -7,6 +7,8 @@ Available tasks:
deno eval 'console.log(5)'
- echo
echo 1
- echo_cwd
echo $(pwd)
- exit_code_5
echo $(echo 10 ; exit 2) && exit 5
- piped

View file

@ -4,12 +4,14 @@ use crate::colors;
use crate::config_file::ConfigFile;
use crate::flags::Flags;
use crate::flags::TaskFlags;
use crate::fs_util;
use crate::proc_state::ProcState;
use deno_core::anyhow::bail;
use deno_core::anyhow::Context;
use deno_core::error::AnyError;
use std::collections::BTreeMap;
use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::Arc;
fn get_tasks_config(
@ -71,7 +73,10 @@ pub async fn execute_script(
return Ok(1);
}
let cwd = config_file_path.parent().unwrap();
let cwd = match task_flags.cwd {
Some(path) => fs_util::canonicalize_path(&PathBuf::from(path))?,
None => config_file_path.parent().unwrap().to_owned(),
};
let task_name = task_flags.task;
let maybe_script = tasks_config.get(&task_name);
@ -95,7 +100,7 @@ pub async fn execute_script(
let seq_list = deno_task_shell::parser::parse(script)
.with_context(|| format!("Error parsing script '{}'.", task_name))?;
let env_vars = std::env::vars().collect::<HashMap<String, String>>();
let exit_code = deno_task_shell::execute(seq_list, env_vars, cwd).await;
let exit_code = deno_task_shell::execute(seq_list, env_vars, &cwd).await;
Ok(exit_code)
} else {
eprintln!("Task not found: {}", task_name);