extern crate env_logger;
#[macro_use]
extern crate log;
extern crate rust_release_artefact as rra;
use std::env;
use std::error;
use std::fs;
use std::io;
use std::path;
use std::process;
fn open_artefact(
src_path: &path::Path,
dst_path: &path::Path,
) -> Result<rra::ExtractedArtefact, Box<error::Error>> {
match rra::ExtractedArtefact::new(dst_path) {
Ok(extracted_artefact) => return Ok(extracted_artefact),
Err(rra::Error::NoArtefacts(_)) => {
}
Err(e) => {
return Err(e.into());
}
};
let artefact_handle = io::BufReader::new(fs::File::open(src_path)?);
let extension = src_path
.extension()
.and_then(|ext| ext.to_str())
.unwrap_or("");
Ok(match extension {
"gz" => rra::ExtractedArtefact::from_tar_gz(artefact_handle, dst_path)?,
"xz" => rra::ExtractedArtefact::from_tar_xz(artefact_handle, dst_path)?,
_ => Err(format!("Unrecognised extension: {:?}", extension))?,
})
}
fn dump_artefact(artefact: rra::ExtractedArtefact) {
println!("Version: {:?}", artefact.version);
println!("Git commit hash: {:?}", artefact.git_commit_hash);
for (name, component) in &artefact.components {
println!("Component: {:?} in {:?}", name, component.root);
for path in &component.files {
println!(" - {:?}", path);
}
}
}
fn main() {
env_logger::init();
info!("Parsing command-line arguments...");
let args = env::args_os().collect::<Vec<_>>();
if args.len() != 3 {
error!("Usage: extract-artefact ARTEFACT STAGEPATH");
process::exit(1);
}
let src_path = path::Path::new(&args[1]);
let dst_path = path::Path::new(&args[2]);
info!("Creating destination directory if needed: {:?}", &args[2]);
fs::create_dir_all(dst_path).unwrap_or_else(|err| {
error!("Couldn't create destination path: {}", err);
process::exit(1)
});
info!("Extracting artefact...");
let extracted_artefact =
open_artefact(src_path, dst_path).unwrap_or_else(|err| {
error!("{}", err);
process::exit(1)
});
info!("Dumping artefact metadata...");
dump_artefact(extracted_artefact);
}