mirror of
https://github.com/nushell/nushell
synced 2025-01-27 12:25:19 +00:00
Remove bash_strip_extra_quotes() and cmd_remove_all_double_quotes()
This commit is contained in:
parent
1b77830a39
commit
eb0509634f
2 changed files with 13 additions and 129 deletions
|
@ -794,12 +794,12 @@ fn is_dir(path: &Path) -> bool {
|
||||||
}
|
}
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
{
|
{
|
||||||
path.is_dir() ||
|
path.is_dir()
|
||||||
if let Some(path_str) = path.to_str() {
|
|| if let Some(path_str) = path.to_str() {
|
||||||
DRIVE_PATH_REGEX.is_match(path_str).unwrap_or(false)
|
DRIVE_PATH_REGEX.is_match(path_str).unwrap_or(false)
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,20 +77,15 @@ pub mod os_windows {
|
||||||
engine_state: &EngineState,
|
engine_state: &EngineState,
|
||||||
path: &Path,
|
path: &Path,
|
||||||
) -> Option<PathBuf> {
|
) -> Option<PathBuf> {
|
||||||
use implementation::{bash_strip_redundant_quotes, get_pwd_on_drive, need_expand};
|
use implementation::{get_pwd_on_drive, need_expand};
|
||||||
|
|
||||||
if let Some(path_str) = path.to_str() {
|
if let Some(path_str) = path.to_str() {
|
||||||
if let Some(path_string) = bash_strip_redundant_quotes(path_str) {
|
if let Some(drive_letter) = need_expand(path_str) {
|
||||||
if let Some(drive_letter) = need_expand(&path_string) {
|
let mut base =
|
||||||
let mut base =
|
PathBuf::from(get_pwd_on_drive(stack, engine_state, drive_letter));
|
||||||
PathBuf::from(get_pwd_on_drive(stack, engine_state, drive_letter));
|
// need_expand() ensures path_str.len() >= 2
|
||||||
// need_expand() ensures path_string.len() >= 2
|
base.push(&path_str[2..]); // Join PWD with path parts after "C:"
|
||||||
base.push(&path_string[2..]); // Join PWD with path parts after "C:"
|
return Some(base);
|
||||||
return Some(base);
|
|
||||||
}
|
|
||||||
if path_string != path_str {
|
|
||||||
return Some(PathBuf::from(&path_string));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
|
@ -171,64 +166,6 @@ pub mod os_windows {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove redundant quotes as preprocessor for path
|
|
||||||
/// #"D:\\"''M''u's 'ic# -> #D:\\Mu's 'ic#
|
|
||||||
/// if encounter a quote, and there's matching quote, if there's no
|
|
||||||
/// space between the two quotes, then both quote will be removed,
|
|
||||||
/// and so on. if a quote has no matching quote, the whole string
|
|
||||||
/// will not be altered
|
|
||||||
pub fn bash_strip_redundant_quotes(input: &str) -> Option<String> {
|
|
||||||
let mut result = String::new();
|
|
||||||
let mut i = 0;
|
|
||||||
let chars: Vec<char> = input.chars().collect();
|
|
||||||
|
|
||||||
let mut no_quote_start_pos = 0;
|
|
||||||
while i < chars.len() {
|
|
||||||
if chars[i] == '"' || chars[i] == '\'' {
|
|
||||||
let quote = chars[i];
|
|
||||||
// push content before quote
|
|
||||||
result.push_str(&input[no_quote_start_pos..i]);
|
|
||||||
|
|
||||||
let mut j = i + 1;
|
|
||||||
let mut has_space = false;
|
|
||||||
|
|
||||||
// Look for the matching quote
|
|
||||||
while j < chars.len() && chars[j] != quote {
|
|
||||||
has_space = has_space || chars[j].is_whitespace();
|
|
||||||
j += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if the matching quote exists
|
|
||||||
if j < chars.len() && chars[j] == quote {
|
|
||||||
// Push quote and content or only content
|
|
||||||
if has_space {
|
|
||||||
result.push_str(&input[i..=j]);
|
|
||||||
} else {
|
|
||||||
result.push_str(&input[i + 1..j]);
|
|
||||||
}
|
|
||||||
i = j + 1; // Past the closing quote
|
|
||||||
no_quote_start_pos = i;
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
return None; // No matching quote found
|
|
||||||
}
|
|
||||||
}
|
|
||||||
i += 1; // advance not in quote content
|
|
||||||
}
|
|
||||||
|
|
||||||
result.push_str(&input[no_quote_start_pos..i]);
|
|
||||||
Some(result)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// cmd_strip_all_double_quotes
|
|
||||||
/// assert_eq!("t t", cmd_strip_all_double_quotes("t\" \"t\"\""));
|
|
||||||
/// Currently not used, for CMD compatible usage in the future
|
|
||||||
/// Mark as test only to avoid clippy warning of dead code.
|
|
||||||
#[cfg(test)]
|
|
||||||
pub fn cmd_strip_all_double_quotes(input: &str) -> String {
|
|
||||||
input.replace("\"", "")
|
|
||||||
}
|
|
||||||
|
|
||||||
/// get_full_path_name_w
|
/// get_full_path_name_w
|
||||||
/// Call windows system API (via omnipath crate) to expand
|
/// Call windows system API (via omnipath crate) to expand
|
||||||
/// absolute path
|
/// absolute path
|
||||||
|
@ -387,59 +324,6 @@ mod tests {
|
||||||
assert_eq!(ensure_trailing_delimiter("c:/"), "c:/");
|
assert_eq!(ensure_trailing_delimiter("c:/"), "c:/");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_os_windows_implementation_bash_strip_redundant_quotes() {
|
|
||||||
use os_windows::implementation::bash_strip_redundant_quotes;
|
|
||||||
|
|
||||||
let input = r#""D:\Music""#;
|
|
||||||
let result = Some(r"D:\Music".to_string());
|
|
||||||
assert_eq!(result, bash_strip_redundant_quotes(input));
|
|
||||||
|
|
||||||
let input = r#"""""D:\Music"""""#;
|
|
||||||
assert_eq!(result, bash_strip_redundant_quotes(input));
|
|
||||||
|
|
||||||
let input = r#""D:\Mus"ic"#;
|
|
||||||
assert_eq!(result, bash_strip_redundant_quotes(input));
|
|
||||||
let input = r#""D:"\Music"#;
|
|
||||||
assert_eq!(result, bash_strip_redundant_quotes(input));
|
|
||||||
|
|
||||||
let input = r#""D":\Music"#;
|
|
||||||
assert_eq!(result, bash_strip_redundant_quotes(input));
|
|
||||||
|
|
||||||
let input = r#"""D:\Music"#;
|
|
||||||
assert_eq!(result, bash_strip_redundant_quotes(input));
|
|
||||||
|
|
||||||
let input = r#"""''"""D:\Mu sic"""''"""#;
|
|
||||||
let result = Some(r#""D:\Mu sic""#.to_string());
|
|
||||||
assert_eq!(result, bash_strip_redundant_quotes(input));
|
|
||||||
|
|
||||||
assert_eq!(bash_strip_redundant_quotes(""), Some("".to_string()));
|
|
||||||
assert_eq!(bash_strip_redundant_quotes("''"), Some("".to_string()));
|
|
||||||
assert_eq!(bash_strip_redundant_quotes("'''"), None);
|
|
||||||
assert_eq!(bash_strip_redundant_quotes("'''M'"), Some("M".to_string()));
|
|
||||||
assert_eq!(
|
|
||||||
bash_strip_redundant_quotes("'''M '"),
|
|
||||||
Some("'M '".to_string())
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
bash_strip_redundant_quotes(r#"""''"""D:\Mu sic"""''"""#),
|
|
||||||
Some(r#""D:\Mu sic""#.to_string())
|
|
||||||
);
|
|
||||||
|
|
||||||
let input = "~";
|
|
||||||
assert_eq!(Some(input.to_string()), bash_strip_redundant_quotes(input));
|
|
||||||
|
|
||||||
let input = "~/.config";
|
|
||||||
assert_eq!(Some(input.to_string()), bash_strip_redundant_quotes(input));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_os_windows_implementation_cmd_strip_all_double_quotes() {
|
|
||||||
use os_windows::implementation::cmd_strip_all_double_quotes;
|
|
||||||
|
|
||||||
assert_eq!("t t", cmd_strip_all_double_quotes("t\" \"t\"\""));
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_os_windows_implementation_get_full_path_name_w() {
|
fn test_os_windows_implementation_get_full_path_name_w() {
|
||||||
use os_windows::implementation::get_full_path_name_w;
|
use os_windows::implementation::get_full_path_name_w;
|
||||||
|
|
Loading…
Reference in a new issue