summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Thiel <sebastian.thiel@icloud.com>2023-05-05 12:31:41 +0200
committerSebastian Thiel <sebastian.thiel@icloud.com>2023-05-05 12:34:47 +0200
commit13bfe4582f8cbf6f8f12e7ee8acaae710e8a87d2 (patch)
treeaa09f454cd7e2fa4d3c1551c0ad5c7c3c94090b9
parent565581fc11faf7512c27fe9095090f482a8d32f0 (diff)
feat: TUI now shows performance metrics while scanning and after.
This is in preparation for the `moonwalk` upgrade.
-rw-r--r--src/interactive/widgets/footer.rs17
-rw-r--r--src/interactive/widgets/main.rs4
-rw-r--r--src/traverse.rs13
3 files changed, 31 insertions, 3 deletions
diff --git a/src/interactive/widgets/footer.rs b/src/interactive/widgets/footer.rs
index 0414b76..453dc9a 100644
--- a/src/interactive/widgets/footer.rs
+++ b/src/interactive/widgets/footer.rs
@@ -14,6 +14,8 @@ pub struct Footer;
pub struct FooterProps {
pub total_bytes: Option<u128>,
pub entries_traversed: u64,
+ pub traversal_start: std::time::Instant,
+ pub elapsed: Option<std::time::Duration>,
pub format: ByteFormat,
pub message: Option<String>,
}
@@ -23,18 +25,31 @@ impl Footer {
let FooterProps {
total_bytes,
entries_traversed,
+ elapsed,
+ traversal_start,
format,
message,
} = props.borrow();
let spans = vec![
Span::from(format!(
- " Total disk usage: {} Entries: {} ",
+ " Total disk usage: {} Entries: {} {progress} ",
match total_bytes {
Some(b) => format!("{}", format.display(*b)),
None => "-".to_owned(),
},
entries_traversed,
+ progress = match elapsed {
+ Some(elapsed) => format!("in {:.02}s", elapsed.as_secs_f32()),
+ None => {
+ let elapsed = traversal_start.elapsed();
+ format!(
+ "in {:.0}s ({:.0}/s)",
+ elapsed.as_secs_f32(),
+ *entries_traversed as f32 / elapsed.as_secs_f32()
+ )
+ }
+ }
))
.into(),
message.as_ref().map(|m| {
diff --git a/src/interactive/widgets/main.rs b/src/interactive/widgets/main.rs
index 6d1a53a..2c9c903 100644
--- a/src/interactive/widgets/main.rs
+++ b/src/interactive/widgets/main.rs
@@ -42,6 +42,8 @@ impl MainWindow {
tree,
entries_traversed,
total_bytes,
+ start,
+ elapsed,
..
},
display,
@@ -138,6 +140,8 @@ impl MainWindow {
format: display.byte_format,
entries_traversed: *entries_traversed,
message: state.message.clone(),
+ traversal_start: *start,
+ elapsed: *elapsed,
},
footer_area,
buf,
diff --git a/src/traverse.rs b/src/traverse.rs
index d33eed1..7296274 100644
--- a/src/traverse.rs
+++ b/src/traverse.rs
@@ -22,7 +22,7 @@ pub struct EntryData {
}
/// The result of the previous filesystem traversal
-#[derive(Default, Debug)]
+#[derive(Debug)]
pub struct Traversal {
/// A tree representing the entire filestem traversal
pub tree: Tree,
@@ -30,6 +30,10 @@ pub struct Traversal {
pub root_index: TreeIndex,
/// Amount of files or directories we have seen during the filesystem traversal
pub entries_traversed: u64,
+ /// The time at which the traversal started.
+ pub start: std::time::Instant,
+ /// The amount of time it took to finish the traversal. Set only once done.
+ pub elapsed: Option<std::time::Duration>,
/// Total amount of IO errors encountered when traversing the filesystem
pub io_errors: u64,
/// Total amount of bytes seen during the traversal
@@ -62,7 +66,11 @@ impl Traversal {
Traversal {
tree,
root_index,
- ..Default::default()
+ entries_traversed: 0,
+ start: std::time::Instant::now(),
+ elapsed: None,
+ io_errors: 0,
+ total_bytes: None,
}
};
@@ -201,6 +209,7 @@ impl Traversal {
set_size_or_panic(&mut t.tree, t.root_index, root_size);
t.total_bytes = Some(root_size);
+ t.elapsed = Some(t.start.elapsed());
Ok(Some(t))
}