Skip to content

Commit

Permalink
Enable shellwords for Windows (with escaping disabled) (#2767)
Browse files Browse the repository at this point in the history
  • Loading branch information
ath3 authored Jun 21, 2022
1 parent 8b67acf commit ce85b97
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 18 deletions.
52 changes: 43 additions & 9 deletions helix-core/src/shellwords.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,13 @@ pub fn shellwords(input: &str) -> Vec<Cow<'_, str>> {
state = match state {
Normal => match c {
'\\' => {
escaped.push_str(&input[start..i]);
start = i + 1;
NormalEscaped
if cfg!(unix) {
escaped.push_str(&input[start..i]);
start = i + 1;
NormalEscaped
} else {
Normal
}
}
'"' => {
end = i;
Expand All @@ -45,9 +49,13 @@ pub fn shellwords(input: &str) -> Vec<Cow<'_, str>> {
NormalEscaped => Normal,
Quoted => match c {
'\\' => {
escaped.push_str(&input[start..i]);
start = i + 1;
QuoteEscaped
if cfg!(unix) {
escaped.push_str(&input[start..i]);
start = i + 1;
QuoteEscaped
} else {
Quoted
}
}
'\'' => {
end = i;
Expand All @@ -58,9 +66,13 @@ pub fn shellwords(input: &str) -> Vec<Cow<'_, str>> {
QuoteEscaped => Quoted,
Dquoted => match c {
'\\' => {
escaped.push_str(&input[start..i]);
start = i + 1;
DquoteEscaped
if cfg!(unix) {
escaped.push_str(&input[start..i]);
start = i + 1;
DquoteEscaped
} else {
Dquoted
}
}
'"' => {
end = i;
Expand Down Expand Up @@ -99,6 +111,25 @@ mod test {
use super::*;

#[test]
#[cfg(windows)]
fn test_normal() {
let input = r#":o single_word twó wörds \three\ \"with\ escaping\\"#;
let result = shellwords(input);
let expected = vec![
Cow::from(":o"),
Cow::from("single_word"),
Cow::from("twó"),
Cow::from("wörds"),
Cow::from("\\three\\"),
Cow::from("\\"),
Cow::from("with\\ escaping\\\\"),
];
// TODO test is_owned and is_borrowed, once they get stabilized.
assert_eq!(expected, result);
}

#[test]
#[cfg(unix)]
fn test_normal() {
let input = r#":o single_word twó wörds \three\ \"with\ escaping\\"#;
let result = shellwords(input);
Expand All @@ -114,6 +145,7 @@ mod test {
}

#[test]
#[cfg(unix)]
fn test_quoted() {
let quoted =
r#":o 'single_word' 'twó wörds' '' ' ''\three\' \"with\ escaping\\' 'quote incomplete"#;
Expand All @@ -129,6 +161,7 @@ mod test {
}

#[test]
#[cfg(unix)]
fn test_dquoted() {
let dquoted = r#":o "single_word" "twó wörds" "" " ""\three\' \"with\ escaping\\" "dquote incomplete"#;
let result = shellwords(dquoted);
Expand All @@ -143,6 +176,7 @@ mod test {
}

#[test]
#[cfg(unix)]
fn test_mixed() {
let dquoted = r#":o single_word 'twó wörds' "\three\' \"with\ escaping\\""no space before"'and after' $#%^@ "%^&(%^" ')(*&^%''a\\\\\b' '"#;
let result = shellwords(dquoted);
Expand Down
10 changes: 1 addition & 9 deletions helix-term/src/commands/typed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1802,15 +1802,7 @@ pub fn command_mode(cx: &mut Context) {

// Handle typable commands
if let Some(cmd) = typed::TYPABLE_COMMAND_MAP.get(parts[0]) {
let args = if cfg!(unix) {
shellwords::shellwords(input)
} else {
// Windows doesn't support POSIX, so fallback for now
parts
.into_iter()
.map(|part| part.into())
.collect::<Vec<_>>()
};
let args = shellwords::shellwords(input);

if let Err(e) = (cmd.fun)(cx, &args[1..], event) {
cx.editor.set_error(format!("{}", e));
Expand Down

0 comments on commit ce85b97

Please sign in to comment.