Compare commits
1 commit
6e3aef2e84
...
4269695611
Author | SHA1 | Date | |
---|---|---|---|
4269695611 |
2 changed files with 53 additions and 40 deletions
|
@ -15,6 +15,7 @@ use crate::{
|
|||
use git_next_core::git::{
|
||||
self,
|
||||
validation::positions::{validate, Error, Positions},
|
||||
UserNotification,
|
||||
};
|
||||
|
||||
impl Handler<ValidateRepo> for RepoActor {
|
||||
|
@ -63,26 +64,19 @@ impl Handler<ValidateRepo> 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<ValidateRepo> 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,
|
||||
|
|
|
@ -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<Positions> {
|
||||
) -> 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<Positions> {
|
||||
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 {
|
||||
|
|
Loading…
Reference in a new issue