From f774940451ee21ae35828dd828691b669d4d6471 Mon Sep 17 00:00:00 2001 From: "Guillem L. Jara" <4lon3ly0@tutanota.com> Date: Fri, 1 May 2026 12:38:59 +0200 Subject: [PATCH] fix(ls): place dot dirs on top in version sorting Also fixes the fact that version sorting had incorrect edge cases due to wrong name passing. --- src/uu/ls/src/ls.rs | 13 +++++++++++-- tests/by-util/test_ls.rs | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 5b33079e3..470c5bcbd 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -979,6 +979,15 @@ impl<'a> PathData<'a> { PathDataDisplayName::Custom(ref cow) => cow, } } + + fn file_name(&self) -> &OsStr { + match self.display_name { + PathDataDisplayName::SelfReferential => { + self.p_buf.file_name().unwrap_or(self.p_buf.as_os_str()) + } + PathDataDisplayName::Custom(ref cow) => cow, + } + } } impl Colorable for PathData<'_> { @@ -1477,8 +1486,8 @@ fn sort_entries(entries: &mut [PathData], config: &Config) { Sort::Name => entries.sort_unstable_by(|a, b| a.display_name().cmp(b.display_name())), Sort::Version => entries.sort_unstable_by(|a, b| { version_cmp( - os_str_as_bytes_lossy(a.path().as_os_str()).as_ref(), - os_str_as_bytes_lossy(b.path().as_os_str()).as_ref(), + os_str_as_bytes_lossy(a.file_name()).as_ref(), + os_str_as_bytes_lossy(b.file_name()).as_ref(), ) .then(a.path().cmp(b.path())) }), diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index 52191c0c9..81edec8d8 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -3661,7 +3661,7 @@ fn test_ls_version_sort() { ); let result = scene.ucmd().arg("-a1v").succeeds(); - expected.insert(expected.len() - 1, ".."); + expected.insert(0, ".."); expected.insert(0, "."); assert_eq!( result.stdout_str().split('\n').collect::>(),