feat: add progressbar for initramfs compression

This commit is contained in:
2026-06-17 10:11:04 +02:00
parent 4475dff141
commit 3e3af3dab8
+27 -7
View File
@@ -160,22 +160,42 @@ fn create_initramfs(rootfs: &PathBuf) -> Result<PathBuf> {
// 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)
}