From 1c0214b29ddc6d2a048f3f3b8ecb34660a270ca7 Mon Sep 17 00:00:00 2001 From: Christopher Armstrong Date: Mon, 20 Oct 2025 07:26:32 -0400 Subject: [PATCH] du: ignore env zero blocksize --- src/uu/du/src/du.rs | 29 ++++++------ tests/by-util/test_du.rs | 99 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 13 deletions(-) diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index c893b06ca..4c29d07d3 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -31,7 +31,7 @@ use uucore::safe_traversal::DirFd; use uucore::translate; use uucore::parser::parse_glob; -use uucore::parser::parse_size::{ParseSizeError, parse_size_u64}; +use uucore::parser::parse_size::{ParseSizeError, parse_size_non_zero_u64, parse_size_u64}; use uucore::parser::shortcut_value_parser::ShortcutValueParser; use uucore::time::{FormatSystemTimeFallback, format, format_system_time}; use uucore::{format_usage, show, show_error, show_warning}; @@ -271,23 +271,26 @@ fn get_file_info(path: &Path, _metadata: &Metadata) -> Option { result } +fn block_size_from_env() -> Option { + for env_var in ["DU_BLOCK_SIZE", "BLOCK_SIZE", "BLOCKSIZE"] { + if let Ok(env_size) = env::var(env_var) { + return parse_size_non_zero_u64(&env_size).ok(); + } + } + + None +} + fn read_block_size(s: Option<&str>) -> UResult { if let Some(s) = s { parse_size_u64(s) .map_err(|e| USimpleError::new(1, format_error_message(&e, s, options::BLOCK_SIZE))) + } else if let Some(bytes) = block_size_from_env() { + Ok(bytes) + } else if env::var("POSIXLY_CORRECT").is_ok() { + Ok(512) } else { - for env_var in ["DU_BLOCK_SIZE", "BLOCK_SIZE", "BLOCKSIZE"] { - if let Ok(env_size) = env::var(env_var) { - if let Ok(v) = parse_size_u64(&env_size) { - return Ok(v); - } - } - } - if env::var("POSIXLY_CORRECT").is_ok() { - Ok(512) - } else { - Ok(1024) - } + Ok(1024) } } diff --git a/tests/by-util/test_du.rs b/tests/by-util/test_du.rs index 5f8c61396..7c6dcd6c3 100644 --- a/tests/by-util/test_du.rs +++ b/tests/by-util/test_du.rs @@ -179,6 +179,105 @@ fn test_du_with_posixly_correct() { assert_eq!(expected, result); } +#[test] +fn test_du_zero_env_block_size() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + let dir = "a"; + + at.mkdir(dir); + at.write(&format!("{dir}/file"), "some content"); + + let expected = ts + .ucmd() + .arg(dir) + .arg("--block-size=1024") + .succeeds() + .stdout_move_str(); + + let result = ts + .ucmd() + .arg(dir) + .env("DU_BLOCK_SIZE", "0") + .succeeds() + .stdout_move_str(); + + assert_eq!(expected, result); +} + +#[test] +fn test_du_zero_env_block_size_hierarchy() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + let dir = "a"; + + at.mkdir(dir); + at.write(&format!("{dir}/file"), "some content"); + + let expected = ts + .ucmd() + .arg(dir) + .arg("--block-size=1024") + .succeeds() + .stdout_move_str(); + + let result1 = ts + .ucmd() + .arg(dir) + .env("BLOCK_SIZE", "1") + .env("DU_BLOCK_SIZE", "0") + .succeeds() + .stdout_move_str(); + + let result2 = ts + .ucmd() + .arg(dir) + .env("BLOCK_SIZE", "1") + .env("BLOCKSIZE", "1") + .env("DU_BLOCK_SIZE", "0") + .succeeds() + .stdout_move_str(); + + assert_eq!(expected, result1); + assert_eq!(expected, result2); +} + +#[test] +fn test_du_env_block_size_hierarchy() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + let dir = "a"; + + at.mkdir(dir); + at.write(&format!("{dir}/file"), "some content"); + + let expected = ts + .ucmd() + .arg(dir) + .arg("--block-size=1") + .succeeds() + .stdout_move_str(); + + let result1 = ts + .ucmd() + .arg(dir) + .env("BLOCK_SIZE", "0") + .env("DU_BLOCK_SIZE", "1") + .succeeds() + .stdout_move_str(); + + let result2 = ts + .ucmd() + .arg(dir) + .env("BLOCK_SIZE", "1") + .env("BLOCKSIZE", "0") + .succeeds() + .stdout_move_str(); + + assert_eq!(expected, result1); + assert_eq!(expected, result2); +} + #[test] fn test_du_non_existing_files() { new_ucmd!()