mirror of
https://github.com/bootandy/dust.git
synced 2025-12-05 20:40:11 -08:00
* v1.0 * renamed operations to be more clear * put info later because there is still operations par of the preparing process * updated the last line clearing * changed name of module and structs to ones that make more sens * Disable size computation when file_count option is set * added sleep during the thread waiting * use 1024 powered instead of 10 to compute showed number * include DS_Store * added files directories skipped information * small format update * implement the -H option * put wait back * remove PAtomicInfo since it's not used * cargo fmt * wrapped atomic operations to reduce overhead * updated comments * Use AtomicU64Wrapper instead of AtomicU64 in TotalSize * update size suffix * sto dividing size when larger than terabytes * Fix use_iso flag not be set properly * update properties display * some reformating * use stdout instead of print * Moved config instance into main because it's easier to read * merge base formatting into macro * update name to be more intuitive and separated math operations for more flexibility * print currently indexed path * cargo fmt * reset size between each target dirs * Access to TotalSize rather than it's inner * small comment change * Update sysinfo version to 0.26.7 * fix: update use of sysinfo.system System is now much quicker to start but requires an explicit call to refresh memory else it deafults to 0 (oops) * clippy: Fix new clippy * fix: bug where hard links could be double counted When running: dust dir_a dir_b if a file was hard linked in both dir_a and dir_b it would be double counted. This fix resolves this by keeping the shared hashmap around between runs for the second and subsequent arguments. https://github.com/bootandy/dust/issues/282 * Fix: depth=0 bug for multiple arguments https://github.com/bootandy/dust/issues/282 * refactor filter.rs * refactor filter.rs * refactor create AggregateData for filter.rs * feature: Support for dereference links -L follow du has -L flag which allows it to dereference or follow symlinks. Clone this feature into dust. https://github.com/bootandy/dust/issues/276 * refactor dir_walker I find this layout cleaner * v1.0 * changed name of module and structs to ones that make more sens * Disable size computation when file_count option is set * added files directories skipped information * implement the -H option * wrapped atomic operations to reduce overhead * used human_readable_number function in display module rather than our own * implemented progress disabling * cargo fmt & cargo clippy Co-authored-by: Guillaume Gomez <guillaume1.gomez@gmail.com> Co-authored-by: andy.boot <bootandy@gmail.com>
142 lines
4.5 KiB
Rust
142 lines
4.5 KiB
Rust
use assert_cmd::Command;
|
|
use std::fs::File;
|
|
use std::io::Write;
|
|
use std::path::PathBuf;
|
|
use std::str;
|
|
|
|
use tempfile::Builder;
|
|
use tempfile::TempDir;
|
|
|
|
// File sizes differ on both platform and on the format of the disk.
|
|
// Windows: `ln` is not usually an available command; creation of symbolic links requires special enhanced permissions
|
|
|
|
fn build_temp_file(dir: &TempDir) -> PathBuf {
|
|
let file_path = dir.path().join("notes.txt");
|
|
let mut file = File::create(&file_path).unwrap();
|
|
writeln!(file, "I am a temp file").unwrap();
|
|
file_path
|
|
}
|
|
|
|
fn link_it(link_path: PathBuf, file_path_s: &str, is_soft: bool) -> String {
|
|
let link_name_s = link_path.to_str().unwrap();
|
|
let mut c = Command::new("ln");
|
|
if is_soft {
|
|
c.arg("-s");
|
|
}
|
|
c.arg(file_path_s);
|
|
c.arg(link_name_s);
|
|
assert!(c.output().is_ok());
|
|
link_name_s.into()
|
|
}
|
|
|
|
#[cfg_attr(target_os = "windows", ignore)]
|
|
#[test]
|
|
pub fn test_soft_sym_link() {
|
|
let dir = Builder::new().tempdir().unwrap();
|
|
let file = build_temp_file(&dir);
|
|
let dir_s = dir.path().to_str().unwrap();
|
|
let file_path_s = file.to_str().unwrap();
|
|
|
|
let link_name = dir.path().join("the_link");
|
|
let link_name_s = link_it(link_name, file_path_s, true);
|
|
|
|
let c = format!(" ├── {}", link_name_s);
|
|
let b = format!(" ┌── {}", file_path_s);
|
|
let a = format!("─┴ {}", dir_s);
|
|
|
|
let mut cmd = Command::cargo_bin("dust").unwrap();
|
|
// Mac test runners create long filenames in tmp directories
|
|
let output = cmd
|
|
.args(["-p", "-c", "-s", "-w", "999", dir_s])
|
|
.unwrap()
|
|
.stdout;
|
|
|
|
let output = str::from_utf8(&output).unwrap();
|
|
|
|
assert!(output.contains(a.as_str()));
|
|
assert!(output.contains(b.as_str()));
|
|
assert!(output.contains(c.as_str()));
|
|
}
|
|
|
|
#[cfg_attr(target_os = "windows", ignore)]
|
|
#[test]
|
|
pub fn test_hard_sym_link() {
|
|
let dir = Builder::new().tempdir().unwrap();
|
|
let file = build_temp_file(&dir);
|
|
let dir_s = dir.path().to_str().unwrap();
|
|
let file_path_s = file.to_str().unwrap();
|
|
|
|
let link_name = dir.path().join("the_link");
|
|
link_it(link_name, file_path_s, false);
|
|
|
|
let file_output = format!(" ┌── {}", file_path_s);
|
|
let dirs_output = format!("─┴ {}", dir_s);
|
|
|
|
let mut cmd = Command::cargo_bin("dust").unwrap();
|
|
// Mac test runners create long filenames in tmp directories
|
|
let output = cmd.args(["-p", "-c", "-w", "999", dir_s]).unwrap().stdout;
|
|
|
|
// The link should not appear in the output because multiple inodes are now ordered
|
|
// then filtered.
|
|
let output = str::from_utf8(&output).unwrap();
|
|
assert!(output.contains(dirs_output.as_str()));
|
|
assert!(output.contains(file_output.as_str()));
|
|
}
|
|
|
|
#[cfg_attr(target_os = "windows", ignore)]
|
|
#[test]
|
|
pub fn test_hard_sym_link_no_dup_multi_arg() {
|
|
let dir = Builder::new().tempdir().unwrap();
|
|
let dir_link = Builder::new().tempdir().unwrap();
|
|
let file = build_temp_file(&dir);
|
|
let dir_s = dir.path().to_str().unwrap();
|
|
let dir_link_s = dir_link.path().to_str().unwrap();
|
|
let file_path_s = file.to_str().unwrap();
|
|
|
|
let link_name = dir_link.path().join("the_link");
|
|
let link_name_s = link_it(link_name, file_path_s, false);
|
|
|
|
let mut cmd = Command::cargo_bin("dust").unwrap();
|
|
|
|
// Mac test runners create long filenames in tmp directories
|
|
let output = cmd
|
|
.args(["-p", "-c", "-w", "999", "-b", dir_link_s, dir_s])
|
|
.unwrap()
|
|
.stdout;
|
|
|
|
// The link or the file should appear but not both
|
|
let output = str::from_utf8(&output).unwrap();
|
|
let has_file_only = output.contains(file_path_s) && !output.contains(&link_name_s);
|
|
let has_link_only = !output.contains(file_path_s) && output.contains(&link_name_s);
|
|
assert!(has_file_only || has_link_only);
|
|
}
|
|
|
|
#[cfg_attr(target_os = "windows", ignore)]
|
|
#[test]
|
|
pub fn test_recursive_sym_link() {
|
|
let dir = Builder::new().tempdir().unwrap();
|
|
let dir_s = dir.path().to_str().unwrap();
|
|
|
|
let link_name = dir.path().join("the_link");
|
|
let link_name_s = link_it(link_name, dir_s, true);
|
|
|
|
let a = format!("─┬ {}", dir_s);
|
|
let b = format!(" └── {}", link_name_s);
|
|
|
|
let mut cmd = Command::cargo_bin("dust").unwrap();
|
|
let output = cmd
|
|
.arg("-p")
|
|
.arg("-c")
|
|
.arg("-r")
|
|
.arg("-s")
|
|
.arg("-w")
|
|
.arg("999")
|
|
.arg(dir_s)
|
|
.unwrap()
|
|
.stdout;
|
|
let output = str::from_utf8(&output).unwrap();
|
|
|
|
assert!(output.contains(a.as_str()));
|
|
assert!(output.contains(b.as_str()));
|
|
}
|