use std::io::{Error, ErrorKind::Other, Result}; use std::path::PathBuf; use std::process::{Command, Stdio}; use std::time::{SystemTime, UNIX_EPOCH}; pub struct Git; impl Git { pub fn new() -> Self { Git } } impl super::Remote for Git { fn can_handle(&self, _: &str) -> bool { // If we ever implement another remote we will want a check strategy true } fn sync_up(&self, remote: &str, directory: &PathBuf) -> Result<()> { let timestamp = SystemTime::now().duration_since(UNIX_EPOCH) .map_err(|_| Error::new(Other, "Invalid time"))? .as_millis(); let commands = vec![ format!("cd {} && git init -b main", directory.display()), format!("cd {} && git add .", directory.display()), format!("cd {} && git commit --allow-empty -m blog-sync-up-{}", directory.display(), timestamp), format!("cd {} && git push {} main --force", directory.display(), remote), ]; for command in commands { Command::new("sh") .arg("-c") .arg(&command) .stdout(Stdio::null()) .stderr(Stdio::null()) .status() .map_err(|_| Error::new(Other, "Failed while performing sync up with git"))?; } Ok(()) } fn sync_down(&self, remote: &str, directory: &PathBuf) -> Result<()> { let commands = vec![ format!("cd {} && git init -b main", directory.display()), format!("cd {} && git checkout .", directory.display()), format!("cd {} && git clean . -f", directory.display()), format!("cd {} && git pull {} main", directory.display(), remote), ]; for command in commands { Command::new("sh") .arg("-c") .arg(&command) .stdout(Stdio::null()) .stderr(Stdio::null()) .status() .map_err(|_| Error::new(Other, "Failed while performing sync down with git"))?; } Ok(()) } }