From a3ab064f352f7b6c632b15f627806ae5ca287f5b Mon Sep 17 00:00:00 2001 From: Ben Wiederhake Date: Sun, 3 Mar 2024 20:09:07 +0100 Subject: [PATCH] truncate: don't error in --no-create with reference case --- src/uu/truncate/src/truncate.rs | 18 +++++++----------- tests/by-util/test_truncate.rs | 32 +++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 9368ce9b170..c0e38f59b89 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -180,8 +180,11 @@ pub fn uu_app() -> Command { /// size of the file. fn file_truncate(filename: &str, create: bool, size: u64) -> std::io::Result<()> { let path = Path::new(filename); - let f = OpenOptions::new().write(true).create(create).open(path)?; - f.set_len(size) + match OpenOptions::new().write(true).create(create).open(path) { + Ok(file) => file.set_len(size), + Err(e) if e.kind() == ErrorKind::NotFound && !create => Ok(()), + Err(e) => Err(e), + } } /// Truncate files to a size relative to a given file. @@ -337,15 +340,8 @@ fn truncate_size_only(size_string: &str, filenames: &[String], create: bool) -> Err(_) => 0, }; let tsize = mode.to_size(fsize); - match file_truncate(filename, create, tsize) { - Ok(_) => continue, - Err(e) if e.kind() == ErrorKind::NotFound && !create => continue, - Err(e) => { - return Err( - e.map_err_context(|| format!("cannot open {} for writing", filename.quote())) - ) - } - } + file_truncate(filename, create, tsize) + .map_err_context(|| format!("cannot open {} for writing", filename.quote()))?; } Ok(()) } diff --git a/tests/by-util/test_truncate.rs b/tests/by-util/test_truncate.rs index f7122902eb7..41a28736dd1 100644 --- a/tests/by-util/test_truncate.rs +++ b/tests/by-util/test_truncate.rs @@ -268,7 +268,7 @@ fn test_new_file() { /// Test for not creating a non-existent file. #[test] -fn test_new_file_no_create() { +fn test_new_file_no_create_size_only() { let (at, mut ucmd) = at_and_ucmd!(); let filename = "new_file_that_does_not_exist_yet"; ucmd.args(&["-s", "8", "-c", filename]) @@ -278,6 +278,36 @@ fn test_new_file_no_create() { assert!(!at.file_exists(filename)); } +/// Test for not creating a non-existent file. +#[test] +#[ignore = "other bug"] +fn test_new_file_no_create_reference_only() { + let (at, mut ucmd) = at_and_ucmd!(); + let mut old_file = at.make_file(FILE1); + old_file.write_all(b"1234567890").unwrap(); + let filename = "new_file_that_does_not_exist_yet"; + ucmd.args(&["-r", FILE1, "-c", filename]) + .succeeds() + .no_stdout() + .no_stderr(); + assert!(!at.file_exists(filename)); +} + +/// Test for not creating a non-existent file. +#[test] +#[ignore = "other bug"] +fn test_new_file_no_create_size_and_reference() { + let (at, mut ucmd) = at_and_ucmd!(); + let mut old_file = at.make_file(FILE1); + old_file.write_all(b"1234567890").unwrap(); + let filename = "new_file_that_does_not_exist_yet"; + ucmd.args(&["-r", FILE1, "-s", "+8", "-c", filename]) + .succeeds() + .no_stdout() + .no_stderr(); + assert!(!at.file_exists(filename)); +} + #[test] fn test_division_by_zero_size_only() { new_ucmd!()