From d21d02e6ab401637c5d54007b99909d3c81acd8e Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Mon, 8 Jun 2026 21:52:00 +0200 Subject: [PATCH] truncate: process all files when one fails Should make test truncate/multiple-files.sh pass --- src/uu/truncate/src/truncate.rs | 5 ++++- tests/by-util/test_truncate.rs | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 31a67f5f8..da69c81c9 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -14,6 +14,7 @@ use std::path::Path; use uucore::display::Quotable; use uucore::error::{FromIo, UResult, USimpleError, UUsageError}; use uucore::format_usage; +use uucore::show_if_err; use uucore::translate; use uucore::parser::parse_size::{ParseSizeError, Parser, allow_list_with_all_suffixes}; @@ -284,8 +285,10 @@ fn truncate( )); } + // Process every file: a failure on one (e.g. a directory) must not + // prevent the remaining files from being truncated. for filename in filenames { - file_truncate(no_create, reference_size, &mode, filename)?; + show_if_err!(file_truncate(no_create, reference_size, &mode, filename)); } Ok(()) diff --git a/tests/by-util/test_truncate.rs b/tests/by-util/test_truncate.rs index 11b154b3c..5f046ca68 100644 --- a/tests/by-util/test_truncate.rs +++ b/tests/by-util/test_truncate.rs @@ -404,6 +404,19 @@ fn test_no_such_dir() { .stderr_contains("cannot open 'a/b' for writing: No such file or directory"); } +/// Test that truncate processes every file even if one fails. +#[test] +fn test_continue_after_error() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("dir"); + ucmd.args(&["-s", "0", "a", "dir", "b"]) + .fails() + .no_stdout() + .stderr_contains("dir"); + assert!(at.file_exists("a")); + assert!(at.file_exists("b")); +} + /// Test that truncate with a relative size less than 0 is not an error. #[test] fn test_underflow_relative_size() {