mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 19:47:45 +00:00
ls: encode path when using --hyperlink
This commit is contained in:
parent
181cfc885b
commit
89cb4acb99
2 changed files with 49 additions and 1 deletions
|
@ -3019,7 +3019,23 @@ fn display_file_name(
|
||||||
let absolute_path = fs::canonicalize(&path.p_buf).unwrap_or_default();
|
let absolute_path = fs::canonicalize(&path.p_buf).unwrap_or_default();
|
||||||
let absolute_path = absolute_path.to_string_lossy();
|
let absolute_path = absolute_path.to_string_lossy();
|
||||||
|
|
||||||
// TODO encode path
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
let unencoded_chars = "_-.:~/";
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
let unencoded_chars = "_-.:~/\\";
|
||||||
|
|
||||||
|
// percentage encoding of path
|
||||||
|
let absolute_path: String = absolute_path
|
||||||
|
.chars()
|
||||||
|
.map(|c| {
|
||||||
|
if c.is_alphanumeric() || unencoded_chars.contains(c) {
|
||||||
|
c.to_string()
|
||||||
|
} else {
|
||||||
|
format!("%{:02x}", c as u8)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
// \x1b = ESC, \x07 = BEL
|
// \x1b = ESC, \x07 = BEL
|
||||||
name = format!("\x1b]8;;file://{hostname}{absolute_path}\x07{name}\x1b]8;;\x07");
|
name = format!("\x1b]8;;file://{hostname}{absolute_path}\x07{name}\x1b]8;;\x07");
|
||||||
}
|
}
|
||||||
|
|
|
@ -3904,6 +3904,38 @@ fn test_ls_hyperlink() {
|
||||||
.stdout_is(format!("{file}\n"));
|
.stdout_is(format!("{file}\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// spell-checker: disable
|
||||||
|
#[test]
|
||||||
|
fn test_ls_hyperlink_encode_link() {
|
||||||
|
let (at, mut ucmd) = at_and_ucmd!();
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
{
|
||||||
|
at.touch("back\\slash");
|
||||||
|
at.touch("ques?tion");
|
||||||
|
}
|
||||||
|
at.touch("encoded%3Fquestion");
|
||||||
|
at.touch("sp ace");
|
||||||
|
|
||||||
|
let result = ucmd.arg("--hyperlink").succeeds();
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
{
|
||||||
|
assert!(result
|
||||||
|
.stdout_str()
|
||||||
|
.contains("back%5cslash\x07back\\slash\x1b]8;;\x07"));
|
||||||
|
assert!(result
|
||||||
|
.stdout_str()
|
||||||
|
.contains("ques%3ftion\x07ques?tion\x1b]8;;\x07"));
|
||||||
|
}
|
||||||
|
assert!(result
|
||||||
|
.stdout_str()
|
||||||
|
.contains("encoded%253Fquestion\x07encoded%3Fquestion\x1b]8;;\x07"));
|
||||||
|
assert!(result
|
||||||
|
.stdout_str()
|
||||||
|
.contains("sp%20ace\x07sp ace\x1b]8;;\x07"));
|
||||||
|
}
|
||||||
|
// spell-checker: enable
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ls_color_do_not_reset() {
|
fn test_ls_color_do_not_reset() {
|
||||||
let scene: TestScenario = TestScenario::new(util_name!());
|
let scene: TestScenario = TestScenario::new(util_name!());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue