diff --git a/src/qemu_vm.rs b/src/qemu_vm.rs index 6f89b2d..dd734d3 100644 --- a/src/qemu_vm.rs +++ b/src/qemu_vm.rs @@ -160,22 +160,42 @@ fn create_initramfs(rootfs: &PathBuf) -> Result { // Create the cpio archive with progress let cpio_data = create_cpio_archive(rootfs, &pb)?; + let total_bytes = cpio_data.len() as u64; + let file_count = pb.position(); - pb.set_message("Compressing initramfs..."); + // Finish the scanning progress bar + pb.finish_and_clear(); - // Compress with gzip + // Create progress bar for compression + let compress_pb = ProgressBar::new(total_bytes); + compress_pb.set_style(ProgressStyle::default_bar() + .template("{spinner:.green} Compressing initramfs... {bytes}/{total_bytes} ({eta})") + .unwrap() + .progress_chars("##-")); + + // Compress with gzip, writing in chunks to update progress let mut output_file = std::fs::File::create(&initramfs_path) .context("Failed to create initramfs file")?; - let mut encoder = flate2::write::GzEncoder::new(&mut output_file, flate2::Compression::default()); - encoder.write_all(&cpio_data) - .context("Failed to write compressed initramfs")?; + let mut encoder = flate2::write::GzEncoder::new(&mut output_file, flate2::Compression::fast()); + + // Write in 64KB chunks to provide progress updates + const CHUNK_SIZE: usize = 64 * 1024; + let mut offset = 0; + while offset < cpio_data.len() { + let end = std::cmp::min(offset + CHUNK_SIZE, cpio_data.len()); + encoder.write_all(&cpio_data[offset..end]) + .context("Failed to write compressed initramfs")?; + offset = end; + compress_pb.set_position(offset as u64); + } encoder.finish() .context("Failed to finalize gzip compression")?; // Clear progress bar and print message only in verbose mode - pb.finish_and_clear(); - veprintln!("Initramfs created: {} bytes, {} files", cpio_data.len(), pb.position()); + compress_pb.finish_and_clear(); + veprintln!("Initramfs created: {} bytes -> {} bytes compressed, {} files", + total_bytes, output_file.metadata().ok().map(|m| m.len()).unwrap_or(0), file_count); Ok(initramfs_path) }