From 8e7f28e5f3fee5eb33ba3e4c8b6f4dcc7cd3f541 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Fri, 6 Sep 2024 17:55:18 -0400 Subject: [PATCH 01/10] Replace ~ with homedir --- crates/deno_task_shell/src/shell/commands/cd.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/crates/deno_task_shell/src/shell/commands/cd.rs b/crates/deno_task_shell/src/shell/commands/cd.rs index b4e1c3a..ac3c60f 100644 --- a/crates/deno_task_shell/src/shell/commands/cd.rs +++ b/crates/deno_task_shell/src/shell/commands/cd.rs @@ -41,16 +41,11 @@ fn execute_cd(cwd: &Path, args: Vec) -> Result { // create a new vector to avoid modifying the original let mut args = args; if args.is_empty() { - // append `~` to args + // append homedir to args args.push("~".to_string()); } let path = parse_args(args.clone())?; - let new_dir = if path == "~" { - dirs::home_dir() - .ok_or_else(|| anyhow::anyhow!("Home directory not found"))? - } else { - cwd.join(&path) - }; + let new_dir = cwd.join(&path); let new_dir = match new_dir.parse_dot() { Ok(path) => path.to_path_buf(), // fallback to canonicalize path just in case @@ -68,7 +63,13 @@ fn parse_args(args: Vec) -> Result { for arg in args { match arg { ArgKind::Arg(arg) => { - paths.push(arg); + if arg.contains('~') { + let home_dir = dirs::home_dir().unwrap(); + let arg = arg.replacen("~", home_dir.to_string_lossy().as_ref(), 1); + paths.push(arg); + } else { + paths.push(arg.to_string()); + } } _ => arg.bail_unsupported()?, } From 95704489d4597cab66c17c61ccfeca41c4f26263 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Fri, 6 Sep 2024 18:01:45 -0400 Subject: [PATCH 02/10] Replacing ~ with homedir when parsing --- crates/deno_task_shell/src/parser.rs | 15 ++++++++++++--- crates/deno_task_shell/src/shell/commands/cd.rs | 8 +------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/crates/deno_task_shell/src/parser.rs b/crates/deno_task_shell/src/parser.rs index 27919df..99ee76d 100644 --- a/crates/deno_task_shell/src/parser.rs +++ b/crates/deno_task_shell/src/parser.rs @@ -684,10 +684,19 @@ fn parse_word(pair: Pair) -> Result { match part.as_rule() { Rule::EXIT_STATUS => parts.push(WordPart::Variable("?".to_string())), Rule::UNQUOTED_CHAR => { - if let Some(WordPart::Text(ref mut text)) = parts.last_mut() { - text.push(part.as_str().chars().next().unwrap()); + let char = part.as_str().chars().next().unwrap(); + let text = if char == '~' { + dirs::home_dir() + .map(|p| p.to_string_lossy().into_owned()) + .unwrap_or_else(|| "~".to_string()) } else { - parts.push(WordPart::Text(part.as_str().to_string())); + char.to_string() + }; + + if let Some(WordPart::Text(ref mut existing_text)) = parts.last_mut() { + existing_text.push_str(&text); + } else { + parts.push(WordPart::Text(text)); } } Rule::UNQUOTED_ESCAPE_CHAR => { diff --git a/crates/deno_task_shell/src/shell/commands/cd.rs b/crates/deno_task_shell/src/shell/commands/cd.rs index ac3c60f..8191372 100644 --- a/crates/deno_task_shell/src/shell/commands/cd.rs +++ b/crates/deno_task_shell/src/shell/commands/cd.rs @@ -63,13 +63,7 @@ fn parse_args(args: Vec) -> Result { for arg in args { match arg { ArgKind::Arg(arg) => { - if arg.contains('~') { - let home_dir = dirs::home_dir().unwrap(); - let arg = arg.replacen("~", home_dir.to_string_lossy().as_ref(), 1); - paths.push(arg); - } else { - paths.push(arg.to_string()); - } + paths.push(arg); } _ => arg.bail_unsupported()?, } From aaa108dbf0362634554148fae0f8bfde1ad17cd2 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Fri, 6 Sep 2024 18:02:30 -0400 Subject: [PATCH 03/10] Use homedir instead of ~ for empty cd --- crates/deno_task_shell/src/shell/commands/cd.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/deno_task_shell/src/shell/commands/cd.rs b/crates/deno_task_shell/src/shell/commands/cd.rs index 8191372..5a9fd93 100644 --- a/crates/deno_task_shell/src/shell/commands/cd.rs +++ b/crates/deno_task_shell/src/shell/commands/cd.rs @@ -42,7 +42,8 @@ fn execute_cd(cwd: &Path, args: Vec) -> Result { let mut args = args; if args.is_empty() { // append homedir to args - args.push("~".to_string()); + let home_dir = dirs::home_dir().unwrap(); + args.push(home_dir.to_string_lossy().to_string()); } let path = parse_args(args.clone())?; let new_dir = cwd.join(&path); From f704f29751cf667303c611960f588df0b0f21306 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Fri, 6 Sep 2024 18:11:01 -0400 Subject: [PATCH 04/10] Revert to replacement in parse_args --- crates/deno_task_shell/src/parser.rs | 15 +++------------ crates/deno_task_shell/src/shell/commands/cd.rs | 13 +++++++++---- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/crates/deno_task_shell/src/parser.rs b/crates/deno_task_shell/src/parser.rs index 99ee76d..27919df 100644 --- a/crates/deno_task_shell/src/parser.rs +++ b/crates/deno_task_shell/src/parser.rs @@ -684,19 +684,10 @@ fn parse_word(pair: Pair) -> Result { match part.as_rule() { Rule::EXIT_STATUS => parts.push(WordPart::Variable("?".to_string())), Rule::UNQUOTED_CHAR => { - let char = part.as_str().chars().next().unwrap(); - let text = if char == '~' { - dirs::home_dir() - .map(|p| p.to_string_lossy().into_owned()) - .unwrap_or_else(|| "~".to_string()) - } else { - char.to_string() - }; - - if let Some(WordPart::Text(ref mut existing_text)) = parts.last_mut() { - existing_text.push_str(&text); + if let Some(WordPart::Text(ref mut text)) = parts.last_mut() { + text.push(part.as_str().chars().next().unwrap()); } else { - parts.push(WordPart::Text(text)); + parts.push(WordPart::Text(part.as_str().to_string())); } } Rule::UNQUOTED_ESCAPE_CHAR => { diff --git a/crates/deno_task_shell/src/shell/commands/cd.rs b/crates/deno_task_shell/src/shell/commands/cd.rs index 5a9fd93..d5c1143 100644 --- a/crates/deno_task_shell/src/shell/commands/cd.rs +++ b/crates/deno_task_shell/src/shell/commands/cd.rs @@ -41,9 +41,8 @@ fn execute_cd(cwd: &Path, args: Vec) -> Result { // create a new vector to avoid modifying the original let mut args = args; if args.is_empty() { - // append homedir to args - let home_dir = dirs::home_dir().unwrap(); - args.push(home_dir.to_string_lossy().to_string()); + // append '~' to args + args.push("~".to_string()); } let path = parse_args(args.clone())?; let new_dir = cwd.join(&path); @@ -64,7 +63,13 @@ fn parse_args(args: Vec) -> Result { for arg in args { match arg { ArgKind::Arg(arg) => { - paths.push(arg); + if arg.contains('~') { + let home_dir = dirs::home_dir().unwrap(); + let arg = arg.replacen("~", home_dir.to_string_lossy().as_ref(), 1); + paths.push(arg); + } else { + paths.push(arg.to_string()); + } } _ => arg.bail_unsupported()?, } From f14cac3cdff5e1fb276e104eefd1f16e14544af2 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Fri, 6 Sep 2024 19:30:19 -0400 Subject: [PATCH 05/10] Update argument parsing and implement ~ expansion --- .../src/shell/commands/args.rs | 24 ++++++++++++------- .../deno_task_shell/src/shell/commands/cat.rs | 4 ++-- .../deno_task_shell/src/shell/commands/cd.rs | 4 ++-- .../src/shell/commands/cp_mv.rs | 8 +++---- .../src/shell/commands/exit.rs | 4 ++-- .../src/shell/commands/head.rs | 4 ++-- .../src/shell/commands/mkdir.rs | 4 ++-- .../deno_task_shell/src/shell/commands/pwd.rs | 4 ++-- .../deno_task_shell/src/shell/commands/rm.rs | 12 +++++++--- .../src/shell/commands/sleep.rs | 4 ++-- .../src/shell/commands/xargs.rs | 4 ++-- crates/shell/src/commands.rs | 16 +++++++++---- 12 files changed, 56 insertions(+), 36 deletions(-) diff --git a/crates/deno_task_shell/src/shell/commands/args.rs b/crates/deno_task_shell/src/shell/commands/args.rs index d308500..7422a01 100644 --- a/crates/deno_task_shell/src/shell/commands/args.rs +++ b/crates/deno_task_shell/src/shell/commands/args.rs @@ -26,27 +26,33 @@ impl<'a> ArgKind<'a> { } } -pub fn parse_arg_kinds(flags: &[String]) -> Vec { +pub fn parse_arg_kinds(flags: &mut [String]) -> Vec { let mut result = Vec::new(); let mut had_dash_dash = false; - for arg in flags { + let home_dir = dirs::home_dir().unwrap(); + let home_dir = home_dir.to_str().unwrap(); + for arg in flags.iter_mut() { if had_dash_dash { + let arg_clone = arg.clone(); + arg.replace_range(.., &arg_clone.replace('~', home_dir)); result.push(ArgKind::Arg(arg)); } else if arg == "-" { result.push(ArgKind::Arg("-")); } else if arg == "--" { had_dash_dash = true; - } else if let Some(flag) = arg.strip_prefix("--") { - result.push(ArgKind::LongFlag(flag)); - } else if let Some(flags) = arg.strip_prefix('-') { - if flags.parse::().is_ok() { + } else if arg.starts_with("--") { + result.push(ArgKind::LongFlag(&arg.strip_prefix("--").unwrap())); + } else if arg.starts_with('-') { + if arg.parse::().is_ok() { result.push(ArgKind::Arg(arg)); } else { - for c in flags.chars() { + for c in arg.strip_prefix('-').unwrap().chars() { result.push(ArgKind::ShortFlag(c)); } } } else { + let arg_clone = arg.clone(); + arg.replace_range(.., &arg_clone.replace('~', home_dir)); result.push(ArgKind::Arg(arg)); } } @@ -60,7 +66,7 @@ mod test { #[test] fn parses() { - let data = vec![ + let mut data = vec![ "-f".to_string(), "-ab".to_string(), "--force".to_string(), @@ -72,7 +78,7 @@ mod test { "--test".to_string(), "-t".to_string(), ]; - let args = parse_arg_kinds(&data); + let args = parse_arg_kinds(&mut data); assert_eq!( args, vec![ diff --git a/crates/deno_task_shell/src/shell/commands/cat.rs b/crates/deno_task_shell/src/shell/commands/cat.rs index 674fe33..395c5d1 100644 --- a/crates/deno_task_shell/src/shell/commands/cat.rs +++ b/crates/deno_task_shell/src/shell/commands/cat.rs @@ -73,9 +73,9 @@ struct CatFlags { paths: Vec, } -fn parse_args(args: Vec) -> Result { +fn parse_args(mut args: Vec) -> Result { let mut paths = Vec::new(); - for arg in parse_arg_kinds(&args) { + for arg in parse_arg_kinds(&mut args) { match arg { ArgKind::Arg(file_name) => { paths.push(file_name.to_string()); diff --git a/crates/deno_task_shell/src/shell/commands/cd.rs b/crates/deno_task_shell/src/shell/commands/cd.rs index d5c1143..7056cd1 100644 --- a/crates/deno_task_shell/src/shell/commands/cd.rs +++ b/crates/deno_task_shell/src/shell/commands/cd.rs @@ -57,8 +57,8 @@ fn execute_cd(cwd: &Path, args: Vec) -> Result { Ok(new_dir) } -fn parse_args(args: Vec) -> Result { - let args = parse_arg_kinds(&args); +fn parse_args(mut args: Vec) -> Result { + let args = parse_arg_kinds(&mut args); let mut paths = Vec::new(); for arg in args { match arg { diff --git a/crates/deno_task_shell/src/shell/commands/cp_mv.rs b/crates/deno_task_shell/src/shell/commands/cp_mv.rs index 5647cfb..f77b6f6 100644 --- a/crates/deno_task_shell/src/shell/commands/cp_mv.rs +++ b/crates/deno_task_shell/src/shell/commands/cp_mv.rs @@ -133,10 +133,10 @@ struct CpFlags { operations: Vec<(PathWithSpecified, PathWithSpecified)>, } -fn parse_cp_args(cwd: &Path, args: Vec) -> Result { +fn parse_cp_args(cwd: &Path, mut args: Vec) -> Result { let mut paths = Vec::new(); let mut recursive = false; - for arg in parse_arg_kinds(&args) { + for arg in parse_arg_kinds(&mut args) { match arg { ArgKind::Arg(arg) => { paths.push(arg); @@ -211,9 +211,9 @@ struct MvFlags { operations: Vec<(PathWithSpecified, PathWithSpecified)>, } -fn parse_mv_args(cwd: &Path, args: Vec) -> Result { +fn parse_mv_args(cwd: &Path, mut args: Vec) -> Result { let mut paths = Vec::new(); - for arg in parse_arg_kinds(&args) { + for arg in parse_arg_kinds(&mut args) { match arg { ArgKind::Arg(arg) => { paths.push(arg); diff --git a/crates/deno_task_shell/src/shell/commands/exit.rs b/crates/deno_task_shell/src/shell/commands/exit.rs index 5222c61..1cdc191 100644 --- a/crates/deno_task_shell/src/shell/commands/exit.rs +++ b/crates/deno_task_shell/src/shell/commands/exit.rs @@ -40,8 +40,8 @@ fn execute_exit(args: Vec) -> Result { }) } -fn parse_args(args: Vec) -> Result { - let args = parse_arg_kinds(&args); +fn parse_args(mut args: Vec) -> Result { + let args = parse_arg_kinds(&mut args); let mut paths = Vec::new(); for arg in args { match arg { diff --git a/crates/deno_task_shell/src/shell/commands/head.rs b/crates/deno_task_shell/src/shell/commands/head.rs index bef3a46..f1a2015 100644 --- a/crates/deno_task_shell/src/shell/commands/head.rs +++ b/crates/deno_task_shell/src/shell/commands/head.rs @@ -113,10 +113,10 @@ struct HeadFlags { lines: u64, } -fn parse_args(args: Vec) -> Result { +fn parse_args(mut args: Vec) -> Result { let mut path: Option = None; let mut lines: Option = None; - let mut iterator = parse_arg_kinds(&args).into_iter(); + let mut iterator = parse_arg_kinds(&mut args).into_iter(); while let Some(arg) = iterator.next() { match arg { ArgKind::Arg(file_name) => { diff --git a/crates/deno_task_shell/src/shell/commands/mkdir.rs b/crates/deno_task_shell/src/shell/commands/mkdir.rs index 25636ca..02a27a2 100644 --- a/crates/deno_task_shell/src/shell/commands/mkdir.rs +++ b/crates/deno_task_shell/src/shell/commands/mkdir.rs @@ -70,10 +70,10 @@ struct MkdirFlags { paths: Vec, } -fn parse_args(args: Vec) -> Result { +fn parse_args(mut args: Vec) -> Result { let mut result = MkdirFlags::default(); - for arg in parse_arg_kinds(&args) { + for arg in parse_arg_kinds(&mut args) { match arg { ArgKind::LongFlag("parents") | ArgKind::ShortFlag('p') => { result.parents = true; diff --git a/crates/deno_task_shell/src/shell/commands/pwd.rs b/crates/deno_task_shell/src/shell/commands/pwd.rs index 9da211c..86898a7 100644 --- a/crates/deno_task_shell/src/shell/commands/pwd.rs +++ b/crates/deno_task_shell/src/shell/commands/pwd.rs @@ -50,9 +50,9 @@ struct PwdFlags { logical: bool, } -fn parse_args(args: Vec) -> Result { +fn parse_args(mut args: Vec) -> Result { let mut logical = false; - for arg in parse_arg_kinds(&args) { + for arg in parse_arg_kinds(&mut args) { match arg { ArgKind::ShortFlag('L') => { logical = true; diff --git a/crates/deno_task_shell/src/shell/commands/rm.rs b/crates/deno_task_shell/src/shell/commands/rm.rs index 72c1410..76f81c1 100644 --- a/crates/deno_task_shell/src/shell/commands/rm.rs +++ b/crates/deno_task_shell/src/shell/commands/rm.rs @@ -89,10 +89,10 @@ struct RmFlags { paths: Vec, } -fn parse_args(args: Vec) -> Result { +fn parse_args(mut args: Vec) -> Result { let mut result = RmFlags::default(); - for arg in parse_arg_kinds(&args) { + for arg in parse_arg_kinds(&mut args) { match arg { ArgKind::LongFlag("recursive") | ArgKind::ShortFlag('r') @@ -106,7 +106,13 @@ fn parse_args(args: Vec) -> Result { result.force = true; } ArgKind::Arg(path) => { - result.paths.push(path.to_string()); + if path.contains('~') { + let home_dir = dirs::home_dir().unwrap(); + let path = path.replacen("~", home_dir.to_string_lossy().as_ref(), 1); + result.paths.push(path.to_string()); + } else { + result.paths.push(path.to_string()); + } } ArgKind::LongFlag(_) | ArgKind::ShortFlag(_) => arg.bail_unsupported()?, } diff --git a/crates/deno_task_shell/src/shell/commands/sleep.rs b/crates/deno_task_shell/src/shell/commands/sleep.rs index f1e68e6..d87638b 100644 --- a/crates/deno_task_shell/src/shell/commands/sleep.rs +++ b/crates/deno_task_shell/src/shell/commands/sleep.rs @@ -69,11 +69,11 @@ fn parse_arg(arg: &str) -> Result { Ok(arg.parse()?) } -fn parse_args(args: Vec) -> Result { +fn parse_args(mut args: Vec) -> Result { // the time to sleep is the sum of all the arguments let mut total_time_ms = 0; let mut had_value = false; - for arg in parse_arg_kinds(&args) { + for arg in parse_arg_kinds(&mut args) { match arg { ArgKind::Arg(arg) => match parse_arg(arg) { Ok(value_s) => { diff --git a/crates/deno_task_shell/src/shell/commands/xargs.rs b/crates/deno_task_shell/src/shell/commands/xargs.rs index 7ff01e1..85c0e3d 100644 --- a/crates/deno_task_shell/src/shell/commands/xargs.rs +++ b/crates/deno_task_shell/src/shell/commands/xargs.rs @@ -130,7 +130,7 @@ struct XargsFlags { is_null_delimited: bool, } -fn parse_args(args: Vec) -> Result { +fn parse_args(mut args: Vec) -> Result { fn parse_delimiter(arg: &str) -> Result { let mut chars = arg.chars(); if let Some(first_char) = chars.next() { @@ -160,7 +160,7 @@ fn parse_args(args: Vec) -> Result { let mut initial_args = Vec::new(); let mut delimiter = None; - let mut iterator = parse_arg_kinds(&args).into_iter(); + let mut iterator = parse_arg_kinds(&mut args).into_iter(); let mut is_null_delimited = false; while let Some(arg) = iterator.next() { match arg { diff --git a/crates/shell/src/commands.rs b/crates/shell/src/commands.rs index 1467dda..432abcb 100644 --- a/crates/shell/src/commands.rs +++ b/crates/shell/src/commands.rs @@ -16,10 +16,18 @@ impl ShellCommand for LsCommand { fn execute_ls(context: ShellCommandContext) -> ExecuteResult { let mut args: Vec = vec![OsString::from("ls"), OsString::from("--color=auto")]; - context - .args - .iter() - .for_each(|arg| args.push(OsString::from(arg))); + context.args.iter().for_each(|arg| { + let expanded_arg = if arg.contains('~') { + if let Some(home_dir) = dirs::home_dir() { + arg.replace('~', home_dir.to_str().unwrap_or("~")) + } else { + arg.to_string() + } + } else { + arg.to_string() + }; + args.push(OsString::from(expanded_arg)); + }); let exit_code = uu_ls(args.into_iter()); ExecuteResult::from_exit_code(exit_code) From 5ebfdde87763279a98412a14c2e49ff2e36b96f9 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Fri, 6 Sep 2024 19:30:50 -0400 Subject: [PATCH 06/10] Small fix --- crates/deno_task_shell/src/shell/commands/args.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/deno_task_shell/src/shell/commands/args.rs b/crates/deno_task_shell/src/shell/commands/args.rs index 7422a01..ae6da9e 100644 --- a/crates/deno_task_shell/src/shell/commands/args.rs +++ b/crates/deno_task_shell/src/shell/commands/args.rs @@ -41,7 +41,7 @@ pub fn parse_arg_kinds(flags: &mut [String]) -> Vec { } else if arg == "--" { had_dash_dash = true; } else if arg.starts_with("--") { - result.push(ArgKind::LongFlag(&arg.strip_prefix("--").unwrap())); + result.push(ArgKind::LongFlag(arg.strip_prefix("--").unwrap())); } else if arg.starts_with('-') { if arg.parse::().is_ok() { result.push(ArgKind::Arg(arg)); From 8d61daad011092a97cb9c8ceb35b21e4448fb72b Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Fri, 6 Sep 2024 19:33:18 -0400 Subject: [PATCH 07/10] Revert modifications to cd and rm --- crates/deno_task_shell/src/shell/commands/cd.rs | 8 +------- crates/deno_task_shell/src/shell/commands/rm.rs | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/crates/deno_task_shell/src/shell/commands/cd.rs b/crates/deno_task_shell/src/shell/commands/cd.rs index 7056cd1..5f680c0 100644 --- a/crates/deno_task_shell/src/shell/commands/cd.rs +++ b/crates/deno_task_shell/src/shell/commands/cd.rs @@ -63,13 +63,7 @@ fn parse_args(mut args: Vec) -> Result { for arg in args { match arg { ArgKind::Arg(arg) => { - if arg.contains('~') { - let home_dir = dirs::home_dir().unwrap(); - let arg = arg.replacen("~", home_dir.to_string_lossy().as_ref(), 1); - paths.push(arg); - } else { - paths.push(arg.to_string()); - } + paths.push(arg); } _ => arg.bail_unsupported()?, } diff --git a/crates/deno_task_shell/src/shell/commands/rm.rs b/crates/deno_task_shell/src/shell/commands/rm.rs index 76f81c1..fa2dbfc 100644 --- a/crates/deno_task_shell/src/shell/commands/rm.rs +++ b/crates/deno_task_shell/src/shell/commands/rm.rs @@ -106,13 +106,7 @@ fn parse_args(mut args: Vec) -> Result { result.force = true; } ArgKind::Arg(path) => { - if path.contains('~') { - let home_dir = dirs::home_dir().unwrap(); - let path = path.replacen("~", home_dir.to_string_lossy().as_ref(), 1); - result.paths.push(path.to_string()); - } else { - result.paths.push(path.to_string()); - } + result.paths.push(path.to_string()); } ArgKind::LongFlag(_) | ArgKind::ShortFlag(_) => arg.bail_unsupported()?, } From cece28fde7204a344f14b1fbfdde1ab047455f16 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Fri, 6 Sep 2024 19:35:24 -0400 Subject: [PATCH 08/10] Updated comment --- crates/deno_task_shell/src/shell/commands/cd.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/deno_task_shell/src/shell/commands/cd.rs b/crates/deno_task_shell/src/shell/commands/cd.rs index 5f680c0..371df97 100644 --- a/crates/deno_task_shell/src/shell/commands/cd.rs +++ b/crates/deno_task_shell/src/shell/commands/cd.rs @@ -41,7 +41,7 @@ fn execute_cd(cwd: &Path, args: Vec) -> Result { // create a new vector to avoid modifying the original let mut args = args; if args.is_empty() { - // append '~' to args + // append `~` to args args.push("~".to_string()); } let path = parse_args(args.clone())?; From c26927f1084f7618ab71ec33b3974b820bc3a9e2 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Sat, 7 Sep 2024 14:00:48 -0400 Subject: [PATCH 09/10] Updated return type for parse_arg_kinds --- .../src/shell/commands/args.rs | 22 ++++++++++--------- .../deno_task_shell/src/shell/commands/cat.rs | 2 +- .../deno_task_shell/src/shell/commands/cd.rs | 2 +- .../src/shell/commands/cp_mv.rs | 4 ++-- .../src/shell/commands/exit.rs | 2 +- .../src/shell/commands/head.rs | 2 +- .../src/shell/commands/mkdir.rs | 2 +- .../deno_task_shell/src/shell/commands/pwd.rs | 2 +- .../deno_task_shell/src/shell/commands/rm.rs | 2 +- .../src/shell/commands/sleep.rs | 2 +- .../src/shell/commands/xargs.rs | 2 +- 11 files changed, 23 insertions(+), 21 deletions(-) diff --git a/crates/deno_task_shell/src/shell/commands/args.rs b/crates/deno_task_shell/src/shell/commands/args.rs index ae6da9e..e429d07 100644 --- a/crates/deno_task_shell/src/shell/commands/args.rs +++ b/crates/deno_task_shell/src/shell/commands/args.rs @@ -1,7 +1,6 @@ // Copyright 2018-2024 the Deno authors. MIT license. -use anyhow::bail; -use anyhow::Result; +use anyhow::{bail, Context}; #[derive(Debug, PartialEq, Eq)] pub enum ArgKind<'a> { @@ -11,7 +10,7 @@ pub enum ArgKind<'a> { } impl<'a> ArgKind<'a> { - pub fn bail_unsupported(&self) -> Result<()> { + pub fn bail_unsupported(&self) -> anyhow::Result<()> { match self { ArgKind::Arg(arg) => { bail!("unsupported argument: {}", arg) @@ -26,15 +25,17 @@ impl<'a> ArgKind<'a> { } } -pub fn parse_arg_kinds(flags: &mut [String]) -> Vec { +pub fn parse_arg_kinds(flags: &mut [String]) -> Result, anyhow::Error> { let mut result = Vec::new(); let mut had_dash_dash = false; - let home_dir = dirs::home_dir().unwrap(); - let home_dir = home_dir.to_str().unwrap(); + let home_str = dirs::home_dir() + .context("Couldn't get home directory")? + .to_string_lossy() + .into_owned(); for arg in flags.iter_mut() { if had_dash_dash { let arg_clone = arg.clone(); - arg.replace_range(.., &arg_clone.replace('~', home_dir)); + arg.replace_range(.., &arg_clone.replace('~', &home_str)); result.push(ArgKind::Arg(arg)); } else if arg == "-" { result.push(ArgKind::Arg("-")); @@ -52,11 +53,11 @@ pub fn parse_arg_kinds(flags: &mut [String]) -> Vec { } } else { let arg_clone = arg.clone(); - arg.replace_range(.., &arg_clone.replace('~', home_dir)); + arg.replace_range(.., &arg_clone.replace('~', &home_str)); result.push(ArgKind::Arg(arg)); } } - result + Ok(result) } #[cfg(test)] @@ -79,8 +80,9 @@ mod test { "-t".to_string(), ]; let args = parse_arg_kinds(&mut data); + assert!(args.is_ok()); assert_eq!( - args, + args.unwrap(), vec![ ArgKind::ShortFlag('f'), ArgKind::ShortFlag('a'), diff --git a/crates/deno_task_shell/src/shell/commands/cat.rs b/crates/deno_task_shell/src/shell/commands/cat.rs index 395c5d1..ce29669 100644 --- a/crates/deno_task_shell/src/shell/commands/cat.rs +++ b/crates/deno_task_shell/src/shell/commands/cat.rs @@ -75,7 +75,7 @@ struct CatFlags { fn parse_args(mut args: Vec) -> Result { let mut paths = Vec::new(); - for arg in parse_arg_kinds(&mut args) { + for arg in parse_arg_kinds(&mut args)? { match arg { ArgKind::Arg(file_name) => { paths.push(file_name.to_string()); diff --git a/crates/deno_task_shell/src/shell/commands/cd.rs b/crates/deno_task_shell/src/shell/commands/cd.rs index 371df97..fcf9af4 100644 --- a/crates/deno_task_shell/src/shell/commands/cd.rs +++ b/crates/deno_task_shell/src/shell/commands/cd.rs @@ -58,7 +58,7 @@ fn execute_cd(cwd: &Path, args: Vec) -> Result { } fn parse_args(mut args: Vec) -> Result { - let args = parse_arg_kinds(&mut args); + let args = parse_arg_kinds(&mut args)?; let mut paths = Vec::new(); for arg in args { match arg { diff --git a/crates/deno_task_shell/src/shell/commands/cp_mv.rs b/crates/deno_task_shell/src/shell/commands/cp_mv.rs index f77b6f6..b1c1b01 100644 --- a/crates/deno_task_shell/src/shell/commands/cp_mv.rs +++ b/crates/deno_task_shell/src/shell/commands/cp_mv.rs @@ -136,7 +136,7 @@ struct CpFlags { fn parse_cp_args(cwd: &Path, mut args: Vec) -> Result { let mut paths = Vec::new(); let mut recursive = false; - for arg in parse_arg_kinds(&mut args) { + for arg in parse_arg_kinds(&mut args)? { match arg { ArgKind::Arg(arg) => { paths.push(arg); @@ -213,7 +213,7 @@ struct MvFlags { fn parse_mv_args(cwd: &Path, mut args: Vec) -> Result { let mut paths = Vec::new(); - for arg in parse_arg_kinds(&mut args) { + for arg in parse_arg_kinds(&mut args)? { match arg { ArgKind::Arg(arg) => { paths.push(arg); diff --git a/crates/deno_task_shell/src/shell/commands/exit.rs b/crates/deno_task_shell/src/shell/commands/exit.rs index 1cdc191..7f87871 100644 --- a/crates/deno_task_shell/src/shell/commands/exit.rs +++ b/crates/deno_task_shell/src/shell/commands/exit.rs @@ -41,7 +41,7 @@ fn execute_exit(args: Vec) -> Result { } fn parse_args(mut args: Vec) -> Result { - let args = parse_arg_kinds(&mut args); + let args = parse_arg_kinds(&mut args)?; let mut paths = Vec::new(); for arg in args { match arg { diff --git a/crates/deno_task_shell/src/shell/commands/head.rs b/crates/deno_task_shell/src/shell/commands/head.rs index f1a2015..9ebf3da 100644 --- a/crates/deno_task_shell/src/shell/commands/head.rs +++ b/crates/deno_task_shell/src/shell/commands/head.rs @@ -116,7 +116,7 @@ struct HeadFlags { fn parse_args(mut args: Vec) -> Result { let mut path: Option = None; let mut lines: Option = None; - let mut iterator = parse_arg_kinds(&mut args).into_iter(); + let mut iterator = parse_arg_kinds(&mut args)?.into_iter(); while let Some(arg) = iterator.next() { match arg { ArgKind::Arg(file_name) => { diff --git a/crates/deno_task_shell/src/shell/commands/mkdir.rs b/crates/deno_task_shell/src/shell/commands/mkdir.rs index 02a27a2..b074fc9 100644 --- a/crates/deno_task_shell/src/shell/commands/mkdir.rs +++ b/crates/deno_task_shell/src/shell/commands/mkdir.rs @@ -73,7 +73,7 @@ struct MkdirFlags { fn parse_args(mut args: Vec) -> Result { let mut result = MkdirFlags::default(); - for arg in parse_arg_kinds(&mut args) { + for arg in parse_arg_kinds(&mut args)? { match arg { ArgKind::LongFlag("parents") | ArgKind::ShortFlag('p') => { result.parents = true; diff --git a/crates/deno_task_shell/src/shell/commands/pwd.rs b/crates/deno_task_shell/src/shell/commands/pwd.rs index 86898a7..c93dbc1 100644 --- a/crates/deno_task_shell/src/shell/commands/pwd.rs +++ b/crates/deno_task_shell/src/shell/commands/pwd.rs @@ -52,7 +52,7 @@ struct PwdFlags { fn parse_args(mut args: Vec) -> Result { let mut logical = false; - for arg in parse_arg_kinds(&mut args) { + for arg in parse_arg_kinds(&mut args)? { match arg { ArgKind::ShortFlag('L') => { logical = true; diff --git a/crates/deno_task_shell/src/shell/commands/rm.rs b/crates/deno_task_shell/src/shell/commands/rm.rs index fa2dbfc..ed85fea 100644 --- a/crates/deno_task_shell/src/shell/commands/rm.rs +++ b/crates/deno_task_shell/src/shell/commands/rm.rs @@ -92,7 +92,7 @@ struct RmFlags { fn parse_args(mut args: Vec) -> Result { let mut result = RmFlags::default(); - for arg in parse_arg_kinds(&mut args) { + for arg in parse_arg_kinds(&mut args)? { match arg { ArgKind::LongFlag("recursive") | ArgKind::ShortFlag('r') diff --git a/crates/deno_task_shell/src/shell/commands/sleep.rs b/crates/deno_task_shell/src/shell/commands/sleep.rs index d87638b..89da117 100644 --- a/crates/deno_task_shell/src/shell/commands/sleep.rs +++ b/crates/deno_task_shell/src/shell/commands/sleep.rs @@ -73,7 +73,7 @@ fn parse_args(mut args: Vec) -> Result { // the time to sleep is the sum of all the arguments let mut total_time_ms = 0; let mut had_value = false; - for arg in parse_arg_kinds(&mut args) { + for arg in parse_arg_kinds(&mut args)? { match arg { ArgKind::Arg(arg) => match parse_arg(arg) { Ok(value_s) => { diff --git a/crates/deno_task_shell/src/shell/commands/xargs.rs b/crates/deno_task_shell/src/shell/commands/xargs.rs index 85c0e3d..9839f6d 100644 --- a/crates/deno_task_shell/src/shell/commands/xargs.rs +++ b/crates/deno_task_shell/src/shell/commands/xargs.rs @@ -160,7 +160,7 @@ fn parse_args(mut args: Vec) -> Result { let mut initial_args = Vec::new(); let mut delimiter = None; - let mut iterator = parse_arg_kinds(&mut args).into_iter(); + let mut iterator = parse_arg_kinds(&mut args)?.into_iter(); let mut is_null_delimited = false; while let Some(arg) = iterator.next() { match arg { From 90cfa2f40fa9ac99dc005a3dcba4c4d6d829b236 Mon Sep 17 00:00:00 2001 From: prsabahrami Date: Sat, 7 Sep 2024 14:01:57 -0400 Subject: [PATCH 10/10] Minor fix --- crates/deno_task_shell/src/shell/commands/args.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/deno_task_shell/src/shell/commands/args.rs b/crates/deno_task_shell/src/shell/commands/args.rs index e429d07..bc687ef 100644 --- a/crates/deno_task_shell/src/shell/commands/args.rs +++ b/crates/deno_task_shell/src/shell/commands/args.rs @@ -1,6 +1,6 @@ // Copyright 2018-2024 the Deno authors. MIT license. -use anyhow::{bail, Context}; +use anyhow::{bail, Context, Result}; #[derive(Debug, PartialEq, Eq)] pub enum ArgKind<'a> { @@ -25,7 +25,9 @@ impl<'a> ArgKind<'a> { } } -pub fn parse_arg_kinds(flags: &mut [String]) -> Result, anyhow::Error> { +pub fn parse_arg_kinds( + flags: &mut [String], +) -> Result, anyhow::Error> { let mut result = Vec::new(); let mut had_dash_dash = false; let home_str = dirs::home_dir()