diff --git a/bmap-rs/Cargo.toml b/bmap-rs/Cargo.toml index 471bc08..f0a3b5d 100644 --- a/bmap-rs/Cargo.toml +++ b/bmap-rs/Cargo.toml @@ -12,3 +12,4 @@ anyhow = "1.0.66" nix = "0.25.0" flate2 = "1.0.24" clap = { version = "4.0.18", features = ["derive"] } +indicatif = "0.17.1" \ No newline at end of file diff --git a/bmap-rs/src/main.rs b/bmap-rs/src/main.rs index 5e7a9e4..0f80185 100644 --- a/bmap-rs/src/main.rs +++ b/bmap-rs/src/main.rs @@ -2,8 +2,10 @@ use anyhow::{anyhow, bail, Context, Result}; use bmap::{Bmap, Discarder, SeekForward}; use clap::Parser; use flate2::read::GzDecoder; +use indicatif::{ProgressBar, ProgressState, ProgressStyle}; use nix::unistd::ftruncate; use std::ffi::OsStr; +use std::fmt::Write; use std::fs::File; use std::io::Read; use std::os::unix::io::AsRawFd; @@ -100,7 +102,7 @@ fn copy(c: Copy) -> Result<()> { b.read_to_string(&mut xml)?; let bmap = Bmap::from_xml(&xml)?; - let mut output = std::fs::OpenOptions::new() + let output = std::fs::OpenOptions::new() .write(true) .create(true) .open(c.dest)?; @@ -111,7 +113,14 @@ fn copy(c: Copy) -> Result<()> { } let mut input = setup_input(&c.image)?; - bmap::copy(&mut input, &mut output, &bmap)?; + let pb = ProgressBar::new(bmap.total_mapped_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("#>-")); + bmap::copy(&mut input, &mut pb.wrap_write(&output), &bmap)?; + pb.finish_and_clear(); + println!("Done: Syncing..."); output.sync_all().expect("Sync failure"); diff --git a/bmap/src/bmap.rs b/bmap/src/bmap.rs index 6469e7c..1ce56dd 100644 --- a/bmap/src/bmap.rs +++ b/bmap/src/bmap.rs @@ -92,6 +92,9 @@ impl Bmap { pub fn block_map(&self) -> impl ExactSizeIterator + Iterator { self.blockmap.iter() } + pub fn total_mapped_size(&self) -> u64 { + self.block_size * self.mapped_blocks + } } #[derive(Clone, Debug, Error)]