Add variables and template mirror url
This commit is contained in:
		@@ -1,12 +1,13 @@
 | 
			
		||||
use log::{info, warn};
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
use std::fs::File;
 | 
			
		||||
use std::{fs::File, collections::HashMap};
 | 
			
		||||
 | 
			
		||||
pub(crate) mod extension;
 | 
			
		||||
pub(crate) mod patch;
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
 | 
			
		||||
pub(crate) struct Config {
 | 
			
		||||
    pub(crate) variables: Option<HashMap<String, String>>,
 | 
			
		||||
    pub(crate) repositories: Vec<Repository>,
 | 
			
		||||
    pub(crate) charts: Vec<Chart>,
 | 
			
		||||
    pub(crate) mirrors: Vec<Mirror>,
 | 
			
		||||
@@ -54,6 +55,7 @@ pub(crate) struct GitMirror {
 | 
			
		||||
    pub(crate) path: Option<String>,
 | 
			
		||||
    pub(crate) branch: String,
 | 
			
		||||
    pub(crate) commit: Option<String>,
 | 
			
		||||
    pub(crate) git_dir: Option<String>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
 | 
			
		||||
@@ -82,6 +84,7 @@ pub(crate) struct Chart {
 | 
			
		||||
    // A repository object
 | 
			
		||||
    pub(crate) extensions: Option<Vec<extension::Extension>>,
 | 
			
		||||
    pub(crate) patches: Option<Vec<patch::Patch>>,
 | 
			
		||||
    pub(crate) variables: Option<HashMap<String, String>>,
 | 
			
		||||
    #[serde(skip_serializing)]
 | 
			
		||||
    pub(crate) repository_obj: Option<Repository>,
 | 
			
		||||
    #[serde(skip_serializing)]
 | 
			
		||||
@@ -89,6 +92,18 @@ pub(crate) struct Chart {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Chart {
 | 
			
		||||
    pub(crate) fn populate_variables(&mut self, global_variables: Option<HashMap<String, String>>) {
 | 
			
		||||
        if let Some(global_vars) = global_variables {
 | 
			
		||||
            self.variables = match self.variables.clone() {
 | 
			
		||||
                Some(mut vars) => {
 | 
			
		||||
                    vars.extend(global_vars);
 | 
			
		||||
                    Some(vars)
 | 
			
		||||
                },
 | 
			
		||||
                None => Some(global_vars),
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub(crate) fn populate_repository(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        repositories: Vec<Repository>,
 | 
			
		||||
 
 | 
			
		||||
@@ -61,19 +61,22 @@ trait PatchInterface {
 | 
			
		||||
impl PatchInterface for YqPatch {
 | 
			
		||||
    fn apply(&self, chart_local_path: String) -> Result<(), Box<dyn std::error::Error>> {
 | 
			
		||||
        let cmd = match self.op {
 | 
			
		||||
            YqOperations::Add => format!(
 | 
			
		||||
                "yq -i '{} += \"{}\"' {}",
 | 
			
		||||
                self.key,
 | 
			
		||||
                self.value.clone().unwrap(),
 | 
			
		||||
                self.file
 | 
			
		||||
            ),
 | 
			
		||||
            YqOperations::Add => {
 | 
			
		||||
                let value = match self.value.clone().unwrap().starts_with(['{', '[', '\"', '\'']) {
 | 
			
		||||
                    true => self.value.clone().unwrap(),
 | 
			
		||||
                    false => format!("\"{}\"", self.value.clone().unwrap()),
 | 
			
		||||
                };
 | 
			
		||||
                format!("yq -i '{} += {}' {}", self.key, value, self.file)
 | 
			
		||||
            }
 | 
			
		||||
            YqOperations::Delete => format!("yq -i \'del({})\' {}", self.key, self.file),
 | 
			
		||||
            YqOperations::Replace => format!(
 | 
			
		||||
                "yq e -i \'{} = \"{}\"\' {}",
 | 
			
		||||
                self.key,
 | 
			
		||||
                self.value.clone().unwrap(),
 | 
			
		||||
                self.file
 | 
			
		||||
            ),
 | 
			
		||||
            YqOperations::Replace => {
 | 
			
		||||
                let value = match self.value.clone().unwrap().starts_with(['{', '[']) {
 | 
			
		||||
                    true => self.value.clone().unwrap(),
 | 
			
		||||
                    false => format!("\"{}\"", self.value.clone().unwrap()),
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                format!("yq e -i '{} = {}' {}", self.key, value, self.file)
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        cli_exec_from_dir(cmd, chart_local_path)?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ pub(crate) mod source;
 | 
			
		||||
 | 
			
		||||
use clap::Parser;
 | 
			
		||||
use log::{error, info};
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
use std::fs;
 | 
			
		||||
use std::{fs::create_dir, path::PathBuf, process::exit};
 | 
			
		||||
use tempfile::TempDir;
 | 
			
		||||
@@ -77,6 +78,7 @@ fn main() {
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    for mut chart in config.clone().charts {
 | 
			
		||||
        chart.populate_variables(config.variables.clone());
 | 
			
		||||
        match chart.populate_repository(config.repositories.clone()) {
 | 
			
		||||
            Ok(_) => {
 | 
			
		||||
                info!("repo is populated for chart {}", chart.name);
 | 
			
		||||
@@ -102,7 +104,11 @@ fn main() {
 | 
			
		||||
                exit(1);
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        match chart_repo.pull(workdir_path.clone()) {
 | 
			
		||||
        let vars = match chart.variables {
 | 
			
		||||
            Some(vars) => vars,
 | 
			
		||||
            None => HashMap::new(),
 | 
			
		||||
        };
 | 
			
		||||
        match chart_repo.pull(workdir_path.clone(), vars) {
 | 
			
		||||
            Ok(res) => {
 | 
			
		||||
                info!(
 | 
			
		||||
                    "succesfully pulled chart {} into {}",
 | 
			
		||||
 
 | 
			
		||||
@@ -18,12 +18,19 @@ impl Target for Git {
 | 
			
		||||
        chart_local: ChartLocal,
 | 
			
		||||
        dry_run: bool,
 | 
			
		||||
    ) -> Result<(), Box<dyn std::error::Error>> {
 | 
			
		||||
        let cmd = format!("git clone {} {}", self.url, self.git_dir);
 | 
			
		||||
        let mut reg = super::register_handlebars();
 | 
			
		||||
        // Prepare the URL
 | 
			
		||||
        reg.register_template_string("url", self.url.clone())?;
 | 
			
		||||
        let url = reg.render("url", &chart_local)?;
 | 
			
		||||
        //Prepare the git dir
 | 
			
		||||
        reg.register_template_string("git_dir", self.git_dir.clone())?;
 | 
			
		||||
        let git_dir = reg.render("git_dir", &chart_local)?;
 | 
			
		||||
 | 
			
		||||
        let cmd = format!("git clone {} {}", url, git_dir);
 | 
			
		||||
        cli_exec_from_dir(cmd, workdir_path.clone())?;
 | 
			
		||||
        let git_repo_path = format!("{}/{}", workdir_path, self.git_dir);
 | 
			
		||||
        let git_repo_path = format!("{}/{}", workdir_path, git_dir);
 | 
			
		||||
 | 
			
		||||
        // Prepare branch
 | 
			
		||||
        let mut reg = super::register_handlebars();
 | 
			
		||||
        reg.register_template_string("branch", self.branch.clone())?;
 | 
			
		||||
        let branch = reg.render("branch", &chart_local)?;
 | 
			
		||||
        let cmd = format!("git checkout {}", branch);
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,10 @@ pub(crate) fn mirror_from_mirror_obj(
 | 
			
		||||
) -> Result<Box<dyn Target>, Box<dyn std::error::Error>> {
 | 
			
		||||
    if let Some(git) = mirror.git {
 | 
			
		||||
        return Ok(Box::from(git::Git {
 | 
			
		||||
            git_dir: mirror.name.clone(),
 | 
			
		||||
            git_dir: match git.git_dir {
 | 
			
		||||
                Some(dir) => dir,
 | 
			
		||||
                None => mirror.name,
 | 
			
		||||
            },
 | 
			
		||||
            url: git.url,
 | 
			
		||||
            path: match git.path {
 | 
			
		||||
                Some(path) => path,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
use std::fs::{self, rename};
 | 
			
		||||
use std::{fs::{self, rename}, collections::HashMap};
 | 
			
		||||
 | 
			
		||||
use crate::helpers::cli::{cli_exec, cli_exec_from_dir};
 | 
			
		||||
use base64::{engine::general_purpose, Engine as _};
 | 
			
		||||
@@ -24,7 +24,7 @@ impl From<crate::config::Chart> for Git {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Repo for Git {
 | 
			
		||||
    fn pull(&self, workdir_path: String) -> Result<ChartLocal, Box<dyn std::error::Error>> {
 | 
			
		||||
    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 {} {}/{}",
 | 
			
		||||
@@ -64,6 +64,7 @@ impl Repo for Git {
 | 
			
		||||
            version,
 | 
			
		||||
            path: new_dir_name,
 | 
			
		||||
            repo_url: self.git_url.clone(),
 | 
			
		||||
            vars,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
use super::{ChartLocal, Repo};
 | 
			
		||||
use crate::helpers::cli::{cli_exec, cli_exec_from_dir};
 | 
			
		||||
use base64::{engine::general_purpose, Engine as _};
 | 
			
		||||
use std::fs::rename;
 | 
			
		||||
use std::{fs::rename, collections::HashMap};
 | 
			
		||||
 | 
			
		||||
pub(crate) enum RepoKind {
 | 
			
		||||
    Default,
 | 
			
		||||
@@ -46,7 +46,7 @@ impl Helm {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn pull_default(&self, workdir_path: String) -> Result<ChartLocal, Box<dyn std::error::Error>> {
 | 
			
		||||
    fn pull_default(&self, workdir_path: String, vars: HashMap<String, String>) -> Result<ChartLocal, Box<dyn std::error::Error>> {
 | 
			
		||||
        // Add repo and update
 | 
			
		||||
        let repo_local_name = general_purpose::STANDARD_NO_PAD.encode(self.repository_url.clone());
 | 
			
		||||
        let cmd = format!("helm repo add {} {}", repo_local_name, self.repository_url);
 | 
			
		||||
@@ -87,15 +87,16 @@ impl Helm {
 | 
			
		||||
            version,
 | 
			
		||||
            path: new_dir_name,
 | 
			
		||||
            repo_url: self.repository_url.clone(),
 | 
			
		||||
            vars,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Repo for Helm {
 | 
			
		||||
    fn pull(&self, workdir_path: String) -> Result<ChartLocal, Box<dyn std::error::Error>> {
 | 
			
		||||
    fn pull(&self, workdir_path: String, vars: HashMap<String, String>) -> Result<ChartLocal, Box<dyn std::error::Error>> {
 | 
			
		||||
        let repository_kind = self.repo_kind_from_url()?;
 | 
			
		||||
        let path = match repository_kind {
 | 
			
		||||
            RepoKind::Default => self.pull_default(workdir_path)?,
 | 
			
		||||
            RepoKind::Default => self.pull_default(workdir_path, vars)?,
 | 
			
		||||
            RepoKind::Oci => {
 | 
			
		||||
                todo!()
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
use std::collections::HashMap;
 | 
			
		||||
 | 
			
		||||
use crate::config::Chart;
 | 
			
		||||
use serde::{Deserialize, Serialize};
 | 
			
		||||
 | 
			
		||||
@@ -10,6 +12,7 @@ pub(crate) struct ChartLocal {
 | 
			
		||||
    pub(crate) version: String,
 | 
			
		||||
    pub(crate) path: String,
 | 
			
		||||
    pub(crate) repo_url: String,
 | 
			
		||||
    pub(crate) vars: HashMap<String, String>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ChartLocal {
 | 
			
		||||
@@ -19,7 +22,7 @@ impl ChartLocal {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub(crate) trait Repo {
 | 
			
		||||
    fn pull(&self, workdir_path: String) -> Result<ChartLocal, Box<dyn std::error::Error>>;
 | 
			
		||||
    fn pull(&self, workdir_path: String, vars: HashMap<String, String>) -> Result<ChartLocal, Box<dyn std::error::Error>>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user