diff options
Diffstat (limited to 'src/util/tar.rs')
-rw-r--r-- | src/util/tar.rs | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/util/tar.rs b/src/util/tar.rs index 07ad795..885663e 100644 --- a/src/util/tar.rs +++ b/src/util/tar.rs @@ -1,11 +1,32 @@ use std::{ ffi::CString, fs::DirBuilder, - io::{self, Read}, + io::{self, Read, Write}, os::unix::ffi::OsStrExt, path::Path, }; +pub fn pack<W: Write, P: AsRef<Path>, E: AsRef<Path>, I: Iterator<Item = E>>( + archive: W, + source: P, + entries: I, +) -> io::Result<W> { + let mut ar = tar::Builder::new(archive); + ar.mode(tar::HeaderMode::Deterministic); + ar.follow_symlinks(false); + + for entry in entries { + let path = source.as_ref().join(entry.as_ref()); + if path.is_dir() { + ar.append_dir_all(entry.as_ref(), path)?; + } else { + ar.append_path_with_name(path, entry.as_ref())?; + } + } + + ar.into_inner() +} + pub fn unpack<R: Read, P: AsRef<Path>>(archive: R, dest: P) -> io::Result<()> { let dest_path = dest.as_ref(); |