fs: Move Repository trait into git crate (#10768)

Piotr Osiewicz created

/cc @mrnugget 
Release Notes:

- N/A

Change summary

Cargo.lock                                                    |  6 ++
crates/collab/src/tests/integration_tests.rs                  |  3 
crates/collab/src/tests/random_project_collaboration_tests.rs |  3 
crates/editor/src/items.rs                                    |  2 
crates/fs/Cargo.toml                                          |  5 -
crates/fs/src/fs.rs                                           | 10 +--
crates/git/Cargo.toml                                         |  3 +
crates/git/src/git.rs                                         |  1 
crates/git/src/repository.rs                                  | 12 ++--
crates/project/src/project.rs                                 |  3 
crates/project_panel/Cargo.toml                               |  1 
crates/project_panel/src/project_panel.rs                     |  6 -
crates/vcs_menu/Cargo.toml                                    |  2 
crates/vcs_menu/src/lib.rs                                    |  2 
crates/worktree/src/worktree.rs                               | 10 ++--
crates/worktree/src/worktree_tests.rs                         |  4 
16 files changed, 38 insertions(+), 35 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -4318,7 +4318,9 @@ dependencies = [
  "git2",
  "lazy_static",
  "log",
+ "parking_lot",
  "pretty_assertions",
+ "rope",
  "serde",
  "serde_json",
  "smol",
@@ -4327,6 +4329,7 @@ dependencies = [
  "time",
  "unindent",
  "url",
+ "util",
  "windows 0.53.0",
 ]
 
@@ -7375,6 +7378,7 @@ dependencies = [
  "db",
  "editor",
  "file_icons",
+ "git",
  "gpui",
  "language",
  "menu",
@@ -10988,8 +10992,8 @@ name = "vcs_menu"
 version = "0.1.0"
 dependencies = [
  "anyhow",
- "fs",
  "fuzzy",
+ "git",
  "gpui",
  "picker",
  "ui",

crates/collab/src/tests/integration_tests.rs 🔗

@@ -9,8 +9,9 @@ use anyhow::{anyhow, Result};
 use call::{room, ActiveCall, ParticipantLocation, Room};
 use client::{User, RECEIVE_TIMEOUT};
 use collections::{HashMap, HashSet};
-use fs::{repository::GitFileStatus, FakeFs, Fs as _, RemoveOptions};
+use fs::{FakeFs, Fs as _, RemoveOptions};
 use futures::{channel::mpsc, StreamExt as _};
+use git::repository::GitFileStatus;
 use gpui::{
     px, size, AppContext, BackgroundExecutor, BorrowAppContext, Model, Modifiers, MouseButton,
     MouseDownEvent, TestAppContext,

crates/collab/src/tests/random_project_collaboration_tests.rs 🔗

@@ -5,8 +5,9 @@ use async_trait::async_trait;
 use call::ActiveCall;
 use collections::{BTreeMap, HashMap};
 use editor::Bias;
-use fs::{repository::GitFileStatus, FakeFs, Fs as _};
+use fs::{FakeFs, Fs as _};
 use futures::StreamExt;
+use git::repository::GitFileStatus;
 use gpui::{BackgroundExecutor, Model, TestAppContext};
 use language::{
     range_to_lsp, FakeLspAdapter, Language, LanguageConfig, LanguageMatcher, PointUtf16,

crates/editor/src/items.rs 🔗

@@ -6,6 +6,7 @@ use crate::{
 use anyhow::{anyhow, Context as _, Result};
 use collections::HashSet;
 use futures::future::try_join_all;
+use git::repository::GitFileStatus;
 use gpui::{
     point, AnyElement, AppContext, AsyncWindowContext, Context, Entity, EntityId, EventEmitter,
     IntoElement, Model, ParentElement, Pixels, SharedString, Styled, Task, View, ViewContext,
@@ -15,7 +16,6 @@ use language::{
     proto::serialize_anchor as serialize_text_anchor, Bias, Buffer, CharKind, OffsetRangeExt,
     Point, SelectionGoal,
 };
-use project::repository::GitFileStatus;
 use project::{search::SearchQuery, FormatTrigger, Item as _, Project, ProjectPath};
 use rpc::proto::{self, update_view, PeerId};
 use settings::Settings;

crates/fs/Cargo.toml 🔗

@@ -16,7 +16,6 @@ collections.workspace = true
 rope.workspace = true
 text.workspace = true
 util.workspace = true
-sum_tree.workspace = true
 
 anyhow.workspace = true
 async-tar.workspace = true
@@ -29,9 +28,7 @@ smol.workspace = true
 git.workspace = true
 git2.workspace = true
 serde.workspace = true
-serde_derive.workspace = true
 serde_json.workspace = true
-log.workspace = true
 libc = "0.2"
 time.workspace = true
 
@@ -50,4 +47,4 @@ windows.workspace = true
 gpui = { workspace = true, features = ["test-support"] }
 
 [features]
-test-support = ["gpui/test-support"]
+test-support = ["gpui/test-support", "git/test-support"]

crates/fs/src/fs.rs 🔗

@@ -1,5 +1,3 @@
-pub mod repository;
-
 use anyhow::{anyhow, Result};
 
 #[cfg(unix)]
@@ -7,9 +5,9 @@ use std::os::unix::fs::MetadataExt;
 
 use async_tar::Archive;
 use futures::{future::BoxFuture, AsyncRead, Stream, StreamExt};
+use git::repository::{GitRepository, RealGitRepository};
 use git2::Repository as LibGitRepository;
 use parking_lot::Mutex;
-use repository::{GitRepository, RealGitRepository};
 use rope::Rope;
 #[cfg(any(test, feature = "test-support"))]
 use smol::io::AsyncReadExt;
@@ -29,7 +27,7 @@ use util::{paths, ResultExt};
 #[cfg(any(test, feature = "test-support"))]
 use collections::{btree_map, BTreeMap};
 #[cfg(any(test, feature = "test-support"))]
-use repository::{FakeGitRepositoryState, GitFileStatus};
+use git::repository::{FakeGitRepositoryState, GitFileStatus};
 #[cfg(any(test, feature = "test-support"))]
 use std::ffi::OsStr;
 
@@ -525,7 +523,7 @@ enum FakeFsEntry {
         inode: u64,
         mtime: SystemTime,
         entries: BTreeMap<String, Arc<Mutex<FakeFsEntry>>>,
-        git_repo_state: Option<Arc<Mutex<repository::FakeGitRepositoryState>>>,
+        git_repo_state: Option<Arc<Mutex<git::repository::FakeGitRepositoryState>>>,
     },
     Symlink {
         target: PathBuf,
@@ -1417,7 +1415,7 @@ impl Fs for FakeFs {
             let state = git_repo_state
                 .get_or_insert_with(|| Arc::new(Mutex::new(FakeGitRepositoryState::default())))
                 .clone();
-            Some(repository::FakeGitRepository::open(state))
+            Some(git::repository::FakeGitRepository::open(state))
         } else {
             None
         }

crates/git/Cargo.toml 🔗

@@ -24,6 +24,9 @@ text.workspace = true
 time.workspace = true
 url.workspace = true
 serde.workspace = true
+rope.workspace = true
+util.workspace = true
+parking_lot.workspace = true
 windows.workspace = true
 
 [dev-dependencies]

crates/git/src/git.rs 🔗

@@ -11,6 +11,7 @@ pub mod blame;
 pub mod commit;
 pub mod diff;
 pub mod permalink;
+pub mod repository;
 
 lazy_static! {
     pub static ref DOT_GIT: &'static OsStr = OsStr::new(".git");

crates/fs/src/repository.rs → crates/git/src/repository.rs 🔗

@@ -1,10 +1,10 @@
+use crate::blame::Blame;
 use anyhow::{Context, Result};
 use collections::HashMap;
-use git::blame::Blame;
 use git2::{BranchType, StatusShow};
 use parking_lot::Mutex;
 use rope::Rope;
-use serde_derive::{Deserialize, Serialize};
+use serde::{Deserialize, Serialize};
 use std::{
     cmp::Ordering,
     path::{Component, Path, PathBuf},
@@ -59,7 +59,7 @@ pub trait GitRepository: Send {
     fn change_branch(&self, _: &str) -> Result<()>;
     fn create_branch(&self, _: &str) -> Result<()>;
 
-    fn blame(&self, path: &Path, content: Rope) -> Result<git::blame::Blame>;
+    fn blame(&self, path: &Path, content: Rope) -> Result<crate::blame::Blame>;
 }
 
 impl std::fmt::Debug for dyn GitRepository {
@@ -231,7 +231,7 @@ impl GitRepository for RealGitRepository {
         Ok(())
     }
 
-    fn blame(&self, path: &Path, content: Rope) -> Result<git::blame::Blame> {
+    fn blame(&self, path: &Path, content: Rope) -> Result<crate::blame::Blame> {
         let working_directory = self
             .repository
             .workdir()
@@ -240,7 +240,7 @@ impl GitRepository for RealGitRepository {
         const REMOTE_NAME: &str = "origin";
         let remote_url = self.remote_url(REMOTE_NAME);
 
-        git::blame::Blame::for_path(
+        crate::blame::Blame::for_path(
             &self.git_binary_path,
             working_directory,
             path,
@@ -358,7 +358,7 @@ impl GitRepository for FakeGitRepository {
         Ok(())
     }
 
-    fn blame(&self, path: &Path, _content: Rope) -> Result<git::blame::Blame> {
+    fn blame(&self, path: &Path, _content: Rope) -> Result<crate::blame::Blame> {
         let state = self.state.lock();
         state
             .blames

crates/project/src/project.rs 🔗

@@ -21,7 +21,6 @@ use clock::ReplicaId;
 use collections::{hash_map, BTreeMap, HashMap, HashSet, VecDeque};
 use copilot::Copilot;
 use debounced_delay::DebouncedDelay;
-use fs::repository::GitRepository;
 use futures::{
     channel::{
         mpsc::{self, UnboundedReceiver},
@@ -32,7 +31,7 @@ use futures::{
     stream::FuturesUnordered,
     AsyncWriteExt, Future, FutureExt, StreamExt, TryFutureExt,
 };
-use git::blame::Blame;
+use git::{blame::Blame, repository::GitRepository};
 use globset::{Glob, GlobSet, GlobSetBuilder};
 use gpui::{
     AnyModel, AppContext, AsyncAppContext, BackgroundExecutor, BorrowAppContext, Context, Entity,

crates/project_panel/Cargo.toml 🔗

@@ -18,6 +18,7 @@ collections.workspace = true
 db.workspace = true
 editor.workspace = true
 file_icons.workspace = true
+git.workspace = true
 gpui.workspace = true
 menu.workspace = true
 pretty_assertions.workspace = true

crates/project_panel/src/project_panel.rs 🔗

@@ -8,6 +8,7 @@ use file_icons::FileIcons;
 
 use anyhow::{anyhow, Result};
 use collections::{hash_map, HashMap};
+use git::repository::GitFileStatus;
 use gpui::{
     actions, anchored, deferred, div, impl_actions, px, uniform_list, Action, AppContext,
     AssetSource, AsyncWindowContext, ClipboardItem, DismissEvent, Div, EventEmitter, FocusHandle,
@@ -16,10 +17,7 @@ use gpui::{
     UniformListScrollHandle, View, ViewContext, VisualContext as _, WeakView, WindowContext,
 };
 use menu::{Confirm, SelectNext, SelectPrev};
-use project::{
-    repository::GitFileStatus, Entry, EntryKind, Fs, Project, ProjectEntryId, ProjectPath,
-    Worktree, WorktreeId,
-};
+use project::{Entry, EntryKind, Fs, Project, ProjectEntryId, ProjectPath, Worktree, WorktreeId};
 use project_panel_settings::{ProjectPanelDockPosition, ProjectPanelSettings};
 use serde::{Deserialize, Serialize};
 use std::{

crates/vcs_menu/Cargo.toml 🔗

@@ -10,8 +10,8 @@ workspace = true
 
 [dependencies]
 anyhow.workspace = true
-fs.workspace = true
 fuzzy.workspace = true
+git.workspace = true
 gpui.workspace = true
 picker.workspace = true
 ui.workspace = true

crates/vcs_menu/src/lib.rs 🔗

@@ -1,6 +1,6 @@
 use anyhow::{anyhow, bail, Result};
-use fs::repository::Branch;
 use fuzzy::{StringMatch, StringMatchCandidate};
+use git::repository::Branch;
 use gpui::{
     actions, rems, AnyElement, AppContext, DismissEvent, Element, EventEmitter, FocusHandle,
     FocusableView, InteractiveElement, IntoElement, ParentElement, Render, SharedString, Styled,

crates/worktree/src/worktree.rs 🔗

@@ -8,11 +8,8 @@ use anyhow::{anyhow, Context as _, Result};
 use client::{proto, Client};
 use clock::ReplicaId;
 use collections::{HashMap, HashSet, VecDeque};
+use fs::Fs;
 use fs::{copy_recursive, RemoveOptions};
-use fs::{
-    repository::{GitFileStatus, GitRepository, RepoPath},
-    Fs,
-};
 use futures::{
     channel::{
         mpsc::{self, UnboundedSender},
@@ -23,7 +20,10 @@ use futures::{
     FutureExt as _, Stream, StreamExt,
 };
 use fuzzy::CharBag;
-use git::{DOT_GIT, GITIGNORE};
+use git::{
+    repository::{GitFileStatus, GitRepository, RepoPath},
+    DOT_GIT, GITIGNORE,
+};
 use gpui::{
     AppContext, AsyncAppContext, BackgroundExecutor, Context, EventEmitter, Model, ModelContext,
     Task,

crates/worktree/src/worktree_tests.rs 🔗

@@ -5,8 +5,8 @@ use crate::{
 use anyhow::Result;
 use client::Client;
 use clock::FakeSystemClock;
-use fs::{repository::GitFileStatus, FakeFs, Fs, RealFs, RemoveOptions};
-use git::GITIGNORE;
+use fs::{FakeFs, Fs, RealFs, RemoveOptions};
+use git::{repository::GitFileStatus, GITIGNORE};
 use gpui::{BorrowAppContext, ModelContext, Task, TestAppContext};
 use parking_lot::Mutex;
 use postage::stream::Stream;