Skip to content

Commit 8cc0cb8

Browse files
authored
Merge pull request #8961 from Ada-Armstrong/du_env_var_zero_block_size
du: ignore env zero blocksize
2 parents 8e7c6b0 + 1c0214b commit 8cc0cb8

File tree

2 files changed

+115
-13
lines changed

2 files changed

+115
-13
lines changed

src/uu/du/src/du.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use uucore::safe_traversal::DirFd;
3131
use uucore::translate;
3232

3333
use uucore::parser::parse_glob;
34-
use uucore::parser::parse_size::{ParseSizeError, parse_size_u64};
34+
use uucore::parser::parse_size::{ParseSizeError, parse_size_non_zero_u64, parse_size_u64};
3535
use uucore::parser::shortcut_value_parser::ShortcutValueParser;
3636
use uucore::time::{FormatSystemTimeFallback, format, format_system_time};
3737
use uucore::{format_usage, show, show_error, show_warning};
@@ -271,23 +271,26 @@ fn get_file_info(path: &Path, _metadata: &Metadata) -> Option<FileInfo> {
271271
result
272272
}
273273

274+
fn block_size_from_env() -> Option<u64> {
275+
for env_var in ["DU_BLOCK_SIZE", "BLOCK_SIZE", "BLOCKSIZE"] {
276+
if let Ok(env_size) = env::var(env_var) {
277+
return parse_size_non_zero_u64(&env_size).ok();
278+
}
279+
}
280+
281+
None
282+
}
283+
274284
fn read_block_size(s: Option<&str>) -> UResult<u64> {
275285
if let Some(s) = s {
276286
parse_size_u64(s)
277287
.map_err(|e| USimpleError::new(1, format_error_message(&e, s, options::BLOCK_SIZE)))
288+
} else if let Some(bytes) = block_size_from_env() {
289+
Ok(bytes)
290+
} else if env::var("POSIXLY_CORRECT").is_ok() {
291+
Ok(512)
278292
} else {
279-
for env_var in ["DU_BLOCK_SIZE", "BLOCK_SIZE", "BLOCKSIZE"] {
280-
if let Ok(env_size) = env::var(env_var) {
281-
if let Ok(v) = parse_size_u64(&env_size) {
282-
return Ok(v);
283-
}
284-
}
285-
}
286-
if env::var("POSIXLY_CORRECT").is_ok() {
287-
Ok(512)
288-
} else {
289-
Ok(1024)
290-
}
293+
Ok(1024)
291294
}
292295
}
293296

tests/by-util/test_du.rs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,105 @@ fn test_du_with_posixly_correct() {
179179
assert_eq!(expected, result);
180180
}
181181

182+
#[test]
183+
fn test_du_zero_env_block_size() {
184+
let ts = TestScenario::new(util_name!());
185+
let at = &ts.fixtures;
186+
let dir = "a";
187+
188+
at.mkdir(dir);
189+
at.write(&format!("{dir}/file"), "some content");
190+
191+
let expected = ts
192+
.ucmd()
193+
.arg(dir)
194+
.arg("--block-size=1024")
195+
.succeeds()
196+
.stdout_move_str();
197+
198+
let result = ts
199+
.ucmd()
200+
.arg(dir)
201+
.env("DU_BLOCK_SIZE", "0")
202+
.succeeds()
203+
.stdout_move_str();
204+
205+
assert_eq!(expected, result);
206+
}
207+
208+
#[test]
209+
fn test_du_zero_env_block_size_hierarchy() {
210+
let ts = TestScenario::new(util_name!());
211+
let at = &ts.fixtures;
212+
let dir = "a";
213+
214+
at.mkdir(dir);
215+
at.write(&format!("{dir}/file"), "some content");
216+
217+
let expected = ts
218+
.ucmd()
219+
.arg(dir)
220+
.arg("--block-size=1024")
221+
.succeeds()
222+
.stdout_move_str();
223+
224+
let result1 = ts
225+
.ucmd()
226+
.arg(dir)
227+
.env("BLOCK_SIZE", "1")
228+
.env("DU_BLOCK_SIZE", "0")
229+
.succeeds()
230+
.stdout_move_str();
231+
232+
let result2 = ts
233+
.ucmd()
234+
.arg(dir)
235+
.env("BLOCK_SIZE", "1")
236+
.env("BLOCKSIZE", "1")
237+
.env("DU_BLOCK_SIZE", "0")
238+
.succeeds()
239+
.stdout_move_str();
240+
241+
assert_eq!(expected, result1);
242+
assert_eq!(expected, result2);
243+
}
244+
245+
#[test]
246+
fn test_du_env_block_size_hierarchy() {
247+
let ts = TestScenario::new(util_name!());
248+
let at = &ts.fixtures;
249+
let dir = "a";
250+
251+
at.mkdir(dir);
252+
at.write(&format!("{dir}/file"), "some content");
253+
254+
let expected = ts
255+
.ucmd()
256+
.arg(dir)
257+
.arg("--block-size=1")
258+
.succeeds()
259+
.stdout_move_str();
260+
261+
let result1 = ts
262+
.ucmd()
263+
.arg(dir)
264+
.env("BLOCK_SIZE", "0")
265+
.env("DU_BLOCK_SIZE", "1")
266+
.succeeds()
267+
.stdout_move_str();
268+
269+
let result2 = ts
270+
.ucmd()
271+
.arg(dir)
272+
.env("BLOCK_SIZE", "1")
273+
.env("BLOCKSIZE", "0")
274+
.succeeds()
275+
.stdout_move_str();
276+
277+
assert_eq!(expected, result1);
278+
assert_eq!(expected, result2);
279+
}
280+
182281
#[test]
183282
fn test_du_non_existing_files() {
184283
new_ucmd!()

0 commit comments

Comments
 (0)