git-next/src/server/actors/repo/branch.rs

95 lines
2.7 KiB
Rust

use actix::prelude::*;
use kxio::network;
use tracing::{error, warn};
use crate::server::{config, forge};
use super::{RepoActor, StartMonitoring, StartRepo};
#[tracing::instrument(fields(forge_name = %repo_details.forge.name, repo_name = %repo_details.name))]
pub async fn validate_positions(
repo_details: config::RepoDetails,
config: config::RepoConfig,
addr: Addr<RepoActor>,
net: network::Network,
) {
let commit_histories = match repo_details.forge.forge_type {
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::<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 });
}
// advance next to the next commit towards the head of the dev branch
#[allow(dead_code)]
pub async fn advance_next(
_next: forge::Commit,
_repo_details: config::RepoDetails,
addr: Addr<RepoActor>,
_net: network::Network,
) {
// TODO: (#14) advance next one commit towards dev
addr.do_send(StartRepo);
}
// advance main branch to the commit 'next'
#[allow(dead_code)]
pub async fn advance_main(
_next: forge::Commit,
_repo_details: config::RepoDetails,
addr: Addr<RepoActor>,
_net: network::Network,
) {
// TODO: (#19) advance main to next
addr.do_send(StartRepo);
}