use std::fs;
use std::time::UNIX_EPOCH;
pub fn get_timestamp(path: &str) -> std::io::Result<u64> {
let metadata = fs::metadata(path)?;
let modified_time = metadata.modified()?;
let duration_since_epoch = modified_time.duration_since(UNIX_EPOCH)
.map_err(|_| std::io::Error::new(std::io::ErrorKind::Other, "Time went backwards"))?;
Ok(duration_since_epoch.as_secs())
}
use std::fs::File;
use std::io::BufReader;
use std::io::BufWriter;
use std::path::Path;
pub fn xz_decompress(lzma_file_path: &str) -> Result<(), Box<dyn std::error::Error>> {
let lzma_file = File::open(lzma_file_path)?;
let path = Path::new(lzma_file_path);
let lzma_file_dir = path.parent().ok_or("No parent directory")?;
let lzma_file_name = path.file_name().ok_or("No file name")?.to_str().ok_or("Cannot convert to str")?.replace(".xz", "");
let mut lzma_reader = BufReader::new(lzma_file);
let tar_file_name = lzma_file_name.clone().replace(".xz", "");
let tar_file = File::create(lzma_file_dir.join(lzma_file_name))?;
let mut tar_writer = BufWriter::new(tar_file);
lzma_rs::xz_decompress(&mut lzma_reader, &mut tar_writer)?;
let tar_file = File::open(lzma_file_dir.join(tar_file_name))?;
let mut archive = tar::Archive::new(BufReader::new(tar_file));
archive.unpack(lzma_file_dir)?;
Ok(())
}
pub fn xz_compress(tar_dir_path: &str) -> Result<(), Box<dyn std::error::Error>> {
let tar_dir = Path::new(tar_dir_path);
let tar_parent_dir = tar_dir.parent().ok_or("No parent directory")?;
let tar_dir = tar_dir.file_name().ok_or("No file name")?.to_str().ok_or("Cannot convert to str")?;
#[cfg(target_os = "windows")]
let data = std::process::Command::new("wsl")
.arg("tar")
.arg("-cJf")
.arg(format!("{}.tar.xz", tar_dir))
.arg(tar_dir)
.current_dir(tar_parent_dir)
.output().expect("failed to execute process");
#[cfg(target_os = "linux")]
let data = std::process::Command::new("tar")
.arg("-cJf")
.arg(format!("{}.tar.xz", tar_dir))
.arg(tar_dir)
.current_dir(tar_parent_dir)
.output().expect("failed to execute process");
if !data.status.success() {
let data = format!("{:?}", data);
return std::result::Result::Err(data.into());
}
Ok(())
}