diff --git a/crates/fs/src/fake_git_repo.rs b/crates/fs/src/fake_git_repo.rs index ed62c21e1e70ca71dc0eb4cdeb90519ff0a77bda..4c74546fc9ff867d0b2a031c1d2d2c98e6f750be 100644 --- a/crates/fs/src/fake_git_repo.rs +++ b/crates/fs/src/fake_git_repo.rs @@ -1336,6 +1336,10 @@ impl GitRepository for FakeGitRepository { }) } + fn repair_worktrees(&self) -> BoxFuture<'_, Result<()>> { + async { Ok(()) }.boxed() + } + fn set_trusted(&self, trusted: bool) { self.is_trusted .store(trusted, std::sync::atomic::Ordering::Release); diff --git a/crates/git/src/repository.rs b/crates/git/src/repository.rs index 48648809e5dee26f5e678ef8942c4932318ec314..4db53ee05581be8ebfbe0e51de4473d98185792d 100644 --- a/crates/git/src/repository.rs +++ b/crates/git/src/repository.rs @@ -923,6 +923,8 @@ pub trait GitRepository: Send + Sync { fn stage_all_including_untracked(&self) -> BoxFuture<'_, Result<()>>; + fn repair_worktrees(&self) -> BoxFuture<'_, Result<()>>; + fn set_trusted(&self, trusted: bool); fn is_trusted(&self) -> bool; } @@ -2232,6 +2234,17 @@ impl GitRepository for RealGitRepository { .boxed() } + fn repair_worktrees(&self) -> BoxFuture<'_, Result<()>> { + let git_binary = self.git_binary(); + self.executor + .spawn(async move { + let args: Vec = vec!["worktree".into(), "repair".into()]; + git_binary?.run(&args).await?; + Ok(()) + }) + .boxed() + } + fn push( &self, branch_name: String, diff --git a/crates/project/src/git_store.rs b/crates/project/src/git_store.rs index fa06e8e8fd9888b80582b816632a3a28d7853e77..ab9b9b909bfa9a81c943f71d04b4f4e407e01504 100644 --- a/crates/project/src/git_store.rs +++ b/crates/project/src/git_store.rs @@ -6081,6 +6081,33 @@ impl Repository { }) } + pub fn resolve_commit(&mut self, sha: String) -> oneshot::Receiver> { + self.send_job(None, move |repo, _cx| async move { + match repo { + RepositoryState::Local(LocalRepositoryState { backend, .. }) => { + let results = backend.revparse_batch(vec![sha]).await?; + Ok(results.into_iter().next().flatten().is_some()) + } + RepositoryState::Remote(_) => { + anyhow::bail!("resolve_commit is not supported for remote repositories") + } + } + }) + } + + pub fn repair_worktrees(&mut self) -> oneshot::Receiver> { + self.send_job(None, move |repo, _cx| async move { + match repo { + RepositoryState::Local(LocalRepositoryState { backend, .. }) => { + backend.repair_worktrees().await + } + RepositoryState::Remote(_) => { + anyhow::bail!("repair_worktrees is not supported for remote repositories") + } + } + }) + } + pub fn remove_worktree(&mut self, path: PathBuf, force: bool) -> oneshot::Receiver> { let id = self.id; self.send_job(