cli_xtask/
archive.rs
1use cargo_metadata::camino::Utf8Path;
4use flate2::{write::GzEncoder, Compression};
5
6use crate::{fs::ToRelative, Result};
7
8#[tracing::instrument(name = "archive::create", skip_all, err)]
19pub fn create(
20 archive_path: impl AsRef<Utf8Path>,
21 src: impl IntoIterator<Item = impl AsRef<Utf8Path>>,
22) -> Result<()> {
23 let archive = crate::fs::create_file(&archive_path)?;
24 let enc = GzEncoder::new(archive, Compression::default());
25 let mut tar = tar::Builder::new(enc);
26
27 for src in src.into_iter() {
28 let src = src.as_ref();
29 if src.is_file() {
30 tracing::info!("adding file: {}", src.to_relative());
31 tar.append_path_with_name(src, src.file_name().unwrap())?;
32 } else {
33 tracing::info!("adding directory: {}", src.to_relative());
34 tar.append_dir_all(src.file_name().unwrap(), src)?;
35 }
36 }
37
38 let enc = tar.into_inner()?;
40 let archive = enc.finish()?;
41 archive.sync_all()?;
42
43 Ok(())
44}