| use std::env; |
| use std::io; |
| use std::path::Path; |
| use std::process::Command; |
| use tracing::info; |
| |
| pub enum GitError { |
| FailedClone { stdout: Vec<u8>, stderr: Vec<u8> }, |
| IO(std::io::Error), |
| } |
| |
| impl From<io::Error> 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(()); |
| } |