mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-26 06:01:48 +00:00
progress: fix progress to not redraw every time there's new data
I think the idea of the code was try do 30 updates per second even if events arrive at, say, every 20 milliseconds. If we had reset the timer every time we printed, we would otherwise reset the timer every 40 milliseconds and end up with 25 updates per second. However, a bug in the code caused it to print every update because it always set the threshold to print the next update to `now`. I tried to keep what I think was the intent of the original code while fixing the bug.
This commit is contained in:
parent
4fc539b801
commit
27c2882b10
2 changed files with 11 additions and 8 deletions
|
@ -29,6 +29,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
* Fixed incompatible rendering of empty hunks in git/unified diffs.
|
* Fixed incompatible rendering of empty hunks in git/unified diffs.
|
||||||
[#5049](https://github.com/martinvonz/jj/issues/5049)
|
[#5049](https://github.com/martinvonz/jj/issues/5049)
|
||||||
|
|
||||||
|
* Fixed performance of progress bar rendering when fetching from Git remote.
|
||||||
|
[#5057](https://github.com/martinvonz/jj/issues/5057)
|
||||||
|
|
||||||
## [0.24.0] - 2024-12-04
|
## [0.24.0] - 2024-12-04
|
||||||
|
|
||||||
### Release highlights
|
### Release highlights
|
||||||
|
|
|
@ -53,6 +53,7 @@ impl Progress {
|
||||||
if now < self.next_print {
|
if now < self.next_print {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
self.next_print = now + Duration::from_secs(1) / UPDATE_HZ;
|
||||||
if self.guard.is_none() {
|
if self.guard.is_none() {
|
||||||
let guard = output.output_guard(crossterm::cursor::Show.to_string());
|
let guard = output.output_guard(crossterm::cursor::Show.to_string());
|
||||||
let guard = CleanupGuard::new(move || {
|
let guard = CleanupGuard::new(move || {
|
||||||
|
@ -61,7 +62,6 @@ impl Progress {
|
||||||
_ = write!(output, "{}", crossterm::cursor::Hide);
|
_ = write!(output, "{}", crossterm::cursor::Hide);
|
||||||
self.guard = Some(guard);
|
self.guard = Some(guard);
|
||||||
}
|
}
|
||||||
self.next_print = now.min(self.next_print + Duration::from_secs(1) / UPDATE_HZ);
|
|
||||||
|
|
||||||
self.buffer.clear();
|
self.buffer.clear();
|
||||||
write!(self.buffer, "\r").unwrap();
|
write!(self.buffer, "\r").unwrap();
|
||||||
|
@ -260,14 +260,14 @@ mod tests {
|
||||||
// First output is after the initial delay
|
// First output is after the initial delay
|
||||||
assert_snapshot!(update(INITIAL_DELAY - Duration::from_millis(1), 0.1), @"");
|
assert_snapshot!(update(INITIAL_DELAY - Duration::from_millis(1), 0.1), @"");
|
||||||
assert_snapshot!(update(Duration::from_millis(1), 0.10), @"[?25l\r 10% [█▊ ][K");
|
assert_snapshot!(update(Duration::from_millis(1), 0.10), @"[?25l\r 10% [█▊ ][K");
|
||||||
// TODO: No updates for the next 30 milliseconds
|
// No updates for the next 30 milliseconds
|
||||||
assert_snapshot!(update(Duration::from_millis(10), 0.11), @" 11% [██ ][K");
|
assert_snapshot!(update(Duration::from_millis(10), 0.11), @"");
|
||||||
assert_snapshot!(update(Duration::from_millis(10), 0.12), @" 12% [██▏ ][K");
|
assert_snapshot!(update(Duration::from_millis(10), 0.12), @"");
|
||||||
assert_snapshot!(update(Duration::from_millis(10), 0.13), @" 13% [██▍ ][K");
|
assert_snapshot!(update(Duration::from_millis(10), 0.13), @"");
|
||||||
// We get an update now that we go over the threshold
|
// We get an update now that we go over the threshold
|
||||||
assert_snapshot!(update(Duration::from_millis(100), 0.30), @" 30% [█████▍ ][K");
|
assert_snapshot!(update(Duration::from_millis(100), 0.30), @" 30% [█████▍ ][K");
|
||||||
// TODO: Even though we went over by quite a bit, the new threshold is relative
|
// Even though we went over by quite a bit, the new threshold is relative to the
|
||||||
// to the previous output, so we don't get an update here
|
// previous output, so we don't get an update here
|
||||||
assert_snapshot!(update(Duration::from_millis(30), 0.40), @" 40% [███████▎ ][K");
|
assert_snapshot!(update(Duration::from_millis(30), 0.40), @"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue