From 62e763d0d329213db76aed8bd2408a3ec80a2cac Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 8 May 2023 08:44:41 -0700 Subject: [PATCH] Removed test modifications, added special case to git initialization for when the repository is inside a .git folder --- .../src/tests/randomized_integration_tests.rs | 24 ++- crates/project/src/worktree.rs | 140 ++++++------------ 2 files changed, 54 insertions(+), 110 deletions(-) diff --git a/crates/collab/src/tests/randomized_integration_tests.rs b/crates/collab/src/tests/randomized_integration_tests.rs index c535bc8dce8cf1c88b41abd6fc3008a80dbaa2d4..ed50059e4aa83d699f1703da11abdc563699c6f8 100644 --- a/crates/collab/src/tests/randomized_integration_tests.rs +++ b/crates/collab/src/tests/randomized_integration_tests.rs @@ -29,7 +29,7 @@ use std::{ sync::{ atomic::{AtomicBool, Ordering::SeqCst}, Arc, - }, ffi::OsStr, + }, }; use util::ResultExt; @@ -765,7 +765,7 @@ async fn apply_client_operation( contents, } => { if !client.fs.directories().contains(&repo_path) { - client.fs.create_dir(&repo_path).await?; + return Err(TestError::Inapplicable); } log::info!( @@ -791,7 +791,7 @@ async fn apply_client_operation( new_branch, } => { if !client.fs.directories().contains(&repo_path) { - client.fs.create_dir(&repo_path).await?; + return Err(TestError::Inapplicable); } log::info!( @@ -1700,16 +1700,13 @@ impl TestPlan { let repo_path = client .fs .directories() + .into_iter() + .filter(|dir| dir.ends_with(".git")) + .collect::>() .choose(&mut self.rng) .unwrap() .clone(); - let repo_path = if repo_path.file_name() == Some(&OsStr::new(".git")) { - repo_path.parent().unwrap().join(Alphanumeric.sample_string(&mut self.rng, 16)) - } else { - repo_path - }; - let mut file_paths = client .fs .files() @@ -1741,16 +1738,13 @@ impl TestPlan { let repo_path = client .fs .directories() + .into_iter() + .filter(|dir| dir.ends_with(".git")) + .collect::>() .choose(&mut self.rng) .unwrap() .clone(); - let repo_path = if repo_path.file_name() == Some(&OsStr::new(".git")) { - repo_path.parent().unwrap().join(Alphanumeric.sample_string(&mut self.rng, 16)) - } else { - repo_path - }; - let new_branch = (self.rng.gen_range(0..10) > 3) .then(|| Alphanumeric.sample_string(&mut self.rng, 8)); diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 136b0664e3e7a32a9d40651408dbf7a80672d143..554304f3d32dd4c223807a3ffbc9028bf93478ee 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -1808,36 +1808,7 @@ impl LocalSnapshot { } if parent_path.file_name() == Some(&DOT_GIT) { - let abs_path = self.abs_path.join(&parent_path); - let work_dir: Arc = parent_path.parent().unwrap().into(); - - if let Some(work_dir_id) = self.entry_for_path(work_dir.clone()).map(|entry| entry.id) { - if self.git_repositories.get(&work_dir_id).is_none() { - if let Some(repo) = fs.open_repo(abs_path.as_path()) { - let work_directory = RepositoryWorkDirectory(work_dir.clone()); - - let repo_lock = repo.lock(); - let scan_id = self.scan_id; - self.repository_entries.insert( - work_directory, - RepositoryEntry { - work_directory: work_dir_id.into(), - branch: repo_lock.branch_name().map(Into::into), - }, - ); - drop(repo_lock); - - self.git_repositories.insert( - work_dir_id, - LocalRepositoryEntry { - scan_id, - repo_ptr: repo, - git_dir_path: parent_path.clone(), - }, - ) - } - } - } + self.build_repo(parent_path, fs); } let mut entries_by_path_edits = vec![Edit::Insert(parent_entry)]; @@ -1858,6 +1829,50 @@ impl LocalSnapshot { self.entries_by_id.edit(entries_by_id_edits, &()); } + fn build_repo(&mut self, parent_path: Arc, fs: &dyn Fs) -> Option<()> { + let abs_path = self.abs_path.join(&parent_path); + let work_dir: Arc = parent_path.parent().unwrap().into(); + + // Guard against repositories inside the repository metadata + if work_dir + .components() + .find(|component| component.as_os_str() == *DOT_GIT) + .is_some() + { + return None; + }; + + let work_dir_id = self + .entry_for_path(work_dir.clone()) + .map(|entry| entry.id)?; + + if self.git_repositories.get(&work_dir_id).is_none() { + let repo = fs.open_repo(abs_path.as_path())?; + let work_directory = RepositoryWorkDirectory(work_dir.clone()); + let scan_id = self.scan_id; + + let repo_lock = repo.lock(); + self.repository_entries.insert( + work_directory, + RepositoryEntry { + work_directory: work_dir_id.into(), + branch: repo_lock.branch_name().map(Into::into), + }, + ); + drop(repo_lock); + + self.git_repositories.insert( + work_dir_id, + LocalRepositoryEntry { + scan_id, + repo_ptr: repo, + git_dir_path: parent_path.clone(), + }, + ) + } + + Some(()) + } fn reuse_entry_id(&mut self, entry: &mut Entry) { if let Some(removed_entry_id) = self.removed_entry_ids.remove(&entry.inode) { entry.id = removed_entry_id; @@ -3671,71 +3686,6 @@ mod tests { }); } - // #[test] - // fn test_changed_repos() { - // fn fake_entry(work_dir_id: usize, scan_id: usize) -> RepositoryEntry { - // RepositoryEntry { - // scan_id, - // work_directory: ProjectEntryId(work_dir_id).into(), - // branch: None, - // } - // } - - // let mut prev_repos = TreeMap::::default(); - // prev_repos.insert( - // RepositoryWorkDirectory(Path::new("don't-care-1").into()), - // fake_entry(1, 0), - // ); - // prev_repos.insert( - // RepositoryWorkDirectory(Path::new("don't-care-2").into()), - // fake_entry(2, 0), - // ); - // prev_repos.insert( - // RepositoryWorkDirectory(Path::new("don't-care-3").into()), - // fake_entry(3, 0), - // ); - - // let mut new_repos = TreeMap::::default(); - // new_repos.insert( - // RepositoryWorkDirectory(Path::new("don't-care-4").into()), - // fake_entry(2, 1), - // ); - // new_repos.insert( - // RepositoryWorkDirectory(Path::new("don't-care-5").into()), - // fake_entry(3, 0), - // ); - // new_repos.insert( - // RepositoryWorkDirectory(Path::new("don't-care-6").into()), - // fake_entry(4, 0), - // ); - - // let res = LocalWorktree::changed_repos(&prev_repos, &new_repos); - - // // Deletion retained - // assert!(res - // .iter() - // .find(|repo| repo.work_directory.0 .0 == 1 && repo.scan_id == 0) - // .is_some()); - - // // Update retained - // assert!(res - // .iter() - // .find(|repo| repo.work_directory.0 .0 == 2 && repo.scan_id == 1) - // .is_some()); - - // // Addition retained - // assert!(res - // .iter() - // .find(|repo| repo.work_directory.0 .0 == 4 && repo.scan_id == 0) - // .is_some()); - - // // Nochange, not retained - // assert!(res - // .iter() - // .find(|repo| repo.work_directory.0 .0 == 3 && repo.scan_id == 0) - // .is_none()); - // } - #[gpui::test] async fn test_write_file(cx: &mut TestAppContext) { let dir = temp_tree(json!({