58 lines
1.4 KiB
Rust
58 lines
1.4 KiB
Rust
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(());
|
|
}
|