diff --git a/asyncgit/src/sync/repository.rs b/asyncgit/src/sync/repository.rs index c49795fb..1daddb5f 100644 --- a/asyncgit/src/sync/repository.rs +++ b/asyncgit/src/sync/repository.rs @@ -68,11 +68,26 @@ pub fn repo(repo_path: &RepoPath) -> Result { Ok(repo) } +/// Path to pass to `gix::discover` so linked worktrees resolve `info/exclude` correctly. +pub(crate) fn repo_discover_path(repo_path: &RepoPath) -> Result { + if let Some(workdir) = repo_path.workdir() { + return Ok(workdir.to_path_buf()); + } + + let git_repo = repo(repo_path)?; + git_repo + .workdir() + .ok_or(crate::error::Error::NoWorkDir) + .map(|path| path.to_path_buf()) +} + pub fn gix_repo(repo_path: &RepoPath) -> Result { - let mut repo: gix::Repository = gix::ThreadSafeRepository::discover_with_environment_overrides( - repo_path.gitpath(), - ) - .map(Into::into)?; + let discover_path = repo_discover_path(repo_path)?; + let mut repo: gix::Repository = + gix::ThreadSafeRepository::discover_with_environment_overrides( + &discover_path, + ) + .map(Into::into)?; if let Some(workdir) = repo_path.workdir() { repo.set_workdir(Some(workdir.into()))?; diff --git a/asyncgit/src/sync/utils.rs b/asyncgit/src/sync/utils.rs index 148e29ba..c93e74a7 100644 --- a/asyncgit/src/sync/utils.rs +++ b/asyncgit/src/sync/utils.rs @@ -1,7 +1,8 @@ //! sync git api (various methods) use super::{ - repository::repo, CommitId, RepoPath, ShowUntrackedFilesConfig, + repository::{repo, repo_discover_path}, + CommitId, RepoPath, ShowUntrackedFilesConfig, }; use crate::{ error::{Error, Result}, @@ -35,7 +36,7 @@ pub fn repo_open_error(repo_path: &RepoPath) -> Option { } gix::ThreadSafeRepository::discover_with_environment_overrides( - repo_path.gitpath(), + repo_discover_path(repo_path).ok()?, ) .map_or_else(|e| Some(e.to_string()), |_| None) }