du: ignore env zero blocksize

This commit is contained in:
Christopher Armstrong 2025-10-20 07:26:32 -04:00
parent 8e7c6b01a4
commit 1c0214b29d
2 changed files with 115 additions and 13 deletions

View file

@ -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<FileInfo> {
result
}
fn block_size_from_env() -> Option<u64> {
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<u64> {
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)
}
}

View file

@ -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!()