From 1eee2194a30a6399c5f391e1378138c7f9d4de70 Mon Sep 17 00:00:00 2001 From: DevSabb Date: Thu, 31 Mar 2022 11:16:55 -0400 Subject: [PATCH] head, tail: include presume-input-pipe parameter --- src/uu/head/src/head.rs | 15 ++++++++++++--- src/uu/tail/src/tail.rs | 11 ++++++++++- tests/by-util/test_head.rs | 18 ++++++++++++++++++ tests/by-util/test_tail.rs | 9 +++++++++ 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/uu/head/src/head.rs b/src/uu/head/src/head.rs index 14780aa3c..1ddfc0492 100644 --- a/src/uu/head/src/head.rs +++ b/src/uu/head/src/head.rs @@ -35,6 +35,7 @@ mod options { pub const VERBOSE_NAME: &str = "VERBOSE"; pub const ZERO_NAME: &str = "ZERO"; pub const FILES_NAME: &str = "FILE"; + pub const PRESUME_INPUT_PIPE: &str = "-PRESUME-INPUT-PIPE"; } mod parse; mod take; @@ -94,6 +95,12 @@ pub fn uu_app<'a>() -> Command<'a> { .help("always print headers giving file names") .overrides_with_all(&[options::QUIET_NAME, options::VERBOSE_NAME]), ) + .arg( + Arg::new(options::PRESUME_INPUT_PIPE) + .long("-presume-input-pipe") + .alias("-presume-input-pipe") + .hide(true), + ) .arg( Arg::new(options::ZERO_NAME) .short('z') @@ -173,6 +180,7 @@ struct HeadOptions { pub quiet: bool, pub verbose: bool, pub zeroed: bool, + pub presume_input_pipe: bool, pub mode: Mode, pub files: Vec, } @@ -187,6 +195,7 @@ impl HeadOptions { options.quiet = matches.is_present(options::QUIET_NAME); options.verbose = matches.is_present(options::VERBOSE_NAME); options.zeroed = matches.is_present(options::ZERO_NAME); + options.presume_input_pipe = matches.is_present(options::PRESUME_INPUT_PIPE); options.mode = Mode::from(&matches)?; @@ -423,8 +432,8 @@ fn head_file(input: &mut std::fs::File, options: &HeadOptions) -> std::io::Resul fn uu_head(options: &HeadOptions) -> UResult<()> { let mut first = true; for file in &options.files { - let res = match file.as_str() { - "-" => { + let res = match (file.as_str(), options.presume_input_pipe) { + (_, true) | ("-", false) => { if (options.files.len() > 1 && !options.quiet) || options.verbose { if !first { println!(); @@ -460,7 +469,7 @@ fn uu_head(options: &HeadOptions) -> UResult<()> { } } } - name => { + (name, false) => { let mut file = match std::fs::File::open(name) { Ok(f) => f, Err(err) => { diff --git a/src/uu/tail/src/tail.rs b/src/uu/tail/src/tail.rs index bbbc9810d..6654a61fe 100644 --- a/src/uu/tail/src/tail.rs +++ b/src/uu/tail/src/tail.rs @@ -63,6 +63,7 @@ pub mod options { pub static SLEEP_INT: &str = "sleep-interval"; pub static ZERO_TERM: &str = "zero-terminated"; pub static ARG_FILES: &str = "files"; + pub static PRESUME_INPUT_PIPE: &str = "-presume-input-pipe"; } #[derive(Debug)] @@ -87,6 +88,7 @@ struct Settings { follow: bool, pid: platform::Pid, files: Vec, + presume_input_pipe: bool, } impl Settings { @@ -148,6 +150,7 @@ impl Settings { settings.verbose = matches.is_present(options::verbosity::VERBOSE); settings.quiet = matches.is_present(options::verbosity::QUIET); + settings.presume_input_pipe = matches.is_present(options::PRESUME_INPUT_PIPE); settings.files = match matches.values_of(options::ARG_FILES) { Some(v) => v.map(|s| s.to_owned()).collect(), @@ -192,7 +195,7 @@ fn uu_tail(settings: &Settings) -> UResult<()> { } first_header = false; - if use_stdin { + if use_stdin || settings.presume_input_pipe { let mut reader = BufReader::new(stdin()); unbounded_tail(&mut reader, settings)?; @@ -339,6 +342,12 @@ pub fn uu_app<'a>() -> Command<'a> { .long(options::ZERO_TERM) .help("Line delimiter is NUL, not newline"), ) + .arg( + Arg::new(options::PRESUME_INPUT_PIPE) + .long(options::PRESUME_INPUT_PIPE) + .alias(options::PRESUME_INPUT_PIPE) + .hide(true), + ) .arg( Arg::new(options::ARG_FILES) .multiple_occurrences(true) diff --git a/tests/by-util/test_head.rs b/tests/by-util/test_head.rs index 271c8f10c..20bec7589 100644 --- a/tests/by-util/test_head.rs +++ b/tests/by-util/test_head.rs @@ -342,3 +342,21 @@ fn test_head_num_with_undocumented_sign_bytes() { .succeeds() .stdout_is("abcde"); } + +#[test] +fn test_presume_input_pipe_default() { + new_ucmd!() + .args(&["---presume-input-pipe"]) + .pipe_in_fixture(INPUT) + .run() + .stdout_is_fixture("lorem_ipsum_default.expected"); +} + +#[test] +fn test_presume_input_pipe_5_chars() { + new_ucmd!() + .args(&["-c", "5", "---presume-input-pipe"]) + .pipe_in_fixture(INPUT) + .run() + .stdout_is_fixture("lorem_ipsum_5_chars.expected"); +} diff --git a/tests/by-util/test_tail.rs b/tests/by-util/test_tail.rs index bc757c3d1..9791e346c 100644 --- a/tests/by-util/test_tail.rs +++ b/tests/by-util/test_tail.rs @@ -563,3 +563,12 @@ fn test_lines_zero_terminated() { .succeeds() .stdout_only("b\0c\0d\0e\0"); } + +#[test] +fn test_presume_input_pipe_default() { + new_ucmd!() + .arg("---presume-input-pipe") + .pipe_in_fixture(FOOBAR_TXT) + .run() + .stdout_is_fixture("foobar_stdin_default.expected"); +}