mirror of
https://github.com/bootandy/dust.git
synced 2026-01-14 05:47:00 -08:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ebb241188 |
@@ -125,9 +125,9 @@ impl DrawData<'_> {
|
|||||||
|
|
||||||
pub fn draw_it(
|
pub fn draw_it(
|
||||||
idd: InitialDisplayData,
|
idd: InitialDisplayData,
|
||||||
|
root_node: &DisplayNode,
|
||||||
no_percent_bars: bool,
|
no_percent_bars: bool,
|
||||||
terminal_width: usize,
|
terminal_width: usize,
|
||||||
root_node: &DisplayNode,
|
|
||||||
skip_total: bool,
|
skip_total: bool,
|
||||||
) {
|
) {
|
||||||
let num_chars_needed_on_left_most = if idd.by_filecount {
|
let num_chars_needed_on_left_most = if idd.by_filecount {
|
||||||
|
|||||||
@@ -25,49 +25,44 @@ pub fn get_biggest(
|
|||||||
display_data: AggregateData,
|
display_data: AggregateData,
|
||||||
by_filetime: &Option<FileTime>,
|
by_filetime: &Option<FileTime>,
|
||||||
keep_collapsed: HashSet<PathBuf>,
|
keep_collapsed: HashSet<PathBuf>,
|
||||||
) -> Option<DisplayNode> {
|
) -> DisplayNode {
|
||||||
if top_level_nodes.is_empty() {
|
|
||||||
// perhaps change this, bring back Error object?
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
let mut heap = BinaryHeap::new();
|
let mut heap = BinaryHeap::new();
|
||||||
let number_top_level_nodes = top_level_nodes.len();
|
let number_top_level_nodes = top_level_nodes.len();
|
||||||
let root;
|
let root;
|
||||||
|
|
||||||
if number_top_level_nodes > 1 {
|
if number_top_level_nodes == 0 {
|
||||||
let size = if by_filetime.is_some() {
|
root = total_node_builder(0, vec![])
|
||||||
top_level_nodes
|
|
||||||
.iter()
|
|
||||||
.map(|node| node.size)
|
|
||||||
.max()
|
|
||||||
.unwrap_or(0)
|
|
||||||
} else {
|
|
||||||
top_level_nodes.iter().map(|node| node.size).sum()
|
|
||||||
};
|
|
||||||
|
|
||||||
let nodes = handle_duplicate_top_level_names(top_level_nodes, display_data.short_paths);
|
|
||||||
|
|
||||||
root = Node {
|
|
||||||
name: PathBuf::from("(total)"),
|
|
||||||
size,
|
|
||||||
children: nodes,
|
|
||||||
inode_device: None,
|
|
||||||
depth: 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Always include the base nodes if we add a 'parent' (total) node
|
|
||||||
heap = always_add_children(&display_data, &root, heap);
|
|
||||||
} else {
|
} else {
|
||||||
root = top_level_nodes.into_iter().next().unwrap();
|
if number_top_level_nodes > 1 {
|
||||||
|
let size = if by_filetime.is_some() {
|
||||||
|
top_level_nodes
|
||||||
|
.iter()
|
||||||
|
.map(|node| node.size)
|
||||||
|
.max()
|
||||||
|
.unwrap_or(0)
|
||||||
|
} else {
|
||||||
|
top_level_nodes.iter().map(|node| node.size).sum()
|
||||||
|
};
|
||||||
|
|
||||||
|
let nodes = handle_duplicate_top_level_names(top_level_nodes, display_data.short_paths);
|
||||||
|
root = total_node_builder(size, nodes);
|
||||||
|
} else {
|
||||||
|
root = top_level_nodes.into_iter().next().unwrap();
|
||||||
|
}
|
||||||
heap = add_children(&display_data, &root, heap);
|
heap = add_children(&display_data, &root, heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(fill_remaining_lines(
|
fill_remaining_lines(heap, &root, display_data, keep_collapsed)
|
||||||
heap,
|
}
|
||||||
&root,
|
|
||||||
display_data,
|
fn total_node_builder(size: u64, children: Vec<Node>) -> Node {
|
||||||
keep_collapsed,
|
Node {
|
||||||
))
|
name: PathBuf::from("(total)"),
|
||||||
|
size,
|
||||||
|
children,
|
||||||
|
inode_device: None,
|
||||||
|
depth: 0,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fill_remaining_lines<'a>(
|
pub fn fill_remaining_lines<'a>(
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ pub fn get_all_file_types(
|
|||||||
top_level_nodes: &[Node],
|
top_level_nodes: &[Node],
|
||||||
n: usize,
|
n: usize,
|
||||||
by_filetime: &Option<FileTime>,
|
by_filetime: &Option<FileTime>,
|
||||||
) -> Option<DisplayNode> {
|
) -> DisplayNode {
|
||||||
let ext_nodes = {
|
let ext_nodes = {
|
||||||
let mut extension_cumulative_sizes = HashMap::new();
|
let mut extension_cumulative_sizes = HashMap::new();
|
||||||
build_by_all_file_types(top_level_nodes, &mut extension_cumulative_sizes);
|
build_by_all_file_types(top_level_nodes, &mut extension_cumulative_sizes);
|
||||||
@@ -67,13 +67,11 @@ pub fn get_all_file_types(
|
|||||||
displayed.iter().map(|node| node.size).sum()
|
displayed.iter().map(|node| node.size).sum()
|
||||||
};
|
};
|
||||||
|
|
||||||
let result = DisplayNode {
|
DisplayNode {
|
||||||
name: PathBuf::from("(total)"),
|
name: PathBuf::from("(total)"),
|
||||||
size: actual_size,
|
size: actual_size,
|
||||||
children: displayed,
|
children: displayed,
|
||||||
};
|
}
|
||||||
|
|
||||||
Some(result)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_by_all_file_types<'a>(
|
fn build_by_all_file_types<'a>(
|
||||||
|
|||||||
73
src/main.rs
73
src/main.rs
@@ -11,6 +11,9 @@ mod progress;
|
|||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
use crate::cli::Cli;
|
use crate::cli::Cli;
|
||||||
|
use crate::config::Config;
|
||||||
|
use crate::display_node::DisplayNode;
|
||||||
|
use crate::node::FileTime;
|
||||||
use crate::progress::RuntimeErrors;
|
use crate::progress::RuntimeErrors;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use dir_walker::WalkData;
|
use dir_walker::WalkData;
|
||||||
@@ -298,32 +301,52 @@ fn main() {
|
|||||||
let print_errors = config.get_print_errors(&options);
|
let print_errors = config.get_print_errors(&options);
|
||||||
print_any_errors(print_errors, walk_data.errors);
|
print_any_errors(print_errors, walk_data.errors);
|
||||||
|
|
||||||
if let Some(root_node) = tree {
|
print_output(
|
||||||
if config.get_output_json(&options) {
|
config,
|
||||||
OUTPUT_TYPE.with(|wrapped| {
|
options,
|
||||||
wrapped.replace(output_format);
|
tree,
|
||||||
});
|
walk_data.by_filecount,
|
||||||
println!("{}", serde_json::to_string(&root_node).unwrap());
|
by_filetime,
|
||||||
} else {
|
is_colors,
|
||||||
let idd = InitialDisplayData {
|
terminal_width,
|
||||||
short_paths: !config.get_full_paths(&options),
|
)
|
||||||
is_reversed: !config.get_reverse(&options),
|
}
|
||||||
colors_on: is_colors,
|
|
||||||
by_filecount,
|
|
||||||
by_filetime,
|
|
||||||
is_screen_reader: config.get_screen_reader(&options),
|
|
||||||
output_format,
|
|
||||||
bars_on_right: config.get_bars_on_right(&options),
|
|
||||||
};
|
|
||||||
|
|
||||||
draw_it(
|
fn print_output(
|
||||||
idd,
|
config: Config,
|
||||||
config.get_no_bars(&options),
|
options: Cli,
|
||||||
terminal_width,
|
tree: DisplayNode,
|
||||||
&root_node,
|
by_filecount: bool,
|
||||||
config.get_skip_total(&options),
|
by_filetime: Option<FileTime>,
|
||||||
)
|
is_colors: bool,
|
||||||
}
|
terminal_width: usize,
|
||||||
|
) {
|
||||||
|
let output_format = config.get_output_format(&options);
|
||||||
|
|
||||||
|
if config.get_output_json(&options) {
|
||||||
|
OUTPUT_TYPE.with(|wrapped| {
|
||||||
|
wrapped.replace(output_format);
|
||||||
|
});
|
||||||
|
println!("{}", serde_json::to_string(&tree).unwrap());
|
||||||
|
} else {
|
||||||
|
let idd = InitialDisplayData {
|
||||||
|
short_paths: !config.get_full_paths(&options),
|
||||||
|
is_reversed: !config.get_reverse(&options),
|
||||||
|
colors_on: is_colors,
|
||||||
|
by_filecount,
|
||||||
|
by_filetime,
|
||||||
|
is_screen_reader: config.get_screen_reader(&options),
|
||||||
|
output_format,
|
||||||
|
bars_on_right: config.get_bars_on_right(&options),
|
||||||
|
};
|
||||||
|
|
||||||
|
draw_it(
|
||||||
|
idd,
|
||||||
|
&tree,
|
||||||
|
config.get_no_bars(&options),
|
||||||
|
terminal_width,
|
||||||
|
config.get_skip_total(&options),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user