use std::{fs, path::PathBuf, process::Command};
use crate::phighlighter::PLocation;
use crate::plectureparser::find_common_start::remove_common_start;
#[derive(Debug,Clone)]
pub struct PRessourceArchive{
p_relative_input_ressource_dir: PathBuf,
p_absolute_input_ressource_dir: PathBuf,
p_relative_output_archive_file: PathBuf,
p_absolute_output_archive_file: PathBuf,
p_absolute_output_archive_directory: PathBuf,
p_location_lecture_file: PLocation,
p_absolute_lecture_output_dir: PathBuf,
}
impl PRessourceArchive {
pub fn new(relative_ressource_dir: &PathBuf, location_lecture_file: &PLocation, absolute_lecture_output_dir: &PathBuf) -> Self{
let mut other = PRessourceArchive{
p_relative_input_ressource_dir: relative_ressource_dir.clone(),
p_absolute_input_ressource_dir: Default::default(),
p_relative_output_archive_file: Default::default(),
p_absolute_output_archive_file: Default::default(),
p_absolute_output_archive_directory: Default::default(),
p_location_lecture_file: location_lecture_file.clone(),
p_absolute_lecture_output_dir: absolute_lecture_output_dir.clone(),
};
other.make_ressource_path();
return other;
}
fn make_ressource_path(&mut self){
let absolute_ressource_file = match self.p_location_lecture_file.get_filename().canonicalize(){
Ok(absolute_path) => match absolute_path.parent(){
Some(parent_path) => parent_path.join(&self.p_relative_input_ressource_dir),
None => panic!("PRessourceArchive::make_ressource_path : Cannot get parent of absolute path of {:?}", self.p_location_lecture_file)
},
Err(err) => panic!("PRessourceArchive::make_ressource_path : Cannot get absolute path of {:?}\n\tError {}", self.p_location_lecture_file, err)
};
let end_source_file: PathBuf = remove_common_start(&absolute_ressource_file, &self.p_absolute_lecture_output_dir);
self.p_absolute_input_ressource_dir = self.p_absolute_lecture_output_dir.join(PathBuf::from("ressource")).join(&end_source_file);
self.p_relative_output_archive_file = PathBuf::from("archive").join(&self.p_relative_input_ressource_dir);
self.p_relative_output_archive_file.add_extension("tar.gz");
self.p_absolute_output_archive_file = self.p_absolute_lecture_output_dir.join(&self.p_relative_output_archive_file);
self.p_absolute_output_archive_directory = PathBuf::from(self.p_absolute_output_archive_file.parent().unwrap());
}
pub fn create_dir_all(&self){
match fs::create_dir_all(&self.p_absolute_output_archive_directory) {
Ok(_) => {},
Err(err) => panic!("PRessourceArchive::create_dir_all : cannot create output directory {:?}\n\tError {}", self.p_absolute_output_archive_directory, err)
};
}
pub fn create_archive(&self){
if !self.p_absolute_output_archive_directory.exists() {
self.create_dir_all();
}
let input_parent_dir = self.p_absolute_input_ressource_dir.parent().unwrap();
let input_dir_name = self.p_absolute_input_ressource_dir.file_name().unwrap();
match Command::new("tar")
.arg("-zcf")
.arg(&self.p_absolute_output_archive_file)
.arg(&input_dir_name)
.current_dir(input_parent_dir)
.output()
{
Ok(output) => {
if !output.status.success() {
println!("PRessourceArchive::create_archive : Cannot create the archive (wrong exist status) {:?}\n\tFrom Directory {:?}\n\tDefined in lecture at {}", self.p_absolute_output_archive_file, self.p_absolute_input_ressource_dir, self.p_location_lecture_file);
let error: String = output.stderr.iter().map(|value| *value as char).collect();
panic!("{:?}", error);
}
},
Err(err) => panic!("PRessourceArchive::create_archive : Cannot create the archive {:?}\n\tFrom Directory {:?}\n\tDefined in lecture at {}\n\tError {}", self.p_absolute_output_archive_file, self.p_absolute_input_ressource_dir, self.p_location_lecture_file, err)
};
}
pub fn get_archive_file_name(&self) -> String{
String::from(self.p_relative_output_archive_file.file_name().unwrap().to_str().unwrap())
}
pub fn get_relative_output_archive_file(&self) -> &PathBuf{
&self.p_relative_output_archive_file
}
pub fn get_absolute_output_archive_file(&self) -> &PathBuf{
&self.p_absolute_output_archive_file
}
}