this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(7z): add progress bars during extraction

+23 -6
+23 -6
src/backends/sevenz.rs
··· 8 8 use clap::Args; 9 9 use indicatif::ProgressBar; 10 10 use sevenz_rust2::{ 11 - ArchiveEntry, ArchiveReader, ArchiveWriter, Password, decompress, decompress_file, 12 - encoder_options::Lzma2Options, 11 + ArchiveEntry, ArchiveReader, ArchiveWriter, Password, decompress, encoder_options::Lzma2Options, 13 12 }; 14 13 use std::fs::File; 15 14 use std::io::{self, Empty, Seek, SeekFrom, Write}; ··· 49 48 compression_level: args.level_args.resolve(&DefaultCompressionValidator), 50 49 progress_args: args.progress_args, 51 50 } 51 + } 52 + 53 + /// Extract a seekable 7z input with a byte-level progress bar keyed to 54 + /// the compressed archive size. 55 + fn decompress_seekable<R: io::Read + Seek>( 56 + &self, 57 + reader: R, 58 + size: u64, 59 + out_dir: &Path, 60 + ) -> Result { 61 + let bar = create_progress_bar(Some(size), self.progress_args.progress, OutputTarget::File); 62 + let reader = ProgressReader::new(reader, bar.clone()); 63 + decompress(reader, out_dir)?; 64 + if let Some(b) = bar { 65 + b.finish(); 66 + } 67 + Ok(()) 52 68 } 53 69 54 70 /// Compress to the given seekable writer, walking path inputs ourselves ··· 150 166 if paths.len() != 1 { 151 167 bail!("7z extraction expects exactly one archive file"); 152 168 } 153 - decompress_file(&paths[0], out_dir)?; 154 - Ok(()) 169 + let file = File::open(&paths[0])?; 170 + let size = file.metadata()?.len(); 171 + self.decompress_seekable(file, size, out_dir) 155 172 } 156 173 CmprssInput::Pipe(mut pipe) => { 157 174 let mut temp_file = tempfile()?; 158 175 io::copy(&mut pipe, &mut temp_file)?; 159 176 temp_file.seek(SeekFrom::Start(0))?; 160 - decompress(temp_file, out_dir)?; 161 - Ok(()) 177 + let size = temp_file.metadata()?.len(); 178 + self.decompress_seekable(temp_file, size, out_dir) 162 179 } 163 180 CmprssInput::Reader(_) => { 164 181 bail!(