this repo has no description
0
fork

Configure Feed

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

feat(zip): add progress bars during extraction

+27 -7
+20 -6
src/backends/zip.rs
··· 56 56 .compression_level(Some(self.compression_level as i64)) 57 57 } 58 58 59 + fn extract_seekable<R: std::io::Read + Seek>( 60 + &self, 61 + reader: R, 62 + size: u64, 63 + out_dir: &Path, 64 + ) -> Result { 65 + let bar = create_progress_bar(Some(size), self.progress_args.progress, OutputTarget::File); 66 + let reader = ProgressReader::new(reader, bar.clone()); 67 + let mut archive = ZipArchive::new(reader)?; 68 + archive.extract(out_dir)?; 69 + if let Some(b) = bar { 70 + b.finish(); 71 + } 72 + Ok(()) 73 + } 74 + 59 75 fn compress_to_file<W: Write + Seek>( 60 76 &self, 61 77 input: CmprssInput, ··· 166 182 bail!("zip extraction expects exactly one archive file"); 167 183 } 168 184 let file = File::open(&paths[0])?; 169 - let mut archive = ZipArchive::new(file)?; 170 - Ok(archive.extract(out_dir)?) 185 + let size = file.metadata()?.len(); 186 + self.extract_seekable(file, size, out_dir) 171 187 } 172 188 CmprssInput::Pipe(mut pipe) => { 173 189 // Create a temporary file to store the zip content ··· 178 194 179 195 // Reset the file position to the beginning 180 196 temp_file.seek(SeekFrom::Start(0))?; 181 - 182 - // Extract from the temporary file 183 - let mut archive = ZipArchive::new(temp_file)?; 184 - Ok(archive.extract(out_dir)?) 197 + let size = temp_file.metadata()?.len(); 198 + self.extract_seekable(temp_file, size, out_dir) 185 199 } 186 200 CmprssInput::Reader(_) => { 187 201 bail!(
+7 -1
src/progress.rs
··· 1 1 use clap::Args; 2 2 use indicatif::{HumanBytes, ProgressBar}; 3 - use std::io::{self, Read, Write}; 3 + use std::io::{self, Read, Seek, SeekFrom, Write}; 4 4 use std::str::FromStr; 5 5 use std::time::Duration; 6 6 use std::time::Instant; ··· 179 179 self.maybe_update_progress(bytes_read as u64); 180 180 } 181 181 Ok(bytes_read) 182 + } 183 + } 184 + 185 + impl<R: Seek> Seek for ProgressReader<R> { 186 + fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> { 187 + self.inner.seek(pos) 182 188 } 183 189 } 184 190