aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/archive.rs22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/archive.rs b/src/archive.rs
index cc39207..47af660 100644
--- a/src/archive.rs
+++ b/src/archive.rs
@@ -1,7 +1,8 @@
use bytes::Bytes;
+use libflate::gzip::Encoder;
use serde::Deserialize;
use std::fs::{File, OpenOptions};
-use std::io::Read;
+use std::io::{self, Read};
use std::path::PathBuf;
use tar::Builder;
use tempfile::tempdir;
@@ -61,6 +62,7 @@ fn tgz_compress(dir: &PathBuf) -> Result<(String, usize, Bytes), CompressionErro
let src_dir = dir.display().to_string();
let inner_folder = dir.file_name()?.to_str()?;
let dst_filename = format!("{}.tar", inner_folder);
+ let dst_tgz_filename = format!("{}.gz", dst_filename);
let tmp_dir = tempdir()?;
let dst_filepath = tmp_dir.path().join(dst_filename.clone());
@@ -70,11 +72,21 @@ fn tgz_compress(dir: &PathBuf) -> Result<(String, usize, Bytes), CompressionErro
tar_builder.finish()?;
let mut tar_file = OpenOptions::new().read(true).open(&dst_filepath)?;
- let mut contents = Vec::new();
- let content_length = tar_file.read_to_end(&mut contents).unwrap();
+ let mut tar_content = Vec::new();
+ let content_length = tar_file.read_to_end(&mut tar_content).unwrap();
+
+ let gz_data = gzip(&mut tar_content)?;
let mut data = Bytes::new();
- data.extend_from_slice(&contents);
+ data.extend_from_slice(&gz_data);
+
+ Ok((dst_tgz_filename, content_length, data))
+}
+
+fn gzip(mut data: &[u8]) -> Result<Vec<u8>, CompressionError> {
+ let mut encoder = Encoder::new(Vec::new())?;
+ io::copy(&mut data, &mut encoder)?;
+ let data = encoder.finish().into_result()?;
- Ok((dst_filename, content_length, data))
+ Ok(data)
}