78 lines
2.2 KiB
Rust
78 lines
2.2 KiB
Rust
use std::{
|
|
collections::HashMap,
|
|
fs::{self, rename},
|
|
};
|
|
|
|
use crate::helpers::cli::{cli_exec, cli_exec_from_dir};
|
|
use base64::{engine::general_purpose, Engine as _};
|
|
|
|
use super::{ChartLocal, Repo};
|
|
|
|
pub(crate) struct Git {
|
|
git_url: String,
|
|
git_ref: String,
|
|
path: String,
|
|
pub(crate) chart: String,
|
|
}
|
|
|
|
impl From<crate::config::Chart> for Git {
|
|
fn from(value: crate::config::Chart) -> Self {
|
|
Git {
|
|
git_url: value.get_git_repository_url(),
|
|
git_ref: value.get_git_repository_ref(),
|
|
path: value.get_git_repository_path(),
|
|
chart: value.name,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Repo for Git {
|
|
fn pull(
|
|
&self,
|
|
workdir_path: String,
|
|
vars: HashMap<String, String>,
|
|
) -> Result<ChartLocal, Box<dyn std::error::Error>> {
|
|
let repo_local_name = general_purpose::STANDARD_NO_PAD.encode(self.git_url.clone());
|
|
let cmd = format!(
|
|
"git clone {} {}/{}",
|
|
self.git_url, workdir_path, repo_local_name
|
|
);
|
|
cli_exec(cmd)?;
|
|
|
|
let cmd = format!(
|
|
"git -C {}/{} checkout {}",
|
|
workdir_path, repo_local_name, self.git_ref
|
|
);
|
|
cli_exec(cmd)?;
|
|
|
|
let old_dir_name = format!(
|
|
"{}/{}/{}/{}",
|
|
workdir_path, repo_local_name, self.path, self.chart
|
|
);
|
|
let cmd = format!("helm show chart {}", old_dir_name);
|
|
let helm_stdout = cli_exec(cmd)?;
|
|
let new_dir_name: String;
|
|
match serde_yaml::from_str::<super::Version>(&helm_stdout) {
|
|
Ok(res) => {
|
|
new_dir_name = format!("{}/{}-{}", workdir_path, self.chart, res.version);
|
|
rename(old_dir_name, new_dir_name.clone())?;
|
|
}
|
|
Err(err) => return Err(Box::from(err)),
|
|
};
|
|
|
|
// Cleaning up
|
|
fs::remove_dir_all(format!("{}/{}", workdir_path, repo_local_name))?;
|
|
|
|
// Get the version
|
|
let cmd = "helm show chart . | yq '.version'".to_string();
|
|
let version = cli_exec_from_dir(cmd, new_dir_name.clone())?;
|
|
Ok(ChartLocal {
|
|
name: self.chart.clone(),
|
|
version,
|
|
path: new_dir_name,
|
|
repo_url: self.git_url.clone(),
|
|
vars,
|
|
})
|
|
}
|
|
}
|