diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index 3190e6ad4..c74171373 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -11,7 +11,8 @@ extern crate uucore; use clap::{App, Arg}; -use std::fs::{metadata, File, OpenOptions}; +use std::fs::{metadata, OpenOptions}; +use std::io::ErrorKind; use std::path::Path; #[derive(Eq, PartialEq)] @@ -174,13 +175,14 @@ fn truncate( TruncateMode::Reduce => (), _ => crash!(1, "you must specify a relative ‘--size’ with ‘--reference’"), }; - let _ = match File::open(Path::new(rfilename)) { - Ok(m) => m, - Err(f) => crash!(1, "{}", f.to_string()), - }; match metadata(rfilename) { Ok(meta) => meta.len(), - Err(f) => crash!(1, "{}", f.to_string()), + Err(f) => match f.kind() { + ErrorKind::NotFound => { + crash!(1, "cannot stat '{}': No such file or directory", rfilename) + } + _ => crash!(1, "{}", f.to_string()), + }, } } None => 0, diff --git a/tests/by-util/test_truncate.rs b/tests/by-util/test_truncate.rs index b1f806f82..e14836fcf 100644 --- a/tests/by-util/test_truncate.rs +++ b/tests/by-util/test_truncate.rs @@ -245,3 +245,11 @@ fn test_invalid_numbers() { new_ucmd!().args(&["-s", "0XB", "file"]).fails().stderr_contains("Invalid number: ‘0XB’"); new_ucmd!().args(&["-s", "0B", "file"]).fails().stderr_contains("Invalid number: ‘0B’"); } + +#[test] +fn test_reference_file_not_found() { + new_ucmd!() + .args(&["-r", "a", "b"]) + .fails() + .stderr_contains("cannot stat 'a': No such file or directory"); +}