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, pub database: Arc, 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 { self.repo_dir().canonicalize().map_err(|e| BabyError::Io { path: Default::default(), source: e, }) } async fn git_alternate_object_directories(&self) -> Result, BabyError> { Ok(vec![self.objects_root.clone()]) } async fn gix_repo(&self) -> Result { gix::open(&self.git_repo_dir().await?).map_err(|e| BabyError::InvalidGitArg(e.to_string())) } }