From 9de407b1f0be3ccb7d451eedeae11eaae3fa10fe Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Tue, 19 Apr 2022 10:40:10 +0200 Subject: [PATCH] df: fix "File" column width for unicode filenames Fixes #3425 --- Cargo.lock | 1 + src/uu/df/Cargo.toml | 1 + src/uu/df/src/table.rs | 5 +++-- tests/by-util/test_df.rs | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d832e547c..eda10a194 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2206,6 +2206,7 @@ version = "0.0.13" dependencies = [ "clap 3.1.8", "number_prefix", + "unicode-width", "uucore", ] diff --git a/src/uu/df/Cargo.toml b/src/uu/df/Cargo.toml index c6a1c570b..1020b71bb 100644 --- a/src/uu/df/Cargo.toml +++ b/src/uu/df/Cargo.toml @@ -18,6 +18,7 @@ path = "src/df.rs" clap = { version = "3.1", features = ["wrap_help", "cargo"] } number_prefix = "0.4" uucore = { version=">=0.0.11", package="uucore", path="../../uucore", features=["libc", "fsext"] } +unicode-width = "0.1.9" [[bin]] name = "df" diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 698da2bdb..6b64ce02c 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -8,6 +8,7 @@ //! A table ([`Table`]) comprises a header row ([`Header`]) and a //! collection of data rows ([`Row`]), one per filesystem. use number_prefix::NumberPrefix; +use unicode_width::UnicodeWidthStr; use crate::columns::{Alignment, Column}; use crate::filesystem::Filesystem; @@ -362,8 +363,8 @@ impl Table { total += row; for (i, value) in values.iter().enumerate() { - if value.len() > widths[i] { - widths[i] = value.len(); + if UnicodeWidthStr::width(value.as_str()) > widths[i] { + widths[i] = UnicodeWidthStr::width(value.as_str()); } } diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 223dc4efc..f9e826dec 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -165,6 +165,7 @@ fn test_output_mp_repeat() { assert_eq!(3, output1.len()); assert_eq!(output1[1], output1[2]); } + #[test] fn test_output_conflict_options() { for option in ["-i", "-T", "-P"] { @@ -430,6 +431,20 @@ fn test_output_file_specific_files() { assert_eq!(actual, vec!["File", "a ", "b ", "c "]); } +#[test] +fn test_file_column_width_if_filename_contains_unicode_chars() { + let (at, mut ucmd) = at_and_ucmd!(); + at.touch("äöü.txt"); + + let output = ucmd + .args(&["--output=file,target", "äöü.txt"]) + .succeeds() + .stdout_move_str(); + let actual = output.lines().next().unwrap(); + // expected width: 7 chars (length of äöü.txt) + 1 char (column separator) + assert_eq!(actual, "File Mounted on"); +} + #[test] fn test_output_field_no_more_than_once() { new_ucmd!()