diff --git a/src/server/actors/repo/branch.rs b/src/server/actors/repo/branch.rs index 669a0f7..b64778a 100644 --- a/src/server/actors/repo/branch.rs +++ b/src/server/actors/repo/branch.rs @@ -1,16 +1,68 @@ +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, + addr: actix::prelude::Addr, net: kxio::network::Network, ) { - let _commit_histories = match repo_details.forge.forge_type { + let commit_histories = match repo_details.forge.forge_type { crate::server::config::ForgeType::ForgeJo => { - forge::forgejo::get_commit_histories(&repo_details, &config, &net) + forge::forgejo::get_commit_histories(&repo_details, &config, &net).await } }; - todo!() + 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 }); } diff --git a/src/server/actors/repo/mod.rs b/src/server/actors/repo/mod.rs index eb8693f..775192f 100644 --- a/src/server/actors/repo/mod.rs +++ b/src/server/actors/repo/mod.rs @@ -5,7 +5,10 @@ use actix::prelude::*; use kxio::network::Network; use tracing::info; -use crate::server::config::{RepoConfig, RepoDetails}; +use crate::server::{ + config::{RepoConfig, RepoDetails}, + forge, +}; pub struct RepoActor { details: RepoDetails, @@ -56,3 +59,17 @@ impl Handler for RepoActor { .wait(ctx); } } + +#[derive(Message)] +#[rtype(result = "()")] +pub struct StartMonitoring { + pub main: forge::Commit, + pub next: forge::Commit, + pub dev: forge::Commit, +} +impl Handler for RepoActor { + type Result = (); + fn handle(&mut self, _msg: StartMonitoring, _ctx: &mut Self::Context) -> Self::Result { + info!(%self.details, "Monitoring started"); + } +}