feat(server): validate branch head positions
All checks were successful
ci/woodpecker/push/docker Pipeline was successful
ci/woodpecker/push/release Pipeline was successful
ci/woodpecker/push/todo-check Pipeline was successful
ci/woodpecker/push/build Pipeline was successful

This commit is contained in:
Paul Campbell 2024-04-09 18:18:19 +01:00
parent 9eb7660f7b
commit 3203bbd967
2 changed files with 74 additions and 5 deletions

View file

@ -1,16 +1,68 @@
use tracing::{error, warn};
use crate::server::forge; use crate::server::forge;
use super::StartMonitoring;
#[tracing::instrument(fields(forge_name = %repo_details.forge.name, repo_name = %repo_details.name))] #[tracing::instrument(fields(forge_name = %repo_details.forge.name, repo_name = %repo_details.name))]
pub async fn validate_positions( pub async fn validate_positions(
repo_details: crate::server::config::RepoDetails, repo_details: crate::server::config::RepoDetails,
config: crate::server::config::RepoConfig, config: crate::server::config::RepoConfig,
_addr: actix::prelude::Addr<super::RepoActor>, addr: actix::prelude::Addr<super::RepoActor>,
net: kxio::network::Network, 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 => { 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::<Vec<_>>();
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 });
} }

View file

@ -5,7 +5,10 @@ use actix::prelude::*;
use kxio::network::Network; use kxio::network::Network;
use tracing::info; use tracing::info;
use crate::server::config::{RepoConfig, RepoDetails}; use crate::server::{
config::{RepoConfig, RepoDetails},
forge,
};
pub struct RepoActor { pub struct RepoActor {
details: RepoDetails, details: RepoDetails,
@ -56,3 +59,17 @@ impl Handler<LoadedConfig> for RepoActor {
.wait(ctx); .wait(ctx);
} }
} }
#[derive(Message)]
#[rtype(result = "()")]
pub struct StartMonitoring {
pub main: forge::Commit,
pub next: forge::Commit,
pub dev: forge::Commit,
}
impl Handler<StartMonitoring> for RepoActor {
type Result = ();
fn handle(&mut self, _msg: StartMonitoring, _ctx: &mut Self::Context) -> Self::Result {
info!(%self.details, "Monitoring started");
}
}