1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-27 11:07:44 +00:00

Merge pull request #3408 from cakebaker/ticket_3325

df: respect -t arg when specific file is provided
This commit is contained in:
Sylvestre Ledru 2022-04-23 09:24:08 +02:00 committed by GitHub
commit 5088ddc377
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 9 deletions

View file

@ -292,7 +292,7 @@ fn get_all_filesystems(opt: &Options) -> Vec<Filesystem> {
}
/// For each path, get the filesystem that contains that path.
fn get_named_filesystems<P>(paths: &[P]) -> Vec<Filesystem>
fn get_named_filesystems<P>(paths: &[P], opt: &Options) -> Vec<Filesystem>
where
P: AsRef<Path>,
{
@ -302,21 +302,35 @@ where
// considered. The "lofs" filesystem is a loopback
// filesystem present on Solaris and FreeBSD systems. It
// is similar to a symbolic link.
let mounts: Vec<MountInfo> = read_fs_list()
let mounts: Vec<MountInfo> = filter_mount_list(read_fs_list(), opt)
.into_iter()
.filter(|mi| mi.fs_type != "lofs" && !mi.dummy)
.collect();
let mut result = vec![];
// this happens if the file system type doesn't exist
if mounts.is_empty() {
show!(USimpleError::new(1, "no file systems processed"));
return result;
}
// Convert each path into a `Filesystem`, which contains
// both the mount information and usage information.
let mut result = vec![];
for path in paths {
match Filesystem::from_path(&mounts, path) {
Some(fs) => result.push(fs),
None => show!(USimpleError::new(
1,
format!("{}: No such file or directory", path.as_ref().display())
)),
None => {
// this happens if specified file system type != file system type of the file
if path.as_ref().exists() {
show!(USimpleError::new(1, "no file systems processed"));
} else {
show!(USimpleError::new(
1,
format!("{}: No such file or directory", path.as_ref().display())
));
}
}
}
}
result
@ -370,7 +384,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
}
Some(paths) => {
let paths: Vec<&str> = paths.collect();
let filesystems = get_named_filesystems(&paths);
let filesystems = get_named_filesystems(&paths, &opt);
// This can happen if paths are given as command-line arguments
// but none of the paths exist.

View file

@ -199,7 +199,42 @@ fn test_type_option() {
new_ucmd!()
.args(&["-t", fs_type, "-t", "nonexisting"])
.succeeds();
new_ucmd!().args(&["-t", "nonexisting"]).fails();
new_ucmd!()
.args(&["-t", "nonexisting"])
.fails()
.stderr_contains("no file systems processed");
}
#[test]
fn test_type_option_with_file() {
let fs_type = new_ucmd!()
.args(&["--output=fstype", "."])
.succeeds()
.stdout_move_str();
let fs_type = fs_type.lines().nth(1).unwrap().trim();
new_ucmd!().args(&["-t", fs_type, "."]).succeeds();
new_ucmd!()
.args(&["-t", "nonexisting", "."])
.fails()
.stderr_contains("no file systems processed");
let fs_types = new_ucmd!()
.arg("--output=fstype")
.succeeds()
.stdout_move_str();
let fs_types: Vec<_> = fs_types
.lines()
.skip(1)
.filter(|t| t.trim() != fs_type && t.trim() != "")
.collect();
if !fs_types.is_empty() {
new_ucmd!()
.args(&["-t", fs_types[0], "."])
.fails()
.stderr_contains("no file systems processed");
}
}
#[test]