diff options
author | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-06-03 15:48:49 +0530 |
---|---|---|
committer | Sebastian Thiel <sthiel@thoughtworks.com> | 2019-06-03 15:50:15 +0530 |
commit | 74e511631a7f05143e487584a4325fe65c774ba5 (patch) | |
tree | d5c94f8e059b61e6b6ad7c2b206895f0579d11af | |
parent | 25ceae2779e3e20b4ff4ac3d6149410e5f851775 (diff) |
Show directories very similar to ncdu
-rw-r--r-- | src/common.rs | 7 | ||||
-rw-r--r-- | src/interactive/widgets.rs | 27 | ||||
-rw-r--r-- | src/main.rs | 7 |
3 files changed, 35 insertions, 6 deletions
diff --git a/src/common.rs b/src/common.rs index ccf8a09..43c67f7 100644 --- a/src/common.rs +++ b/src/common.rs @@ -4,10 +4,13 @@ use jwalk::WalkDir; use petgraph::Direction; use std::{fmt, path::Path}; -pub(crate) fn get_size_or_panic(tree: &Tree, node_idx: TreeIndex) -> u64 { +pub(crate) fn get_entry_or_panic(tree: &Tree, node_idx: TreeIndex) -> &EntryData { tree.node_weight(node_idx) .expect("node should always be retrievable with valid index") - .size +} + +pub(crate) fn get_size_or_panic(tree: &Tree, node_idx: TreeIndex) -> u64 { + get_entry_or_panic(tree, node_idx).size } pub(crate) fn sorted_entries( diff --git a/src/interactive/widgets.rs b/src/interactive/widgets.rs index 80adfe9..0e0a58d 100644 --- a/src/interactive/widgets.rs +++ b/src/interactive/widgets.rs @@ -1,5 +1,6 @@ use super::{DisplayOptions, Traversal, Tree, TreeIndex}; -use crate::{sorted_entries, ByteFormat}; +use crate::{get_entry_or_panic, sorted_entries, ByteFormat}; +use std::path::PathBuf; use tui::layout::{Constraint, Direction, Layout}; use tui::style::{Color, Style}; use tui::{ @@ -128,6 +129,27 @@ impl<'a> Widget for Entries<'a> { sorting, selected, } = self; + let is_dir = |mut node_idx| { + const THE_ROOT: usize = 1; + let mut entries = Vec::new(); + + while let Some(parent_idx) = + tree.neighbors_directed(node_idx, petgraph::Incoming).next() + { + entries.push(get_entry_or_panic(tree, node_idx)); + node_idx = parent_idx; + } + entries.push(get_entry_or_panic(tree, node_idx)); + entries + .iter() + .rev() + .skip(THE_ROOT) + .fold(PathBuf::new(), |mut acc, entry| { + acc.push(&entry.name); + acc + }) + .is_dir() + }; let entries = sorted_entries(tree, *root, *sorting); let total: u64 = entries.iter().map(|(_, w)| w.size).sum(); List::new(entries.iter().map(|(node_idx, w)| { @@ -145,9 +167,10 @@ impl<'a> Widget for Entries<'a> { }; Text::Styled( format!( - "{} | {:.02}% | {}", + "{} | {:>5.02}% | {}{}", display.byte_format.display(w.size), (w.size as f64 / total as f64) * 100.0, + if is_dir(*node_idx) { "/" } else { " " }, w.name.to_string_lossy() ) .into(), diff --git a/src/main.rs b/src/main.rs index 0ff205f..fca4014 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,8 +39,11 @@ fn run() -> Result<(), Error> { Terminal::new(backend) .with_context(|_| "Interactive mode requires a connected terminal")? }; - let mut app = - dua::interactive::TerminalApp::initialize(&mut terminal, walk_options, input)?; + let mut app = dua::interactive::TerminalApp::initialize( + &mut terminal, + walk_options, + paths_from(input)?, + )?; app.process_events(&mut terminal, io::stdin().keys())? } Some(Aggregate { |