From c5268a897e9617d95676e66670804a131b415fec Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 23 Jul 2025 13:53:34 +0200 Subject: [PATCH] basename: handle a corner case with /. - Closes #8373 --- src/uu/basename/src/basename.rs | 5 +++++ tests/by-util/test_basename.rs | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/uu/basename/src/basename.rs b/src/uu/basename/src/basename.rs index fd292f4edd8..dd53522c5b8 100644 --- a/src/uu/basename/src/basename.rs +++ b/src/uu/basename/src/basename.rs @@ -119,6 +119,11 @@ pub fn uu_app() -> Command { } fn basename(fullname: &str, suffix: &str) -> String { + // Handle special case where path ends with /. + if fullname.ends_with("/.") { + return ".".to_string(); + } + // Convert to path buffer and get last path component let pb = PathBuf::from(fullname); diff --git a/tests/by-util/test_basename.rs b/tests/by-util/test_basename.rs index 957ef8cb45a..7a18d3ee14f 100644 --- a/tests/by-util/test_basename.rs +++ b/tests/by-util/test_basename.rs @@ -183,6 +183,13 @@ fn test_triple_slash() { new_ucmd!().arg("///").succeeds().stdout_is(expected); } +#[test] +fn test_trailing_dot() { + new_ucmd!().arg("/.").succeeds().stdout_is(".\n"); + new_ucmd!().arg("hello/.").succeeds().stdout_is(".\n"); + new_ucmd!().arg("/foo/bar/.").succeeds().stdout_is(".\n"); +} + #[test] fn test_simple_format() { new_ucmd!().args(&["a-a", "-a"]).succeeds().stdout_is("a\n");