1
Fork 0
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:
Biplab Mochan Gartia 2024-01-24 20:31:26 +05:30 committed by GitHub
parent f790349ffb
commit 150b287fe8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 45 additions and 5 deletions

View file

@ -11,11 +11,12 @@ use std::fmt;
use std::fs::File;
use std::io::{stdin, stdout, BufRead, BufReader, BufWriter, Read, Stdout, Write};
use std::num::IntErrorKind;
use std::path::Path;
use std::str::from_utf8;
use unicode_width::UnicodeWidthChar;
use uucore::display::Quotable;
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 ABOUT: &str = help_about!("unexpand.md");
@ -105,8 +106,8 @@ impl Options {
&& !matches.get_flag(options::FIRST_ONLY);
let uflag = !matches.get_flag(options::NO_UTF8);
let files = match matches.get_one::<String>(options::FILE) {
Some(v) => vec![v.to_string()],
let files = match matches.get_many::<String>(options::FILE) {
Some(v) => v.cloned().collect(),
None => vec!["-".to_owned()],
};
@ -211,7 +212,13 @@ pub fn uu_app() -> Command {
fn open(path: &str) -> UResult<BufReader<Box<dyn Read + 'static>>> {
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>))
} else {
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) {
Ok(reader) => reader,
Err(err) => {
return Err(USimpleError::new(1, err.to_string()));
show!(err);
continue;
}
};

View file

@ -2,6 +2,7 @@
//
// For the full copyright and license information, please view the LICENSE
// file that was distributed with this source code.
// spell-checker:ignore contenta
use crate::common::util::TestScenario;
#[test]
@ -235,3 +236,34 @@ fn test_tabs_shortcut_with_too_large_size() {
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");
}