From df6adada9c12d5274989719e24e57a68b9eb17b1 Mon Sep 17 00:00:00 2001 From: Ricardo Iglesias Date: Sat, 24 Apr 2021 17:14:52 -0700 Subject: [PATCH 1/4] ls: ignore leading period when sorting by name ls now behaves like GNU ls with respect to sorting files by ignoring leading periods when sorting by main. Added tests to ensure "touch a .a b .b ; ls" returns ".a a .b b" --- src/uu/cat/src/splice.rs | 2 +- src/uu/ls/src/ls.rs | 12 +++++++++++- .../num_format/formatters/base_conv/mod.rs | 2 +- tests/by-util/test_ls.rs | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/uu/cat/src/splice.rs b/src/uu/cat/src/splice.rs index ccc62546798..bd6be60f1c6 100644 --- a/src/uu/cat/src/splice.rs +++ b/src/uu/cat/src/splice.rs @@ -81,7 +81,7 @@ fn copy_exact(read_fd: RawFd, write_fd: RawFd, num_bytes: usize) -> nix::Result< let mut buf = [0; BUF_SIZE]; loop { let read = unistd::read(read_fd, &mut buf[..left])?; - let written = unistd::write(write_fd, &mut buf[..read])?; + let written = unistd::write(write_fd, &buf[..read])?; left -= written; if left == 0 { break; diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 0351227eb95..fcc18847ad4 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -1139,7 +1139,17 @@ fn sort_entries(entries: &mut Vec, config: &Config) { entries.sort_by_key(|k| Reverse(k.md().as_ref().map(|md| md.len()).unwrap_or(0))) } // The default sort in GNU ls is case insensitive - Sort::Name => entries.sort_by_cached_key(|k| k.file_name.to_lowercase()), + Sort::Name => entries.sort_by_cached_key(|k| { + let has_dot: bool = k.file_name.starts_with('.'); + let filename_nodot: String = if has_dot { + k.file_name.chars().skip(1).collect() + } else { + k.file_name.clone() + }; + // We want hidden files to appear before regular files of the same + // name, so we need to negate the "has_dot" variable. + (filename_nodot.to_lowercase(), !has_dot) + }), Sort::Version => entries.sort_by(|k, j| version_cmp::version_cmp(&k.p_buf, &j.p_buf)), Sort::None => {} } diff --git a/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs b/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs index 82971df3eb4..a96b304484c 100644 --- a/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs +++ b/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs @@ -158,7 +158,7 @@ pub fn base_conv_float(src: &[u8], radix_src: u8, _radix_dest: u8) -> f64 { // to implement this for arbitrary string input. // until then, the below operates as an outline // of how it would work. - let result: Vec = vec![0]; + let _result: Vec = vec![0]; let mut factor: f64 = 1_f64; let radix_src_float: f64 = f64::from(radix_src); let mut r: f64 = 0_f64; diff --git a/tests/by-util/test_ls.rs b/tests/by-util/test_ls.rs index 09e02f2640b..da45934e9ce 100644 --- a/tests/by-util/test_ls.rs +++ b/tests/by-util/test_ls.rs @@ -481,6 +481,21 @@ fn test_ls_sort_name() { .arg("--sort=name") .succeeds() .stdout_is(["test-1", "test-2", "test-3\n"].join(sep)); + + // Order of a named sort ignores leading dots. + let scene_dot = TestScenario::new(util_name!()); + let at = &scene_dot.fixtures; + at.touch(".a"); + at.touch("a"); + at.touch(".b"); + at.touch("b"); + + scene_dot + .ucmd() + .arg("--sort=name") + .arg("-A") + .succeeds() + .stdout_is([".a", "a", ".b", "b\n"].join(sep)); } #[test] From 94b35750345730cb4817d50714aa52967abe7216 Mon Sep 17 00:00:00 2001 From: Ricardo Iglesias Date: Sun, 25 Apr 2021 09:20:13 -0700 Subject: [PATCH 2/4] Undid unrelated changes. --- src/uu/cat/src/splice.rs | 2 +- .../printf/src/tokenize/num_format/formatters/base_conv/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/uu/cat/src/splice.rs b/src/uu/cat/src/splice.rs index bd6be60f1c6..ccc62546798 100644 --- a/src/uu/cat/src/splice.rs +++ b/src/uu/cat/src/splice.rs @@ -81,7 +81,7 @@ fn copy_exact(read_fd: RawFd, write_fd: RawFd, num_bytes: usize) -> nix::Result< let mut buf = [0; BUF_SIZE]; loop { let read = unistd::read(read_fd, &mut buf[..left])?; - let written = unistd::write(write_fd, &buf[..read])?; + let written = unistd::write(write_fd, &mut buf[..read])?; left -= written; if left == 0 { break; diff --git a/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs b/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs index a96b304484c..82971df3eb4 100644 --- a/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs +++ b/src/uu/printf/src/tokenize/num_format/formatters/base_conv/mod.rs @@ -158,7 +158,7 @@ pub fn base_conv_float(src: &[u8], radix_src: u8, _radix_dest: u8) -> f64 { // to implement this for arbitrary string input. // until then, the below operates as an outline // of how it would work. - let _result: Vec = vec![0]; + let result: Vec = vec![0]; let mut factor: f64 = 1_f64; let radix_src_float: f64 = f64::from(radix_src); let mut r: f64 = 0_f64; From f0aefd9045f68c25b62df9e195a7784146695087 Mon Sep 17 00:00:00 2001 From: Ricardo Iglesias Date: Sun, 25 Apr 2021 09:29:09 -0700 Subject: [PATCH 3/4] Replaced clone/collect calls. --- src/uu/ls/src/ls.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index fcc18847ad4..4fb53513a79 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -1141,11 +1141,7 @@ fn sort_entries(entries: &mut Vec, config: &Config) { // The default sort in GNU ls is case insensitive Sort::Name => entries.sort_by_cached_key(|k| { let has_dot: bool = k.file_name.starts_with('.'); - let filename_nodot: String = if has_dot { - k.file_name.chars().skip(1).collect() - } else { - k.file_name.clone() - }; + let filename_nodot: &str = &k.file_name[if has_dot {1} else {0}..]; // We want hidden files to appear before regular files of the same // name, so we need to negate the "has_dot" variable. (filename_nodot.to_lowercase(), !has_dot) From cb6faacef5f5d5738b11b48d7c53cd129bf84b37 Mon Sep 17 00:00:00 2001 From: Ricardo Iglesias Date: Sun, 25 Apr 2021 10:20:25 -0700 Subject: [PATCH 4/4] Ran cargo fmt. --- src/uu/ls/src/ls.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 4fb53513a79..6317c1975df 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -1141,7 +1141,7 @@ fn sort_entries(entries: &mut Vec, config: &Config) { // The default sort in GNU ls is case insensitive Sort::Name => entries.sort_by_cached_key(|k| { let has_dot: bool = k.file_name.starts_with('.'); - let filename_nodot: &str = &k.file_name[if has_dot {1} else {0}..]; + let filename_nodot: &str = &k.file_name[if has_dot { 1 } else { 0 }..]; // We want hidden files to appear before regular files of the same // name, so we need to negate the "has_dot" variable. (filename_nodot.to_lowercase(), !has_dot)