use super::fixture::Fixture;
use super::git::run_git;
impl Fixture {
pub(crate) fn agent_off(&self, id: &str, start: &str) {
self.spawn_committed("agents", id, Some(start), "goal.md", id, "dispatch");
}
pub(crate) fn config_off(&self, name: &str, start: &str) {
let marker = format!("{name}.marker");
self.spawn_committed("config", name, Some(start), &marker, name, "config: edit");
}
pub(crate) fn config_alias(&self, name: &str, start: &str) {
run_git(&self.repo, &["branch", &format!("config/{name}"), start]);
}
pub(crate) fn orphan_config(&self, name: &str) {
let marker = format!("{name}.marker");
self.spawn_committed("config", name, None, &marker, name, "config: island");
}
pub(crate) fn orphan_agent(&self, id: &str) {
self.spawn_committed("agents", id, None, "goal.md", id, "orphan");
}
pub(crate) fn cross_merge(&self, id: &str, config_name: &str) {
let wt = self.path.join(format!(".merge-{id}"));
let wt_str = wt.to_string_lossy().to_string();
let branch = format!("agents/{id}");
let other = format!("config/{config_name}");
run_git(&self.repo, &["worktree", "add", "-q", &wt_str, &branch]);
run_git(
&wt,
&[
"merge",
"-q",
"--allow-unrelated-histories",
"-m",
"cross",
&other,
],
);
run_git(&self.repo, &["worktree", "remove", &wt_str]);
}
fn spawn_committed(
&self,
prefix: &str,
name: &str,
start: Option<&str>,
file: &str,
body: &str,
subject: &str,
) {
let wt = self.path.join(format!(".build-{prefix}-{name}"));
let wt_str = wt.to_string_lossy().to_string();
let branch = format!("{prefix}/{name}");
let mut add: Vec<&str> = vec!["worktree", "add", "-q"];
match start {
Some(s) => add.extend(["-b", branch.as_str(), wt_str.as_str(), s]),
None => add.extend(["--orphan", "-b", branch.as_str(), wt_str.as_str()]),
}
run_git(&self.repo, &add);
std::fs::write(wt.join(file), body).unwrap();
run_git(&wt, &["add", file]);
run_git(&wt, &["commit", "-q", "-m", subject]);
run_git(&self.repo, &["worktree", "remove", &wt_str]);
}
}