use std::env; use std::io; use std::path::Path; use std::process::Command; use tracing::info; pub enum GitError { FailedClone { stdout: Vec, stderr: Vec }, IO(std::io::Error), } impl From for GitError { fn from(error: io::Error) -> Self { GitError::IO(error) } } /// Clone a git repository /// /// Parameters: /// url: git clone url /// dest: directory where the repo should be cloned pub fn clone_git_repo(url: &str, dest: &Path) -> Result<(), GitError> { let git_cmd = Command::new("git") .env("GIT_TERMINAL_PROMPT", "0") .args([ "clone", "--quiet", url, "--depth", "1", dest.to_str().unwrap(), ]) .output()?; // if the git command does not return successfully, // any command on the repo will fail. So fail fast. if !git_cmd.status.success() { let error = GitError::FailedClone { stdout: git_cmd.stdout, stderr: git_cmd.stderr, }; return Err(error); } info!("Successfully clone repository."); return Ok(()); } pub fn change_directory_to_path(dest: &Path) -> io::Result<()> { let dest_path = Path::new(&dest); env::set_current_dir(&dest_path)?; info!( "Current directory: {}", env::current_dir().unwrap().display() ); return Ok(()); }