Skip to content

Commit 831eb09

Browse files
xtqqczzeoech3
andcommitted
tee: merge logic of flush into write
Co-authored-by: oech3 <79379754+oech3@users.noreply.github.com>
1 parent d18358e commit 831eb09

File tree

1 file changed

+26
-34
lines changed

1 file changed

+26
-34
lines changed

src/uu/tee/src/tee.rs

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ impl MultiWriter {
164164
Ok(0) => return Ok(()), // end of file
165165
Ok(received) => {
166166
self.write_all(&buffer[..received])?;
167-
self.flush()?; // avoid buffering
168167
}
169168
Err(e) if e.kind() != ErrorKind::Interrupted => return Err(e),
170169
_ => {}
@@ -177,8 +176,6 @@ impl MultiWriter {
177176
Ok(0) => return Ok(()), // end of file
178177
Ok(received) => {
179178
self.write_all(&buffer[..received])?;
180-
// avoid buffering
181-
self.flush()?;
182179
}
183180
Err(e) if e.kind() != ErrorKind::Interrupted => return Err(e),
184181
_ => {}
@@ -228,42 +225,37 @@ impl Write for MultiWriter {
228225
let mode = self.output_error_mode.clone();
229226
let mut errors = 0;
230227
self.writers.retain_mut(|writer| {
231-
writer
232-
.write_all(buf)
233-
.map_err(|f| {
234-
let _ = process_error(mode.as_ref(), f, writer, &mut errors)
235-
.map_err(|e| aborted.get_or_insert(e));
236-
})
237-
.is_ok()
228+
let res = (|| {
229+
writer.write_all(buf)?;
230+
writer.flush()?;
231+
Ok(())
232+
})();
233+
match res {
234+
Ok(()) => true,
235+
Err(e) => {
236+
if let Err(e) = process_error(mode.as_ref(), e, writer, &mut errors) {
237+
aborted.get_or_insert(e);
238+
}
239+
false
240+
}
241+
}
238242
});
239243
self.ignored_errors += errors;
240-
if let Some(e) = aborted {
241-
Err(e)
242-
} else if self.writers.is_empty() {
243-
// This error kind will never be raised by the standard
244-
// library, so we can use it for early termination of
245-
// `copy`
246-
Err(Error::from(ErrorKind::Other))
247-
} else {
248-
Ok(buf.len())
249-
}
244+
aborted.map_or(
245+
if self.writers.is_empty() {
246+
// This error kind will never be raised by the standard
247+
// library, so we can use it for early termination of
248+
// `copy`
249+
Err(Error::from(ErrorKind::Other))
250+
} else {
251+
Ok(buf.len())
252+
},
253+
Err,
254+
)
250255
}
251256

252257
fn flush(&mut self) -> Result<()> {
253-
let mut aborted = None;
254-
let mode = self.output_error_mode.clone();
255-
let mut errors = 0;
256-
self.writers.retain_mut(|writer| {
257-
writer
258-
.flush()
259-
.map_err(|e| {
260-
let _ = process_error(mode.as_ref(), e, writer, &mut errors)
261-
.map_err(|e| aborted.get_or_insert(e));
262-
})
263-
.is_ok()
264-
});
265-
self.ignored_errors += errors;
266-
aborted.map_or(Ok(()), Err)
258+
Ok(())
267259
}
268260
}
269261

0 commit comments

Comments
 (0)