Skip to content

Commit

Permalink
Unpack tar archive, WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
anti-social committed Apr 27, 2016
1 parent e0e9264 commit ab999dd
Show file tree
Hide file tree
Showing 6 changed files with 396 additions and 263 deletions.
39 changes: 39 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions Cargo.toml
Expand Up @@ -25,6 +25,10 @@ regex = "0.1.41"
scan_dir = "0.3.1"
libmount = "0.1.1"
zip = "0.1"
tar = "0.4"
flate2 = "0.2"
bzip2 = "0.3"
xz2 = "0.1"

[[bin]]
name = "vagga"
Expand Down
82 changes: 59 additions & 23 deletions src/builder/commands/tarcmd.rs
@@ -1,12 +1,18 @@
use std::fs::Permissions;
use std::fs::{File, Permissions};
use std::fs::{create_dir_all, set_permissions};
use std::io::Read;
use std::os::unix::fs::PermissionsExt;
use std::os::unix::ffi::OsStrExt;
use std::path::{Path, PathBuf};

use unshare::{Command, Stdio};
use libmount::BindMount;

use tar::Archive;
use flate2::read::GzDecoder;
use bzip2::read::BzDecoder;
use xz2::read::XzDecoder;

use container::mount::{unmount};
use builder::context::Context;
use builder::download::{maybe_download_and_check_hashsum};
Expand Down Expand Up @@ -38,31 +44,61 @@ pub fn unpack_file(_ctx: &mut Context, src: &Path, tgt: &Path,
-> Result<(), String>
{
info!("Unpacking {} -> {}", src.display(), tgt.display());
let mut cmd = Command::new("/vagga/bin/busybox");
cmd.stdin(Stdio::null())
.arg("tar")
.arg("-x")
.arg("-f").arg(src)
.arg("-C").arg(tgt);
for i in includes.iter() {
cmd.arg(i);
}
for i in excludes.iter() {
cmd.arg("--exclude").arg(i);
}
// let mut cmd = Command::new("/vagga/bin/busybox");
// cmd.stdin(Stdio::null())
// .arg("tar")
// .arg("-x")
// .arg("-f").arg(src)
// .arg("-C").arg(tgt);
// for i in includes.iter() {
// cmd.arg(i);
// }
// for i in excludes.iter() {
// cmd.arg("--exclude").arg(i);
// }

match src.extension().and_then(|x| x.to_str()) {
Some("gz")|Some("tgz") => { cmd.arg("-z"); }
Some("bz")|Some("tbz") => { cmd.arg("-j"); }
Some("xz")|Some("txz") => { cmd.arg("-J"); }
_ => {}
let mut file = try_msg!(File::open(src), "Cannot open file: {err}");
// let mut gz;
let (mut gz, mut bz, mut xz);
let r: &mut Read = match src.extension().and_then(|x| x.to_str()) {
Some("gz")|Some("tgz") => {
gz = try_msg!(GzDecoder::new(file), "Cannot decode file: {err}");
// gz = Archive::new(fin);
&mut gz
// cmd.arg("-z");
}
Some("bz")|Some("tbz") => {
bz = BzDecoder::new(file);
&mut bz
// cmd.arg("-j");
}
Some("xz")|Some("txz") => {
xz = XzDecoder::new(file);
&mut xz
// cmd.arg("-J");
}
_ => {
&mut file
}
};
info!("Running: {:?}", cmd);
match cmd.status() {
Ok(st) if st.success() => Ok(()),
Ok(val) => Err(format!("Tar exited with status: {}", val)),
Err(e) => Err(format!("Error running tar: {}", e)),

let mut tar = Archive::new(r);
for entry in tar.entries().unwrap() {
let entry = &mut entry.unwrap();
let fin_path = entry.header().path().unwrap().to_path_buf();
let fout_path = tgt.join(&fin_path);
entry.unpack(&fout_path);
println!("{:?} => {:?}", &fin_path, &fout_path);
}
// try_msg!(tar.unpack(tgt), "Cannot unpack archive: {err}");
Ok(())

// info!("Running: {:?}", cmd);
// match cmd.status() {
// Ok(st) if st.success() => Ok(()),
// Ok(val) => Err(format!("Tar exited with status: {}", val)),
// Err(e) => Err(format!("Error running tar: {}", e)),
// }
}

pub fn tar_command(ctx: &mut Context, tar: &Tar) -> Result<(), String>
Expand Down
4 changes: 4 additions & 0 deletions src/main.rs
Expand Up @@ -17,6 +17,10 @@ extern crate signal;
extern crate regex;
extern crate scan_dir;
extern crate zip;
extern crate tar;
extern crate flate2;
extern crate bzip2;
extern crate xz2;
#[macro_use] extern crate matches;
#[macro_use] extern crate mopa;
#[macro_use] extern crate log;
Expand Down

0 comments on commit ab999dd

Please sign in to comment.