diff --git a/crates/forest/src/plan_reconciler.rs b/crates/forest/src/plan_reconciler.rs index df69d7b..a7d1c33 100644 --- a/crates/forest/src/plan_reconciler.rs +++ b/crates/forest/src/plan_reconciler.rs @@ -4,66 +4,8 @@ use anyhow::Context; use crate::model::Project; +pub mod git; pub mod local; -pub mod git { - use std::{ - env::temp_dir, - path::{Path, PathBuf}, - }; - - use super::local; - - pub async fn reconcile( - url: &str, - path: &Option, - plan_dir: &Path, - ) -> anyhow::Result<()> { - let temp = TempDir::new(); - tokio::fs::create_dir_all(&temp.0).await?; - - let mut cmd = tokio::process::Command::new("git"); - cmd.args(["clone", url, &temp.0.display().to_string(), "--depth=1"]); - - tracing::info!("cloning plan: {}", url); - let out = cmd.output().await?; - if !out.status.success() { - let stdout = std::str::from_utf8(&out.stdout).unwrap_or_default(); - let stderr = std::str::from_utf8(&out.stderr).unwrap_or_default(); - - anyhow::bail!("failed to process git plan: {}, {}", stdout, stderr) - } - - let temp_plan_dir = if let Some(path) = path { - temp.0.join(path) - } else { - temp.0.to_path_buf() - }; - - local::reconcile(&temp_plan_dir, plan_dir).await?; - - drop(temp); - - Ok(()) - } - - struct TempDir(PathBuf); - - impl TempDir { - fn new() -> Self { - Self( - temp_dir() - .join("forest") - .join(uuid::Uuid::new_v4().to_string()), - ) - } - } - - impl Drop for TempDir { - fn drop(&mut self) { - std::fs::remove_dir_all(&self.0).expect("to be able to remove temp dir"); - } - } -} #[derive(Default)] pub struct PlanReconciler {} diff --git a/crates/forest/src/plan_reconciler/git.rs b/crates/forest/src/plan_reconciler/git.rs new file mode 100644 index 0000000..51f0291 --- /dev/null +++ b/crates/forest/src/plan_reconciler/git.rs @@ -0,0 +1,53 @@ +use std::{ + env::temp_dir, + path::{Path, PathBuf}, +}; + +use super::local; + +pub async fn reconcile(url: &str, path: &Option, plan_dir: &Path) -> anyhow::Result<()> { + let temp = TempDir::new(); + tokio::fs::create_dir_all(&temp.0).await?; + + let mut cmd = tokio::process::Command::new("git"); + cmd.args(["clone", url, &temp.0.display().to_string(), "--depth=1"]); + + tracing::info!("cloning plan: {}", url); + let out = cmd.output().await?; + if !out.status.success() { + let stdout = std::str::from_utf8(&out.stdout).unwrap_or_default(); + let stderr = std::str::from_utf8(&out.stderr).unwrap_or_default(); + + anyhow::bail!("failed to process git plan: {}, {}", stdout, stderr) + } + + let temp_plan_dir = if let Some(path) = path { + temp.0.join(path) + } else { + temp.0.to_path_buf() + }; + + local::reconcile(&temp_plan_dir, plan_dir).await?; + + drop(temp); + + Ok(()) +} + +struct TempDir(PathBuf); + +impl TempDir { + fn new() -> Self { + Self( + temp_dir() + .join("forest") + .join(uuid::Uuid::new_v4().to_string()), + ) + } +} + +impl Drop for TempDir { + fn drop(&mut self) { + std::fs::remove_dir_all(&self.0).expect("to be able to remove temp dir"); + } +}