Compare commits

...

3 commits

Author SHA1 Message Date
8decf941c8 WIP
All checks were successful
ci/woodpecker/push/cron-docker-builder Pipeline was successful
ci/woodpecker/push/push-next Pipeline was successful
ci/woodpecker/push/tag-created Pipeline was successful
2024-08-30 09:12:57 +01:00
eb42745383 build: add start-mac-tunnel
All checks were successful
Rust / build (push) Successful in 10m0s
ci/woodpecker/push/push-next Pipeline was successful
ci/woodpecker/push/cron-docker-builder Pipeline was successful
ci/woodpecker/push/tag-created Pipeline was successful
Release Please / Release-plz (push) Successful in 52s
ci/woodpecker/cron/cron-docker-builder Pipeline was successful
ci/woodpecker/cron/push-next Pipeline was successful
ci/woodpecker/cron/tag-created Pipeline was successful
2024-08-30 09:12:57 +01:00
126d5d3ef5 fix: create git graph log to after doing a fetch
All checks were successful
Rust / build (push) Successful in 10m5s
ci/woodpecker/push/cron-docker-builder Pipeline was successful
ci/woodpecker/push/push-next Pipeline was successful
ci/woodpecker/push/tag-created Pipeline was successful
Release Please / Release-plz (push) Successful in 51s
2024-08-30 09:12:57 +01:00
6 changed files with 75 additions and 108 deletions

View file

@ -53,6 +53,7 @@ impl Handler<ReceiveCIStatus> for RepoActor {
},
log.as_ref(),
);
// FIXME: this blocks the thread and prevents UI from being updated
delay_send(
&addr,
sleep_duration,

View file

@ -1,7 +1,7 @@
//
use actix::prelude::*;
use tracing::{debug, info, instrument, Instrument as _};
use tracing::{debug, instrument, Instrument as _};
use crate::{
repo::{
@ -13,8 +13,8 @@ use crate::{
};
use git_next_core::git::{
self,
validation::positions::{validate, Error, Positions},
UserNotification,
};
impl Handler<ValidateRepo> for RepoActor {
@ -63,26 +63,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 +112,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,

View file

@ -3,10 +3,7 @@ use actix::prelude::*;
use crate::{
alerts::messages::NotifyUser,
server::{
actor::messages::{RepoUpdate, ServerUpdate},
ServerActor,
},
server::{actor::messages::RepoUpdate, ServerActor},
};
use derive_more::Deref;
use kxio::network::Network;
@ -114,6 +111,7 @@ impl RepoActor {
}
}
#[allow(unused_variables)]
fn update_tui_log(&self, log: git::graph::Log) {
#[cfg(feature = "tui")]
{
@ -121,6 +119,7 @@ impl RepoActor {
}
}
#[allow(unused_variables)]
fn alert_tui(&self, alert: impl Into<String>) {
#[cfg(feature = "tui")]
{
@ -130,6 +129,7 @@ impl RepoActor {
}
}
#[allow(unused_variables)]
fn update_tui(&self, repo_update: RepoUpdate) {
#[cfg(feature = "tui")]
{
@ -137,7 +137,7 @@ impl RepoActor {
return;
};
let update = ServerUpdate::RepoUpdate {
let update = crate::server::actor::messages::ServerUpdate::RepoUpdate {
forge_alias: self.repo_details.forge.forge_alias().clone(),
repo_alias: self.repo_details.repo_alias.clone(),
repo_update,

View file

@ -1,10 +1,9 @@
use tracing::{debug, instrument};
//
use crate::{
git::{self, repository::open::OpenRepositoryLike, RepoDetails, UserNotification},
BranchName, RepoConfig,
};
use tracing::{debug, instrument};
pub type Result<T> = core::result::Result<T, Error>;
@ -29,13 +28,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 +64,7 @@ pub fn validate(
main_branch,
dev_commit: dev,
main_commit: main,
log,
log: git_log,
},
));
}
@ -80,23 +80,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 +121,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 {

View file

@ -75,12 +75,7 @@ mod positions {
);
let repo_config = given::a_repo_config();
let result = validate(
&*repository,
&repo_details,
&repo_config,
git::graph::Log::default(),
);
let result = validate(&*repository, &repo_details, &repo_config);
println!("{result:?}");
let_assert!(Err(err) = result, "validate");
@ -120,12 +115,7 @@ mod positions {
"open repo"
);
let result = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default(),
);
let result = validate(&*open_repository, &repo_details, &repo_config);
println!("{result:?}");
assert!(matches!(
@ -164,12 +154,7 @@ mod positions {
"open repo"
);
let result = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default(),
);
let result = validate(&*open_repository, &repo_details, &repo_config);
println!("{result:?}");
assert!(matches!(
@ -208,12 +193,7 @@ mod positions {
"open repo"
);
let result = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default(),
);
let result = validate(&*open_repository, &repo_details, &repo_config);
println!("{result:?}");
assert!(matches!(
@ -260,12 +240,7 @@ mod positions {
//when
let_assert!(
Err(err) = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default()
),
Err(err) = validate(&*open_repository, &repo_details, &repo_config),
"validate"
);
@ -350,12 +325,7 @@ mod positions {
//when
let_assert!(
Err(err) = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default()
),
Err(err) = validate(&*open_repository, &repo_details, &repo_config),
"validate"
);
@ -424,12 +394,7 @@ mod positions {
//when
let_assert!(
Err(err) = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default()
),
Err(err) = validate(&*open_repository, &repo_details, &repo_config),
"validate"
);
@ -516,12 +481,7 @@ mod positions {
//when
let_assert!(
Err(err) = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default()
),
Err(err) = validate(&*open_repository, &repo_details, &repo_config),
"validate"
);
@ -607,12 +567,8 @@ mod positions {
//when
let_assert!(
Ok(positions) = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default()
),
Ok((positions, _git_log)) =
validate(&*open_repository, &repo_details, &repo_config),
"validate"
);
@ -671,12 +627,8 @@ mod positions {
//when
let_assert!(
Ok(positions) = validate(
&*open_repository,
&repo_details,
&repo_config,
git::graph::Log::default()
),
Ok((positions, _git_log)) =
validate(&*open_repository, &repo_details, &repo_config),
"validate"
);

View file

@ -21,6 +21,9 @@ start-ngrok:
ngrok http --domain=${NGROK_DOMAIN} 8080
fi
start-mac-tunnel:
ssh dagon -R7777:localhost:8888
coverage-update:
cargo tarpaulin --lib --out html
echo "Now:\n\topen tarpaulin-report.html"