summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/args.rs9
-rw-r--r--src/unescape.rs9
2 files changed, 16 insertions, 2 deletions
diff --git a/src/args.rs b/src/args.rs
index 302e330e..7100fc5c 100644
--- a/src/args.rs
+++ b/src/args.rs
@@ -22,7 +22,7 @@ use ignore::overrides::{Override, OverrideBuilder};
use ignore::types::{FileTypeDef, Types, TypesBuilder};
use ignore;
use printer::{ColorSpecs, Printer};
-use unescape::unescape;
+use unescape::{escape, unescape};
use worker::{Worker, WorkerBuilder};
use config;
@@ -749,7 +749,12 @@ impl<'a> ArgMatches<'a> {
} else if sep.len() > 1 {
Err(From::from(format!(
"A path separator must be exactly one byte, but \
- the given separator is {} bytes.", sep.len())))
+ the given separator is {} bytes: {}\n\
+ In some shells on Windows '/' is automatically \
+ expanded. Use '//' instead.",
+ sep.len(),
+ escape(&sep),
+ )))
} else {
Ok(Some(sep[0]))
}
diff --git a/src/unescape.rs b/src/unescape.rs
index c27e6e28..0c7f1c8d 100644
--- a/src/unescape.rs
+++ b/src/unescape.rs
@@ -11,6 +11,15 @@ enum State {
Literal,
}
+/// Escapes an arbitrary byte slice such that it can be presented as a human
+/// readable string.
+pub fn escape(bytes: &[u8]) -> String {
+ use std::ascii::escape_default;
+
+ let escaped = bytes.iter().flat_map(|&b| escape_default(b)).collect();
+ String::from_utf8(escaped).unwrap()
+}
+
/// Unescapes a string given on the command line. It supports a limited set of
/// escape sequences:
///