Skip to content

Commit

Permalink
Merge pull request #4672 from sylvestre/dircolors
Browse files Browse the repository at this point in the history
dircolors: trigger an error when used on /
  • Loading branch information
tertsdiepraam authored Apr 4, 2023
2 parents 9060904 + 889df29 commit f82f92e
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
19 changes: 15 additions & 4 deletions src/uu/dircolors/src/dircolors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ use std::borrow::Borrow;
use std::env;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;

use clap::{crate_version, Arg, ArgAction, Command};
use uucore::display::Quotable;
Expand Down Expand Up @@ -42,7 +43,6 @@ pub enum OutputFmt {
}

pub fn guess_syntax() -> OutputFmt {
use std::path::Path;
match env::var("SHELL") {
Ok(ref s) if !s.is_empty() => {
let shell_path: &Path = s.as_ref();
Expand Down Expand Up @@ -138,15 +138,26 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
let fin = BufReader::new(std::io::stdin());
result = parse(fin.lines().filter_map(Result::ok), &out_format, files[0]);
} else {
match File::open(files[0]) {
let path = Path::new(files[0]);
if path.is_dir() {
return Err(USimpleError::new(
2,
format!("expected file, got directory {}", path.quote()),
));
}
match File::open(path) {
Ok(f) => {
let fin = BufReader::new(f);
result = parse(fin.lines().filter_map(Result::ok), &out_format, files[0]);
result = parse(
fin.lines().map_while(Result::ok),
&out_format,
&path.to_string_lossy(),
);
}
Err(e) => {
return Err(USimpleError::new(
1,
format!("{}: {}", files[0].maybe_quote(), e),
format!("{}: {}", path.maybe_quote(), e),
));
}
}
Expand Down
10 changes: 10 additions & 0 deletions tests/by-util/test_dircolors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -221,3 +221,13 @@ fn test_helper(file_name: &str, term: &str) {
.run()
.stdout_is_fixture(format!("{file_name}.sh.expected"));
}

#[test]
fn test_dircolors_for_dir_as_file() {
let result = new_ucmd!().args(&["-c", "/"]).fails();
result.no_stdout();
assert_eq!(
result.stderr_str().trim(),
"dircolors: expected file, got directory '/'",
);
}

0 comments on commit f82f92e

Please sign in to comment.