🚑️ fix
All checks were successful
ci/woodpecker/push/build Pipeline was successful

This commit is contained in:
JMARyA 2025-04-06 02:36:27 +02:00
parent d6d2909de0
commit 0bf02e1028
Signed by: jmarya
GPG key ID: 901B2ADDF27C2263
2 changed files with 48 additions and 19 deletions

View file

@ -71,36 +71,38 @@ pub struct VarCompare {
pub eq: String, pub eq: String,
} }
type WhenExpression = Either<Option<String>, Option<VarCompare>>;
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct ReplaceAction { pub struct ReplaceAction {
pub when: Option<Either<String, VarCompare>>, pub when: Option<toml::Value>,
pub from: String, pub from: String,
pub to: String, pub to: Option<String>,
pub to_var: Option<String>, pub to_var: Option<String>,
} }
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct BranchAction { pub struct BranchAction {
pub when: Option<Either<String, VarCompare>>, pub when: Option<toml::Value>,
pub branch: String, pub branch: String,
} }
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct ScriptAction { pub struct ScriptAction {
pub when: Option<Either<String, VarCompare>>, pub when: Option<toml::Value>,
pub script: String, pub script: String,
pub expose: Option<Vec<String>>, pub expose: Option<Vec<String>>,
} }
pub fn eval(when: &Either<String, VarCompare>, vars: &[AskValue]) -> bool { pub fn eval(when: &WhenExpression, vars: &[AskValue]) -> bool {
if when.is_left() { if when.is_left() {
let when = when.as_ref().left().unwrap(); let when = when.as_ref().left().unwrap().as_ref().unwrap();
let var = vars.into_iter().find(|x| x.has_name(&when)).unwrap(); let var = vars.into_iter().find(|x| x.has_name(&when)).unwrap();
if let AskValue::Bool(_, ret) = var { if let AskValue::Bool(_, ret) = var {
return *ret; return *ret;
} }
} else { } else {
let when = when.as_ref().right().unwrap(); let when = when.as_ref().right().unwrap().as_ref().unwrap();
let var = vars.into_iter().find(|x| x.has_name(&when.var)).unwrap(); let var = vars.into_iter().find(|x| x.has_name(&when.var)).unwrap();
match var { match var {
AskValue::Text(_, t) => { AskValue::Text(_, t) => {
@ -133,10 +135,10 @@ pub fn build_script_vars(expose: Option<Vec<String>>, vars: &[AskValue]) -> Stri
return exp return exp
.iter() .iter()
.map(|x| match x { .map(|x| match x {
AskValue::Text(name, text) => format!("{name}='{text}'"), AskValue::Text(name, text) => format!("export {name}='{text}'"),
AskValue::Number(name, num) => format!("{name}={num}"), AskValue::Number(name, num) => format!("export {name}={num}"),
AskValue::Selection(name, select) => format!("{name}='{select}'"), AskValue::Selection(name, select) => format!("export {name}='{select}'"),
AskValue::Bool(name, b) => format!("{name}='{}'", b.to_string()), AskValue::Bool(name, b) => format!("export {name}='{}'", b.to_string()),
}) })
.collect::<Vec<_>>() .collect::<Vec<_>>()
.join("\n"); .join("\n");
@ -150,7 +152,7 @@ pub fn do_script(action: &ScriptAction, vars: &[AskValue], name: &str) {
println!("Running script '{}'", action.script); println!("Running script '{}'", action.script);
Exec::cmd("sh") Exec::cmd("sh")
.arg("-c") .arg("-c")
.arg(format!("{pre}\n./{}", action.script)) .arg(format!("{pre}\nbash {}", action.script))
.cwd(std::path::Path::new(name)) .cwd(std::path::Path::new(name))
.popen() .popen()
.unwrap() .unwrap()
@ -162,7 +164,7 @@ pub fn do_replace(action: &ReplaceAction, name: &str, vars: &[AskValue]) {
let to = if let Some(var) = &action.to_var { let to = if let Some(var) = &action.to_var {
vars.iter().find(|x| x.has_name(var)).unwrap().text() vars.iter().find(|x| x.has_name(var)).unwrap().text()
} else { } else {
action.to.clone() action.to.clone().unwrap()
}; };
println!("Replacing '{}' -> '{}'", action.from, to); println!("Replacing '{}' -> '{}'", action.from, to);
Exec::cmd("fd") Exec::cmd("fd")
@ -221,20 +223,37 @@ pub fn bootstrap(base: &str, name: &str) {
} }
for action in config.actions.branch { for action in config.actions.branch {
if let Some(when) = action.when { if let Some(when) = &action.when {
let when = match when {
toml::Value::String(s) => WhenExpression::Left(Some(s.clone())),
toml::Value::Table(map) => WhenExpression::Right(Some(VarCompare {
var: map.get("var").unwrap().as_str().unwrap().to_string(),
eq: map.get("eq").unwrap().as_str().unwrap().to_string(),
})),
_ => panic!("Invalid value in when condition"),
};
if eval(&when, &vars) { if eval(&when, &vars) {
println!("Switching to '{}' branch", action.branch); println!("Switching to '{}' branch", action.branch);
switch_branch(&action.branch); switch_branch(&action.branch, name);
} }
} else { } else {
println!("Switching to '{}' branch", action.branch); println!("Switching to '{}' branch", action.branch);
switch_branch(&action.branch); switch_branch(&action.branch, name);
} }
} }
for action in config.actions.replace { for action in config.actions.replace {
if let Some(when) = &action.when { if let Some(when) = &action.when {
if eval(when, &vars) { let when = match when {
toml::Value::String(s) => WhenExpression::Left(Some(s.clone())),
toml::Value::Table(map) => WhenExpression::Right(Some(VarCompare {
var: map.get("var").unwrap().as_str().unwrap().to_string(),
eq: map.get("eq").unwrap().as_str().unwrap().to_string(),
})),
_ => panic!("Invalid value in when condition"),
};
if eval(&when, &vars) {
do_replace(&action, name, &vars); do_replace(&action, name, &vars);
} }
} else { } else {
@ -244,7 +263,16 @@ pub fn bootstrap(base: &str, name: &str) {
for action in config.actions.script { for action in config.actions.script {
if let Some(when) = &action.when { if let Some(when) = &action.when {
if eval(when, &vars) { let when = match when {
toml::Value::String(s) => WhenExpression::Left(Some(s.clone())),
toml::Value::Table(map) => WhenExpression::Right(Some(VarCompare {
var: map.get("var").unwrap().as_str().unwrap().to_string(),
eq: map.get("eq").unwrap().as_str().unwrap().to_string(),
})),
_ => panic!("Invalid value in when condition"),
};
if eval(&when, &vars) {
do_script(&action, &vars, name); do_script(&action, &vars, name);
} }
} else { } else {

View file

@ -13,10 +13,11 @@ pub fn has_remote() -> bool {
!str.is_empty() !str.is_empty()
} }
pub fn switch_branch(branch: &str) { pub fn switch_branch(branch: &str, repo: &str) {
let mut git = Exec::cmd("git") let mut git = Exec::cmd("git")
.arg("checkout") .arg("checkout")
.arg(branch) .arg(branch)
.cwd(std::path::Path::new(repo))
.popen() .popen()
.unwrap(); .unwrap();
git.wait().unwrap(); git.wait().unwrap();