refactor: move git into own file
This commit is contained in:
parent
dfe2ac62e3
commit
ffb81a5ee6
@ -4,66 +4,8 @@ use anyhow::Context;
|
|||||||
|
|
||||||
use crate::model::Project;
|
use crate::model::Project;
|
||||||
|
|
||||||
|
pub mod git;
|
||||||
pub mod local;
|
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<PathBuf>,
|
|
||||||
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)]
|
#[derive(Default)]
|
||||||
pub struct PlanReconciler {}
|
pub struct PlanReconciler {}
|
||||||
|
53
crates/forest/src/plan_reconciler/git.rs
Normal file
53
crates/forest/src/plan_reconciler/git.rs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
use std::{
|
||||||
|
env::temp_dir,
|
||||||
|
path::{Path, PathBuf},
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::local;
|
||||||
|
|
||||||
|
pub async fn reconcile(url: &str, path: &Option<PathBuf>, 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");
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user