summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Thiel <sthiel@thoughtworks.com>2019-06-03 15:48:49 +0530
committerSebastian Thiel <sthiel@thoughtworks.com>2019-06-03 15:50:15 +0530
commit74e511631a7f05143e487584a4325fe65c774ba5 (patch)
treed5c94f8e059b61e6b6ad7c2b206895f0579d11af
parent25ceae2779e3e20b4ff4ac3d6149410e5f851775 (diff)
Show directories very similar to ncdu
-rw-r--r--src/common.rs7
-rw-r--r--src/interactive/widgets.rs27
-rw-r--r--src/main.rs7
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 {