diff --git a/crates/cli/src/repo/handlers/validate_repo.rs b/crates/cli/src/repo/handlers/validate_repo.rs index 2e77d3f..0f75188 100644 --- a/crates/cli/src/repo/handlers/validate_repo.rs +++ b/crates/cli/src/repo/handlers/validate_repo.rs @@ -15,6 +15,7 @@ use crate::{ use git_next_core::git::{ self, validation::positions::{validate, Error, Positions}, + UserNotification, }; impl Handler for RepoActor { @@ -63,26 +64,19 @@ impl Handler for RepoActor { }; logger(self.log.as_ref(), "have repo config"); - info!("collecting git graph log"); - let git_log = git::graph::log(&self.repo_details); - info!(?git_log, "collected git graph log"); - self.update_tui_log(git_log.clone()); - info!("sent to ui git graph log"); - - match validate( - &**open_repository, - &self.repo_details, - &repo_config, - git_log, - ) { - Ok(Positions { - main, - next, - dev, - dev_commit_history, - next_is_valid, - }) => { + match validate(&**open_repository, &self.repo_details, &repo_config) { + Ok(( + Positions { + main, + next, + dev, + dev_commit_history, + next_is_valid, + }, + git_log, + )) => { debug!(%main, %next, %dev, "positions"); + self.update_tui_log(git_log); if next_is_valid && next != main { do_send(&ctx.address(), CheckCIStatus::new(next), self.log.as_ref()); } else if next != dev { @@ -119,6 +113,11 @@ impl Handler for RepoActor { } Err(Error::UserIntervention(user_notification)) => { self.alert_tui(format!("[USER INTERVENTION: {user_notification}]")); + if let UserNotification::CICheckFailed { log, .. } + | UserNotification::DevNotBasedOnMain { log, .. } = &user_notification + { + self.update_tui_log(log.clone()); + } notify_user( self.notify_user_recipient.as_ref(), user_notification, diff --git a/crates/core/src/git/validation/positions.rs b/crates/core/src/git/validation/positions.rs index b264ab2..d0bb0f8 100644 --- a/crates/core/src/git/validation/positions.rs +++ b/crates/core/src/git/validation/positions.rs @@ -1,4 +1,4 @@ -use tracing::{debug, instrument}; +use tracing::{debug, info, instrument}; // use crate::{ @@ -29,13 +29,14 @@ pub fn validate( open_repository: &dyn OpenRepositoryLike, repo_details: &git::RepoDetails, repo_config: &RepoConfig, - log: git::graph::Log, -) -> Result { +) -> Result<(Positions, git::graph::Log)> { let main_branch = repo_config.branches().main(); let next_branch = repo_config.branches().next(); let dev_branch = repo_config.branches().dev(); // Collect Commit Histories for `main`, `next` and `dev` branches open_repository.fetch()?; + let git_log = git::graph::log(repo_details); + let commit_histories = get_commit_histories(open_repository, repo_config)?; // branch tips let main = commit_histories @@ -64,7 +65,7 @@ pub fn validate( main_branch, dev_commit: dev, main_commit: main, - log, + log: git_log, }, )); } @@ -80,23 +81,38 @@ pub fn validate( &main, ) { tracing::info!("Main not on same commit as next, or it's parent - resetting next to main",); - return reset_next_to_main(open_repository, repo_details, &main, &next, &next_branch); + return Err(reset_next_to_main( + open_repository, + repo_details, + &main, + &next, + &next_branch, + )); } // verify that next is an ancestor of dev, else reset it back to main if dev not ahead of main if is_not_based_on(&commit_histories.dev, &next) && commit_histories.main.first() == commit_histories.dev.first() { tracing::info!("Next is not an ancestor of dev - resetting next to main"); - return reset_next_to_main(open_repository, repo_details, &main, &next, &next_branch); + return Err(reset_next_to_main( + open_repository, + repo_details, + &main, + &next, + &next_branch, + )); } let next_is_valid = is_based_on(&commit_histories.dev, &next); - Ok(git::validation::positions::Positions { - main, - next, - dev, - dev_commit_history: commit_histories.dev, - next_is_valid, - }) + Ok(( + git::validation::positions::Positions { + main, + next, + dev, + dev_commit_history: commit_histories.dev, + next_is_valid, + }, + git_log, + )) } #[allow(clippy::result_large_err)] @@ -106,22 +122,20 @@ fn reset_next_to_main( main: &git::Commit, next: &git::Commit, next_branch: &BranchName, -) -> Result { - git::push::reset( +) -> Error { + if let Err(err) = git::push::reset( open_repository, repo_details, next_branch, &main.clone().into(), &git::push::Force::From(next.clone().into()), - ) - .map_err(|err| { + ) { Error::NonRetryable(format!( "Failed to reset branch '{next_branch}' to commit '{next}': {err}" )) - })?; - Err(Error::Retryable(format!( - "Branch {next_branch} has been reset" - ))) + } else { + Error::Retryable(format!("Branch {next_branch} has been reset")) + } } fn is_not_based_on(commits: &[git::commit::Commit], needle: &git::Commit) -> bool {