summaryrefslogtreecommitdiffstats
path: root/src/util/tar.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/tar.rs')
-rw-r--r--src/util/tar.rs23
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();