From 13f5f8096369635b6da0eecde40a92a1be942a28 Mon Sep 17 00:00:00 2001 From: rlee287 Date: Fri, 23 Sep 2022 12:19:07 -0400 Subject: [PATCH 1/2] Reset estimator of progress rate on backwards movement --- src/state.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/state.rs b/src/state.rs index a3228c81..c9fffe77 100644 --- a/src/state.rs +++ b/src/state.rs @@ -385,6 +385,11 @@ impl Estimator { fn record(&mut self, new: u64, now: Instant) { let delta = new.saturating_sub(self.prev.0); if delta == 0 || now < self.prev.1 { + // Reset on backwards seek to prevent breakage from seeking to the end for length determination + // See https://github.com/console-rs/indicatif/issues/480 + if new < self.prev.0 { + self.reset(now); + } return; } From 455f0e29c978fc58ea42c1b6311131da1660d73b Mon Sep 17 00:00:00 2001 From: rlee287 Date: Fri, 23 Sep 2022 17:22:17 -0400 Subject: [PATCH 2/2] Update test to ensure reset occurs after rewind --- src/state.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/state.rs b/src/state.rs index c9fffe77..fb7de2be 100644 --- a/src/state.rs +++ b/src/state.rs @@ -622,8 +622,11 @@ mod tests { let mut est = Estimator::new(now); est.record(0, now); est.record(1, now); + assert_eq!(est.len(), 1); // Should not panic. est.record(0, now); + // Assert that the state of the estimator reset on rewind + assert_eq!(est.len(), 0); let pb = ProgressBar::hidden(); pb.set_length(10);