69f12aa
use async_trait::async_trait;
use cache::CacheClient;
use export::AppDatabase;
use gitbaby::error::BabyError;
use gitbaby::repo::RepositoryFacade;
use gix::Repository;
use models::repo::repos;
use std::path::PathBuf;
use std::sync::Arc;
use uuid::Uuid;
#[derive(Clone)]
pub struct GitContext {
pub model: repos::Model,
pub cache: Arc<CacheClient>,
pub database: Arc<AppDatabase>,
pub repo_root: PathBuf,
pub objects_root: PathBuf,
}
impl GitContext {
pub fn repo_dir(&self) -> PathBuf {
self.repo_root.join(self.model.id.to_string())
}
pub fn repo_uninitialized(&self) -> bool {
!self.repo_dir().join("HEAD").exists()
}
}
pub fn repo_dir_for(repo_root: &std::path::Path, repo_id: Uuid) -> PathBuf {
repo_root.join(repo_id.to_string())
}
#[async_trait]
impl RepositoryFacade for GitContext {
async fn git_repo_dir(&self) -> Result<PathBuf, BabyError> {
self.repo_dir().canonicalize().map_err(|e| BabyError::Io {
path: Default::default(),
source: e,
})
}
async fn git_alternate_object_directories(&self) -> Result<Vec<PathBuf>, BabyError> {
Ok(vec![self.objects_root.clone()])
}
async fn gix_repo(&self) -> Result<Repository, BabyError> {
gix::open(&self.git_repo_dir().await?).map_err(|e| BabyError::InvalidGitArg(e.to_string()))
}
}