1
0
mirror of https://github.com/sharkdp/bat.git synced 2025-09-01 10:52:24 +01:00

Add io cycle detection with clircle

This commit is contained in:
Niklas Mohrin
2020-11-08 22:23:43 +01:00
committed by David Peter
parent 6d75540d4e
commit 31793cfa62
4 changed files with 63 additions and 10 deletions

View File

@@ -13,6 +13,7 @@ use crate::output::OutputType;
#[cfg(feature = "paging")]
use crate::paging::PagingMode;
use crate::printer::{InteractivePrinter, Printer, SimplePrinter};
use std::convert::TryFrom;
pub struct Controller<'a> {
config: &'a Config<'a>,
@@ -66,6 +67,14 @@ impl<'b> Controller<'b> {
}
let attached_to_pager = output_type.is_pager();
let rw_cycle_detected = !attached_to_pager && {
let identifiers: Vec<_> = inputs
.iter()
.flat_map(clircle::Identifier::try_from)
.collect();
clircle::stdout_among_inputs(&identifiers)
};
let writer = output_type.handle()?;
let mut no_errors: bool = true;
@@ -78,6 +87,11 @@ impl<'b> Controller<'b> {
}
};
if rw_cycle_detected {
print_error(&"The output file is also an input!".into(), writer);
return Ok(false);
}
for (index, input) in inputs.into_iter().enumerate() {
match input.open(io::stdin().lock()) {
Err(error) => {

View File

@@ -1,6 +1,8 @@
use std::convert::TryFrom;
use std::ffi::{OsStr, OsString};
use std::fs::File;
use std::io::{self, BufRead, BufReader, Read};
use std::path::Path;
use content_inspector::{self, ContentType};
@@ -192,6 +194,18 @@ impl<'a> Input<'a> {
}
}
impl TryFrom<&'_ Input<'_>> for clircle::Identifier {
type Error = ();
fn try_from(input: &Input) -> std::result::Result<clircle::Identifier, ()> {
match input.kind {
InputKind::OrdinaryFile(ref path) => Self::try_from(Path::new(path)).map_err(|_| ()),
InputKind::StdIn => Self::try_from(clircle::Stdio::Stdin).map_err(|_| ()),
InputKind::CustomReader(_) => Err(()),
}
}
}
pub(crate) struct InputReader<'a> {
inner: Box<dyn BufRead + 'a>,
pub(crate) first_line: Vec<u8>,