gnostr_asyncgit/sync/
repository.rs1use std::{
2 cell::RefCell,
3 path::{Path, PathBuf},
4};
5
6use git2::{Repository, RepositoryOpenFlags};
7
8use crate::error::Result;
9
10pub type RepoPathRef = RefCell<RepoPath>;
12
13#[derive(Clone, Debug)]
15pub enum RepoPath {
16 Path(PathBuf),
18 Workdir {
20 gitdir: PathBuf,
22 workdir: PathBuf,
24 },
25}
26
27impl RepoPath {
28 pub fn gitpath(&self) -> &Path {
30 match self {
31 Self::Path(p) => p.as_path(),
32 Self::Workdir { gitdir, .. } => gitdir.as_path(),
33 }
34 }
35
36 pub fn workdir(&self) -> Option<&Path> {
38 match self {
39 Self::Path(_) => None,
40 Self::Workdir { workdir, .. } => Some(workdir.as_path()),
41 }
42 }
43}
44
45impl From<&str> for RepoPath {
46 fn from(p: &str) -> Self {
47 Self::Path(PathBuf::from(p))
48 }
49}
50
51pub fn repo(repo_path: &RepoPath) -> Result<Repository> {
52 let repo = Repository::open_ext(
53 repo_path.gitpath(),
54 RepositoryOpenFlags::empty(),
55 Vec::<&Path>::new(),
56 )?;
57
58 if let Some(workdir) = repo_path.workdir() {
59 repo.set_workdir(workdir, false)?;
60 }
61
62 Ok(repo)
63}