--- a/rust/hg-core/src/utils.rs Wed Feb 17 13:00:25 2021 +0100
+++ b/rust/hg-core/src/utils.rs Tue Feb 16 13:08:37 2021 +0100
@@ -188,6 +188,35 @@
}
}
+#[cfg(unix)]
+pub fn shell_quote(value: &[u8]) -> Vec<u8> {
+ // TODO: Use the `matches!` macro when we require Rust 1.42+
+ if value.iter().all(|&byte| match byte {
+ b'a'..=b'z'
+ | b'A'..=b'Z'
+ | b'0'..=b'9'
+ | b'.'
+ | b'_'
+ | b'/'
+ | b'+'
+ | b'-' => true,
+ _ => false,
+ }) {
+ value.to_owned()
+ } else {
+ let mut quoted = Vec::with_capacity(value.len() + 2);
+ quoted.push(b'\'');
+ for &byte in value {
+ if byte == b'\'' {
+ quoted.push(b'\\');
+ }
+ quoted.push(byte);
+ }
+ quoted.push(b'\'');
+ quoted
+ }
+}
+
pub fn current_dir() -> Result<std::path::PathBuf, HgError> {
std::env::current_dir().map_err(|error| HgError::IoError {
error,