mirror of
https://github.com/bootandy/dust.git
synced 2026-06-08 11:29:05 +03:00
00c7ce8f15
Code changes: Removed ignore & channel crates. Using a single reciever thread to build a hashmap to prevend duplicate inodes being reported gave a severe performance penalty Using rayon crate with some hand crafted file traversal has improved performance aprox 10X Behaviour changes: Removed parameter 'limit by filesystem' - don't think this is used, and I only added it as it was easy to add with the ignore crate. Sym links will now not appear in the output tree unless using '-s' 'apparent-size' flag Change behaviour of multiple args so that it unifies them and compares them under one tree instead of treating them individually: https://github.com/bootandy/dust/issues/136
55 lines
1.2 KiB
Rust
55 lines
1.2 KiB
Rust
use crate::platform::get_metadata;
|
|
|
|
use std::cmp::Ordering;
|
|
use std::path::PathBuf;
|
|
|
|
#[derive(Debug, Eq, Clone)]
|
|
pub struct Node {
|
|
pub name: PathBuf,
|
|
pub size: u64,
|
|
pub children: Vec<Node>,
|
|
pub inode_device: Option<(u64, u64)>,
|
|
}
|
|
|
|
pub fn build_node(
|
|
dir: PathBuf,
|
|
children: Vec<Node>,
|
|
use_apparent_size: bool,
|
|
by_filecount: bool,
|
|
) -> Option<Node> {
|
|
match get_metadata(&dir, use_apparent_size) {
|
|
Some(data) => {
|
|
let (size, inode_device) = if by_filecount { (1, data.1) } else { data };
|
|
Some(Node {
|
|
name: dir,
|
|
size,
|
|
children,
|
|
inode_device,
|
|
})
|
|
}
|
|
None => None,
|
|
}
|
|
}
|
|
|
|
impl PartialEq for Node {
|
|
fn eq(&self, other: &Self) -> bool {
|
|
self.name == other.name && self.size == other.size && self.children == other.children
|
|
}
|
|
}
|
|
|
|
impl Ord for Node {
|
|
fn cmp(&self, other: &Self) -> Ordering {
|
|
if self.size == other.size {
|
|
self.name.cmp(&other.name)
|
|
} else {
|
|
self.size.cmp(&other.size)
|
|
}
|
|
}
|
|
}
|
|
|
|
impl PartialOrd for Node {
|
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
Some(self.cmp(other))
|
|
}
|
|
}
|