use super::exec::{CONTROL, Deps, MKDIR, NEW, REPO_MARK, StartError, verb_ok};
use crate::actions::verbs::{self, log_step_failure};
use crate::cli_outbound::Cli;
use crate::control;
use crate::opslog::Origin;
use crate::world::Layout;
use std::path::Path;
pub fn execute_ensure_workspace(
deps: &Deps,
ts: &str,
workspace: &Path,
layout: &Layout,
origin: Origin,
) -> Result<bool, StartError> {
let (lernie, state_root) = (&deps.lernie, deps.state_root.as_path());
let created = create_workspace(lernie, state_root, ts, workspace, origin)?;
let shim = crate::world::tools::control_path(&layout.tools);
let authored = control::author::ensure_controlled(
lernie,
workspace,
&shim,
&deps.yog_binary,
state_root,
ts,
origin,
)?;
if let Some(entry) = authored.filter(|e| e.exit != 0) {
log_step_failure(state_root, ts, workspace, CONTROL, &entry.stderr, origin)?;
return Err(StartError::Control(entry.stderr));
}
Ok(created)
}
fn create_workspace(
lernie: &Cli,
state_root: &Path,
ts: &str,
workspace: &Path,
origin: Origin,
) -> Result<bool, StartError> {
if workspace.join(REPO_MARK).exists() {
return Ok(false);
}
let parent = workspace.parent().unwrap_or(workspace);
if let Err(e) = std::fs::create_dir_all(parent) {
log_step_failure(state_root, ts, parent, MKDIR, &e.to_string(), origin)?;
return Err(StartError::Io(e));
}
let ws_s = workspace.to_string_lossy();
verb_ok(
verbs::run_logged(lernie, state_root, ts, parent, &[NEW, &ws_s], origin)?,
NEW,
)?;
Ok(true)
}