Merge pull request #8763 from bakanovskii/df-follow-symlinks

df: follow symlinks
This commit is contained in:
Sylvestre Ledru
2025-09-28 23:28:48 +02:00
committed by GitHub
3 changed files with 29 additions and 2 deletions
+1 -1
View File
@@ -19,7 +19,7 @@ path = "src/df.rs"
[dependencies]
clap = { workspace = true }
uucore = { workspace = true, features = ["libc", "fsext", "parser"] }
uucore = { workspace = true, features = ["libc", "fsext", "parser", "fs"] }
unicode-width = { workspace = true }
thiserror = { workspace = true }
fluent = { workspace = true }
+12 -1
View File
@@ -306,13 +306,24 @@ fn get_all_filesystems(opt: &Options) -> UResult<Vec<Filesystem>> {
}
let mut mounts = vec![];
for mi in read_fs_list()? {
for mut mi in read_fs_list()? {
// TODO The running time of the `is_best()` function is linear
// in the length of `result`. That makes the running time of
// this loop quadratic in the length of `vmi`. This could be
// improved by a more efficient implementation of `is_best()`,
// but `vmi` is probably not very long in practice.
if is_included(&mi, opt) && is_best(&mounts, &mi) {
let dev_path: &Path = Path::new(&mi.dev_name);
if dev_path.is_symlink() {
if let Ok(canonicalized_symlink) = uucore::fs::canonicalize(
dev_path,
uucore::fs::MissingHandling::Existing,
uucore::fs::ResolveMode::Logical,
) {
mi.dev_name = canonicalized_symlink.to_string_lossy().to_string();
}
}
mounts.push(mi);
}
}
+16
View File
@@ -123,6 +123,22 @@ fn test_df_output() {
assert_eq!(actual, expected);
}
#[test]
fn test_df_follows_symlinks() {
let output = new_ucmd!()
.arg("-h")
.arg("--output=source")
.succeeds()
.stdout_str_lossy();
let filesystems = output.lines().skip(1).collect::<Vec<&str>>();
assert!(
filesystems
.iter()
.all(|&x| !std::path::Path::new(x).is_symlink())
);
}
#[test]
fn test_df_output_overridden() {
let expected = if cfg!(target_os = "macos") {