mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 19:47:45 +00:00
tail: handle file NotFound error correctly
This commit is contained in:
parent
1f24b1f59c
commit
a727b2e666
2 changed files with 35 additions and 14 deletions
|
@ -78,7 +78,7 @@ impl Default for Settings {
|
||||||
#[allow(clippy::cognitive_complexity)]
|
#[allow(clippy::cognitive_complexity)]
|
||||||
pub fn uumain(args: impl uucore::Args) -> i32 {
|
pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||||
let mut settings: Settings = Default::default();
|
let mut settings: Settings = Default::default();
|
||||||
|
let mut return_code = 0;
|
||||||
let app = uu_app();
|
let app = uu_app();
|
||||||
|
|
||||||
let matches = app.get_matches_from(args);
|
let matches = app.get_matches_from(args);
|
||||||
|
@ -138,7 +138,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||||
.map(|v| v.map(ToString::to_string).collect())
|
.map(|v| v.map(ToString::to_string).collect())
|
||||||
.unwrap_or_else(|| vec![String::from("-")]);
|
.unwrap_or_else(|| vec![String::from("-")]);
|
||||||
|
|
||||||
let multiple = files.len() > 1;
|
let mut files_count = files.len();
|
||||||
let mut first_header = true;
|
let mut first_header = true;
|
||||||
let mut readers: Vec<(Box<dyn BufRead>, &String)> = Vec::new();
|
let mut readers: Vec<(Box<dyn BufRead>, &String)> = Vec::new();
|
||||||
|
|
||||||
|
@ -147,19 +147,11 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||||
|
|
||||||
for filename in &files {
|
for filename in &files {
|
||||||
let use_stdin = filename.as_str() == "-";
|
let use_stdin = filename.as_str() == "-";
|
||||||
if (multiple || verbose) && !quiet {
|
|
||||||
if !first_header {
|
|
||||||
println!();
|
|
||||||
}
|
|
||||||
if use_stdin {
|
|
||||||
println!("==> standard input <==");
|
|
||||||
} else {
|
|
||||||
println!("==> {} <==", filename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
first_header = false;
|
|
||||||
|
|
||||||
if use_stdin {
|
if use_stdin {
|
||||||
|
if verbose && !quiet {
|
||||||
|
println!("==> standard input <==");
|
||||||
|
}
|
||||||
let mut reader = BufReader::new(stdin());
|
let mut reader = BufReader::new(stdin());
|
||||||
unbounded_tail(&mut reader, &settings);
|
unbounded_tail(&mut reader, &settings);
|
||||||
|
|
||||||
|
@ -190,6 +182,19 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||||
if path.is_dir() {
|
if path.is_dir() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if !path.exists() {
|
||||||
|
show_error!("cannot open {}: No such file or directory", path.quote());
|
||||||
|
files_count -= 1;
|
||||||
|
return_code = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (files_count > 1 || verbose) && !quiet {
|
||||||
|
if !first_header {
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
println!("==> {} <==", filename);
|
||||||
|
}
|
||||||
|
first_header = false;
|
||||||
let mut file = File::open(&path).unwrap();
|
let mut file = File::open(&path).unwrap();
|
||||||
let md = file.metadata().unwrap();
|
let md = file.metadata().unwrap();
|
||||||
if is_seekable(&mut file) && get_block_size(&md) > 0 {
|
if is_seekable(&mut file) && get_block_size(&md) > 0 {
|
||||||
|
@ -212,7 +217,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 {
|
||||||
follow(&mut readers[..], &settings);
|
follow(&mut readers[..], &settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
0
|
return_code
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn uu_app() -> App<'static, 'static> {
|
pub fn uu_app() -> App<'static, 'static> {
|
||||||
|
|
|
@ -288,6 +288,22 @@ fn test_multiple_input_files() {
|
||||||
.stdout_is_fixture("foobar_follow_multiple.expected");
|
.stdout_is_fixture("foobar_follow_multiple.expected");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_multiple_input_files_missing() {
|
||||||
|
new_ucmd!()
|
||||||
|
.arg(FOOBAR_TXT)
|
||||||
|
.arg("missing1")
|
||||||
|
.arg(FOOBAR_2_TXT)
|
||||||
|
.arg("missing2")
|
||||||
|
.run()
|
||||||
|
.stdout_is_fixture("foobar_follow_multiple.expected")
|
||||||
|
.stderr_is(
|
||||||
|
"tail: cannot open 'missing1': No such file or directory\n\
|
||||||
|
tail: cannot open 'missing2': No such file or directory",
|
||||||
|
)
|
||||||
|
.code_is(1);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_multiple_input_files_with_suppressed_headers() {
|
fn test_multiple_input_files_with_suppressed_headers() {
|
||||||
new_ucmd!()
|
new_ucmd!()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue