use tracing::{error, warn}; use crate::server::forge; use super::StartMonitoring; #[tracing::instrument(fields(forge_name = %repo_details.forge.name, repo_name = %repo_details.name))] pub async fn validate_positions( repo_details: crate::server::config::RepoDetails, config: crate::server::config::RepoConfig, addr: actix::prelude::Addr, net: kxio::network::Network, ) { let commit_histories = match repo_details.forge.forge_type { crate::server::config::ForgeType::ForgeJo => { forge::forgejo::get_commit_histories(&repo_details, &config, &net).await } }; let commit_histories = match commit_histories { Ok(commit_histories) => commit_histories, Err(err) => { error!(?err, "Failed to get commit histories"); return; } }; let Some(main) = commit_histories.main.first().cloned() else { warn!("No commits on main branch '{}'", config.branches().main()); return; }; let next_commits = commit_histories .next .into_iter() .take(2) .collect::>(); if !next_commits.contains(&main) { warn!( "Main branch '{}' is not on the same commit as next branch '{}', or it's parent", config.branches().main(), config.branches().next() ); return; } let next = next_commits[0].clone(); let dev_has_next = commit_histories .dev .iter() .any(|commit| commit == &next_commits[0]); if !dev_has_next { warn!( "Dev branch '{}' is not based on next branch '{}'", config.branches().dev(), config.branches().next() ); return; // dev is not based on next } let dev_has_main = commit_histories.dev.iter().any(|commit| commit == &main); if !dev_has_main { warn!( "Dev branch '{}' is not based on main branch '{}'", config.branches().dev(), config.branches().main() ); return; } let dev = commit_histories.dev[0].clone(); addr.do_send(StartMonitoring { main, next, dev }); }