diff --git a/src/uu/sort/src/merge.rs b/src/uu/sort/src/merge.rs index 8f0b5bd54ae..b527e5fa877 100644 --- a/src/uu/sort/src/merge.rs +++ b/src/uu/sort/src/merge.rs @@ -25,7 +25,9 @@ use std::{ }; use compare::Compare; +use uucore::display::Quotable; use uucore::error::{FromIo, UResult}; +use uucore::translate; use crate::{ GlobalSettings, Output, SortError, @@ -304,8 +306,14 @@ struct FileMerger<'a> { impl FileMerger<'_> { /// Write the merged contents to the output file. fn write_all(self, settings: &GlobalSettings, output: Output) -> UResult<()> { + let output_name = output + .as_output_name() + .unwrap_or(OsStr::new("standard output")) + .to_owned(); + let ctx = || translate!("sort-error-write-failed", "output" => output_name.maybe_quote()); let mut out = output.into_write(); - self.write_all_to(settings, &mut out) + self.write_all_to(settings, &mut out)?; + out.flush().map_err_context(ctx) } fn write_all_to(mut self, settings: &GlobalSettings, out: &mut impl Write) -> UResult<()> { diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index cf0244889cd..11fa48fe138 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -1182,6 +1182,22 @@ fn test_merge_write_error_does_not_panic() { } } +#[test] +#[cfg(target_os = "linux")] +fn test_merge_flush_error_is_reported() { + use std::fs::File; + + let ts = TestScenario::new("sort"); + ts.fixtures.write("input.txt", "line\n"); + + let dev_full = File::create("/dev/full").expect("Failed to open /dev/full"); + ts.ucmd() + .args(&["-m", "input.txt"]) + .set_stdout(dev_full) + .fails() + .stderr_contains("No space left on device"); +} + #[test] fn test_merge_unique() { new_ucmd!()