feat(server): validate branch head positions
This commit is contained in:
parent
9eb7660f7b
commit
3203bbd967
2 changed files with 74 additions and 5 deletions
|
@ -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<super::RepoActor>,
|
||||
addr: actix::prelude::Addr<super::RepoActor>,
|
||||
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::<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 });
|
||||
}
|
||||
|
|
|
@ -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<LoadedConfig> 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<StartMonitoring> for RepoActor {
|
||||
type Result = ();
|
||||
fn handle(&mut self, _msg: StartMonitoring, _ctx: &mut Self::Context) -> Self::Result {
|
||||
info!(%self.details, "Monitoring started");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue