2024-05-19 15:05:24 +01:00
|
|
|
use std::sync::atomic::AtomicBool;
|
|
|
|
|
|
|
|
use derive_more::Deref as _;
|
|
|
|
use git_next_config::GitDir;
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
repository::{open::OpenRepository, Error, RepositoryLike},
|
|
|
|
RepoDetails,
|
|
|
|
};
|
|
|
|
|
2024-05-19 14:57:58 +01:00
|
|
|
pub struct RealRepository;
|
|
|
|
impl RepositoryLike for RealRepository {
|
2024-05-19 15:05:24 +01:00
|
|
|
fn open(&self, gitdir: &GitDir) -> Result<OpenRepository, Error> {
|
|
|
|
let gix_repo = gix::ThreadSafeRepository::open(gitdir.to_path_buf())?.to_thread_local();
|
|
|
|
Ok(OpenRepository::new(gix_repo))
|
2024-05-19 14:57:58 +01:00
|
|
|
}
|
|
|
|
|
2024-05-19 15:05:24 +01:00
|
|
|
fn git_clone(&self, repo_details: &RepoDetails) -> Result<OpenRepository, Error> {
|
2024-05-19 14:57:58 +01:00
|
|
|
use secrecy::ExposeSecret;
|
2024-05-19 15:05:24 +01:00
|
|
|
let (gix_repo, _outcome) = gix::prepare_clone_bare(
|
|
|
|
repo_details.origin().expose_secret().as_str(),
|
|
|
|
repo_details.gitdir.deref(),
|
|
|
|
)?
|
|
|
|
.fetch_only(gix::progress::Discard, &AtomicBool::new(false))?;
|
2024-05-19 14:57:58 +01:00
|
|
|
|
2024-05-19 15:05:24 +01:00
|
|
|
Ok(OpenRepository::new(gix_repo))
|
2024-05-19 14:57:58 +01:00
|
|
|
}
|
|
|
|
}
|