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()