Skip to content

Commit

Permalink
unexpand: allow multiple files & show error message if a directory is…
Browse files Browse the repository at this point in the history
… 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>
  • Loading branch information
biplab5464 and biplab5464 authored Jan 24, 2024
1 parent f790349 commit 150b287
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 5 deletions.
18 changes: 13 additions & 5 deletions src/uu/unexpand/src/unexpand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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()],
};

Expand Down Expand Up @@ -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())?;
Expand Down Expand Up @@ -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;
}
};

Expand Down
32 changes: 32 additions & 0 deletions tests/by-util/test_unexpand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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");
}

0 comments on commit 150b287

Please sign in to comment.