console-rs / indicatif

A command line progress reporting library for Rust
MIT License
4.22k stars 238 forks source link

Crash if progress stops #554

Closed conradoplg closed 1 year ago

conradoplg commented 1 year ago

If progress stops and an ETA is being displayed, it will eventually crash after overflowing.

This modified download.rs shows this. It crashes after some minutes.

use std::thread;
use std::time::Duration;
use std::{cmp::min, fmt::Write};

use indicatif::{ProgressBar, ProgressState, ProgressStyle};

fn main() {
    let mut downloaded = 0;
    let total_size = 231231231;

    let pb = ProgressBar::new(total_size);
    pb.set_style(ProgressStyle::with_template("{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({eta})")
        .unwrap()
        // .with_key("eta", |state: &ProgressState, w: &mut dyn Write| write!(w, "{:.1}s", state.eta().as_secs_f64()).unwrap())
        .progress_chars("#>-"));

    let mut packet = 1;
    while downloaded < total_size {
        let new = min(downloaded + packet, total_size);
        packet = packet.saturating_sub(1);
        downloaded = new;
        pb.set_position(new);
        thread::sleep(Duration::from_millis(12));
    }

    pb.finish_with_message("downloaded");
}

I'll open a PR shortly with a possible solution.

teor2345 commented 1 year ago

Closed by #555?

djc commented 1 year ago

Yup, thanks.