use super::types::InitialRebaseOutcome;
use crate::checkpoint::RunContext;
use crate::git_helpers::{get_default_branch, rebase_onto, RebaseResult};
use crate::logger::{Colors, Logger};
use crate::phases::PhaseContext;
use crate::ProcessExecutor;
pub struct InitialRebaseRunResult {
pub outcome: InitialRebaseOutcome,
pub prompt_replay_hits: Vec<(String, bool)>,
}
pub fn run_rebase_to_default(
logger: &Logger,
colors: Colors,
executor: &dyn ProcessExecutor,
) -> std::io::Result<RebaseResult> {
let default_branch = get_default_branch()?;
logger.info(&format!(
"Rebasing onto {}{}{}",
colors.cyan(),
default_branch,
colors.reset()
));
rebase_onto(&default_branch, executor)
}
pub fn run_initial_rebase(
logger: &Logger,
colors: Colors,
_phase_ctx: &mut PhaseContext<'_>,
_run_context: &RunContext,
executor: &dyn ProcessExecutor,
_prompt_history: &mut std::collections::HashMap<String, crate::prompts::PromptHistoryEntry>,
) -> anyhow::Result<InitialRebaseRunResult> {
let default_branch = get_default_branch()?;
logger.info(&format!(
"Rebasing onto {}{}{}",
colors.cyan(),
default_branch,
colors.reset()
));
rebase_onto(&default_branch, executor)
.map_err(Into::into)
.map(|result| {
let outcome = match result {
RebaseResult::Success => InitialRebaseOutcome::Succeeded {
new_head: String::new(),
},
RebaseResult::NoOp { reason } => InitialRebaseOutcome::Skipped { reason },
RebaseResult::Conflicts(_) => InitialRebaseOutcome::Skipped {
reason: "conflicts during rebase".to_string(),
},
RebaseResult::Failed(e) => InitialRebaseOutcome::Skipped {
reason: format!("rebase failed: {e:?}"),
},
};
InitialRebaseRunResult {
outcome,
prompt_replay_hits: Vec::new(),
}
})
}