mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 03:27:44 +00:00
unexpand: allow multiple files & show error message if a directory is specified
* unexpand: should allow multiple files #5852 and unexpand: show error message if a directory is specified #5845 * test file added for #5845 #5852 * test case test_multiple_files improve * cakebaker suggestion for a better code #5845 #5852 --------- Co-authored-by: biplab5464 <biplab5464@outlook.com>
This commit is contained in:
parent
f790349ffb
commit
150b287fe8
2 changed files with 45 additions and 5 deletions
|
@ -11,11 +11,12 @@ use std::fmt;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Read, Stdout, Write};
|
use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Read, Stdout, Write};
|
||||||
use std::num::IntErrorKind;
|
use std::num::IntErrorKind;
|
||||||
|
use std::path::Path;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
use unicode_width::UnicodeWidthChar;
|
use unicode_width::UnicodeWidthChar;
|
||||||
use uucore::display::Quotable;
|
use uucore::display::Quotable;
|
||||||
use uucore::error::{FromIo, UError, UResult, USimpleError};
|
use uucore::error::{FromIo, UError, UResult, USimpleError};
|
||||||
use uucore::{crash_if_err, format_usage, help_about, help_usage};
|
use uucore::{crash_if_err, format_usage, help_about, help_usage, show};
|
||||||
|
|
||||||
const USAGE: &str = help_usage!("unexpand.md");
|
const USAGE: &str = help_usage!("unexpand.md");
|
||||||
const ABOUT: &str = help_about!("unexpand.md");
|
const ABOUT: &str = help_about!("unexpand.md");
|
||||||
|
@ -105,8 +106,8 @@ impl Options {
|
||||||
&& !matches.get_flag(options::FIRST_ONLY);
|
&& !matches.get_flag(options::FIRST_ONLY);
|
||||||
let uflag = !matches.get_flag(options::NO_UTF8);
|
let uflag = !matches.get_flag(options::NO_UTF8);
|
||||||
|
|
||||||
let files = match matches.get_one::<String>(options::FILE) {
|
let files = match matches.get_many::<String>(options::FILE) {
|
||||||
Some(v) => vec![v.to_string()],
|
Some(v) => v.cloned().collect(),
|
||||||
None => vec!["-".to_owned()],
|
None => vec!["-".to_owned()],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -211,7 +212,13 @@ pub fn uu_app() -> Command {
|
||||||
|
|
||||||
fn open(path: &str) -> UResult<BufReader<Box<dyn Read + 'static>>> {
|
fn open(path: &str) -> UResult<BufReader<Box<dyn Read + 'static>>> {
|
||||||
let file_buf;
|
let file_buf;
|
||||||
if path == "-" {
|
let filename = Path::new(path);
|
||||||
|
if filename.is_dir() {
|
||||||
|
Err(Box::new(USimpleError {
|
||||||
|
code: 1,
|
||||||
|
message: format!("{}: Is a directory", filename.display()),
|
||||||
|
}))
|
||||||
|
} else if path == "-" {
|
||||||
Ok(BufReader::new(Box::new(stdin()) as Box<dyn Read>))
|
Ok(BufReader::new(Box::new(stdin()) as Box<dyn Read>))
|
||||||
} else {
|
} else {
|
||||||
file_buf = File::open(path).map_err_context(|| path.to_string())?;
|
file_buf = File::open(path).map_err_context(|| path.to_string())?;
|
||||||
|
@ -401,7 +408,8 @@ fn unexpand(options: &Options) -> UResult<()> {
|
||||||
let mut fh = match open(file) {
|
let mut fh = match open(file) {
|
||||||
Ok(reader) => reader,
|
Ok(reader) => reader,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
return Err(USimpleError::new(1, err.to_string()));
|
show!(err);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
//
|
//
|
||||||
// For the full copyright and license information, please view the LICENSE
|
// For the full copyright and license information, please view the LICENSE
|
||||||
// file that was distributed with this source code.
|
// file that was distributed with this source code.
|
||||||
|
// spell-checker:ignore contenta
|
||||||
use crate::common::util::TestScenario;
|
use crate::common::util::TestScenario;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -235,3 +236,34 @@ fn test_tabs_shortcut_with_too_large_size() {
|
||||||
|
|
||||||
new_ucmd!().arg(arg).fails().stderr_contains(expected_error);
|
new_ucmd!().arg(arg).fails().stderr_contains(expected_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_is_directory() {
|
||||||
|
let (at, mut ucmd) = at_and_ucmd!();
|
||||||
|
let dir_name = "dir";
|
||||||
|
at.mkdir(dir_name);
|
||||||
|
|
||||||
|
ucmd.arg(dir_name)
|
||||||
|
.fails()
|
||||||
|
.stderr_contains(format!("unexpand: {}: Is a directory", dir_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_multiple_files() {
|
||||||
|
let (at, mut ucmd) = at_and_ucmd!();
|
||||||
|
|
||||||
|
at.write("file", "content");
|
||||||
|
at.write("file1", "a b");
|
||||||
|
|
||||||
|
ucmd.args(&["file", "file1"])
|
||||||
|
.succeeds()
|
||||||
|
.stdout_is("contenta b");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_one_nonexisting_file() {
|
||||||
|
new_ucmd!()
|
||||||
|
.arg("asdf.txt")
|
||||||
|
.fails()
|
||||||
|
.stderr_contains("asdf.txt: No such file or directory");
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue