Skip to content

Commit a388c9a

Browse files
committed
df(windows): fix Avail/Use% by using number_of_free_clusters for bavail (#7461)
1 parent b4423b9 commit a388c9a

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

src/uucore/src/lib/features/fsext.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,9 @@ impl FsUsage {
683683
// Total number of free blocks.
684684
bfree: number_of_free_clusters as u64,
685685
// Total number of free blocks available to non-privileged processes.
686-
bavail: 0,
686+
// Windows: 'bavail' should reflect free clusters available to non-privileged processes.
687+
// See: https://github.com/uutils/coreutils/issues/7461
688+
bavail: number_of_free_clusters as u64,
687689
bavail_top_bit_set: ((bytes_per_sector as u64) & (1u64.rotate_right(1))) != 0,
688690
// Total number of file nodes (inodes) on the file system.
689691
files: 0, // Not available on windows
@@ -1215,4 +1217,15 @@ mod tests {
12151217
crate::os_str_from_bytes(b"/mnt/some- -dir-\xf3").unwrap()
12161218
);
12171219
}
1220+
1221+
#[test]
1222+
#[cfg(windows)]
1223+
fn test_windows_fs_usage_bavail_not_zero() {
1224+
// Regression test for issue #7461: bavail should reflect actual free clusters
1225+
use std::path::Path;
1226+
1227+
if let Ok(fs_usage) = FsUsage::new(Path::new(".")) {
1228+
assert!(fs_usage.bavail >= 0);
1229+
}
1230+
}
12181231
}

tests/by-util/test_df.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,3 +973,23 @@ fn test_nonexistent_file() {
973973
.stderr_is("df: does-not-exist: No such file or directory\n")
974974
.stdout_is("File\n.\n");
975975
}
976+
977+
#[test]
978+
#[cfg(target_os = "windows")]
979+
fn test_windows_avail_column_not_zero() {
980+
// Regression test for issue #7461: Avail column should not be 0 on Windows
981+
let output = new_ucmd!()
982+
.args(&["--output=avail"])
983+
.succeeds()
984+
.stdout_str_lossy();
985+
986+
let lines: Vec<&str> = output.lines().skip(1).collect();
987+
assert!(!lines.is_empty(), "Should have at least one filesystem");
988+
989+
// At least one filesystem should have non-zero avail
990+
let has_non_zero = lines.iter().any(|line| {
991+
line.trim().parse::<u64>().map(|v| v > 0).unwrap_or(false)
992+
});
993+
994+
assert!(has_non_zero, "At least one filesystem should have non-zero available space");
995+
}

0 commit comments

Comments
 (0)