use std::time::Duration; use actix::prelude::*; use git_next_config::RepoConfig; use git_next_git as git; use tracing::{info, warn}; use crate::{gitforge, MessageToken, ValidateRepo}; // advance next to the next commit towards the head of the dev branch #[tracing::instrument(fields(next), skip_all)] pub async fn advance_next( next: git::Commit, dev_commit_history: Vec, repo_config: RepoConfig, forge: gitforge::Forge, repository: git::OpenRepository, addr: Addr, message_token: MessageToken, ) { let next_commit = find_next_commit_on_dev(next, dev_commit_history); let Some(commit) = next_commit else { warn!("No commits to advance next to"); return; }; if let Some(problem) = validate_commit_message(commit.message()) { warn!("Can't advance next to commit '{}': {}", commit, problem); return; } info!("Advancing next to commit '{}'", commit); if let Err(err) = forge.branch_reset( &repository, repo_config.branches().next(), commit.into(), git::push::Force::No, ) { warn!(?err, "Failed") } tokio::time::sleep(Duration::from_secs(10)).await; addr.do_send(ValidateRepo { message_token }) } #[tracing::instrument] fn validate_commit_message(message: &git::commit::Message) -> Option { let message = &message.to_string(); if message.to_ascii_lowercase().starts_with("wip") { return Some("Is Work-In-Progress".to_string()); } match git_conventional::Commit::parse(message) { Ok(commit) => { info!(?commit, "Pass"); None } Err(err) => { warn!(?err, "Fail"); Some(err.kind().to_string()) } } } pub fn find_next_commit_on_dev( next: git::Commit, dev_commit_history: Vec, ) -> Option { let mut next_commit: Option = None; for commit in dev_commit_history.into_iter() { if commit == next { break; }; next_commit.replace(commit); } next_commit } // advance main branch to the commit 'next' #[tracing::instrument(fields(next), skip_all)] pub async fn advance_main( next: git::Commit, repo_config: &RepoConfig, forge: &gitforge::Forge, repository: &git::OpenRepository, ) { info!("Advancing main to next"); if let Err(err) = forge.branch_reset( repository, repo_config.branches().main(), next.into(), git::push::Force::No, ) { warn!(?err, "Failed") }; }