1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

tail: Flush BufWriter

This commit is contained in:
Jan Verbeek 2025-03-31 13:19:55 +02:00
parent 11ef1522ca
commit cf50952325
4 changed files with 17 additions and 7 deletions

View file

@ -319,7 +319,7 @@ impl BytesChunkBuffer {
Ok(()) Ok(())
} }
pub fn print(&self, mut writer: impl Write) -> UResult<()> { pub fn print(&self, writer: &mut impl Write) -> UResult<()> {
for chunk in &self.chunks { for chunk in &self.chunks {
writer.write_all(chunk.get_buffer())?; writer.write_all(chunk.get_buffer())?;
} }

View file

@ -12,7 +12,7 @@ use crate::text;
use std::collections::HashMap; use std::collections::HashMap;
use std::collections::hash_map::Keys; use std::collections::hash_map::Keys;
use std::fs::{File, Metadata}; use std::fs::{File, Metadata};
use std::io::{BufRead, BufReader, BufWriter, stdout}; use std::io::{BufRead, BufReader, BufWriter, Write, stdout};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use uucore::error::UResult; use uucore::error::UResult;
@ -146,9 +146,9 @@ impl FileHandling {
self.header_printer.print(display_name.as_str()); self.header_printer.print(display_name.as_str());
} }
let stdout = stdout(); let mut writer = BufWriter::new(stdout().lock());
let writer = BufWriter::new(stdout.lock()); chunks.print(&mut writer)?;
chunks.print(writer)?; writer.flush()?;
self.last.replace(path.to_owned()); self.last.replace(path.to_owned());
self.update_metadata(path, None); self.update_metadata(path, None);

View file

@ -399,8 +399,7 @@ fn bounded_tail(file: &mut File, settings: &Settings) {
} }
fn unbounded_tail<T: Read>(reader: &mut BufReader<T>, settings: &Settings) -> UResult<()> { fn unbounded_tail<T: Read>(reader: &mut BufReader<T>, settings: &Settings) -> UResult<()> {
let stdout = stdout(); let mut writer = BufWriter::new(stdout().lock());
let mut writer = BufWriter::new(stdout.lock());
match &settings.mode { match &settings.mode {
FilterMode::Lines(Signum::Negative(count), sep) => { FilterMode::Lines(Signum::Negative(count), sep) => {
let mut chunks = chunks::LinesChunkBuffer::new(*sep, *count); let mut chunks = chunks::LinesChunkBuffer::new(*sep, *count);
@ -459,6 +458,7 @@ fn unbounded_tail<T: Read>(reader: &mut BufReader<T>, settings: &Settings) -> UR
} }
_ => {} _ => {}
} }
writer.flush()?;
Ok(()) Ok(())
} }

View file

@ -4847,3 +4847,13 @@ fn test_child_when_run_with_stderr_to_stdout() {
.fails() .fails()
.stdout_only(expected_stdout); .stdout_only(expected_stdout);
} }
#[cfg(target_os = "linux")]
#[test]
fn test_failed_write_is_reported() {
new_ucmd!()
.pipe_in("hello")
.set_stdout(std::fs::File::create("/dev/full").unwrap())
.fails()
.stderr_is("tail: No space left on device\n");
}