Restored a lost API and got everything compiling

This commit is contained in:
Mikayla Maki 2023-05-02 16:12:51 -07:00
parent bcf608e9e9
commit ae890212e3
No known key found for this signature in database
2 changed files with 35 additions and 32 deletions

View File

@ -4700,6 +4700,8 @@ impl Project {
repos: &Vec<RepositoryEntry>,
cx: &mut ModelContext<Self>,
) {
debug_assert!(worktree.read(cx).is_local());
for (_, buffer) in &self.opened_buffers {
if let Some(buffer) = buffer.upgrade(cx) {
let file = match File::from_dyn(buffer.read(cx).file()) {

View File

@ -722,19 +722,24 @@ impl LocalWorktree {
let fs = self.fs.clone();
let snapshot = self.snapshot();
let mut index_task = None;
if let Some(repo) = snapshot.repo_for(&path) {
let repo_path = repo.work_directory.relativize(&path).unwrap();
if let Some(repo) = self.git_repositories.get(&repo.git_dir_entry_id) {
let repo = repo.to_owned();
index_task = Some(
cx.background()
.spawn(async move { repo.lock().load_index_text(&repo_path) }),
);
}
}
cx.spawn(|this, mut cx| async move {
let text = fs.load(&abs_path).await?;
let diff_base = if let Some((work_directory, repo)) = snapshot.repo_for_metadata(&path)
{
if let Ok(repo_relative) = path.strip_prefix(&work_directory) {
let repo_relative = repo_relative.to_owned();
cx.background()
.spawn(async move { repo.lock().load_index_text(&repo_relative) })
.await
} else {
None
}
let diff_base = if let Some(index_task) = index_task {
index_task.await
} else {
None
};
@ -1466,6 +1471,12 @@ impl Snapshot {
}
impl LocalSnapshot {
pub(crate) fn repo_for(&self, path: &Path) -> Option<RepositoryEntry> {
dbg!(&self.repository_entries)
.closest(&RepositoryWorkDirectory(path.into()))
.map(|(_, entry)| entry.to_owned())
}
pub(crate) fn repo_for_metadata(
&self,
path: &Path,
@ -3429,37 +3440,27 @@ mod tests {
.await;
tree.flush_fs_events(cx).await;
fn entry(key: &RepositoryWorkDirectory, tree: &LocalWorktree) -> RepositoryEntry {
tree.repository_entries.get(key).unwrap().to_owned()
}
tree.read_with(cx, |tree, _cx| {
let tree = tree.as_local().unwrap();
assert!(tree.repo_for_metadata("c.txt".as_ref()).is_none());
assert!(tree.repo_for("c.txt".as_ref()).is_none());
let (work_directory, _repo_entry) =
tree.repo_for_metadata("dir1/src/b.txt".as_ref()).unwrap();
assert_eq!(work_directory.0.as_ref(), Path::new("dir1"));
assert_eq!(
entry(&work_directory, &tree).git_dir_path.as_ref(),
Path::new("dir1/.git")
);
let entry = tree.repo_for("dir1/src/b.txt".as_ref()).unwrap();
assert_eq!(entry.work_directory.0.as_ref(), Path::new("dir1"));
assert_eq!(entry.git_dir_path.as_ref(), Path::new("dir1/.git"));
let _repo = tree
.repo_for_metadata("dir1/deps/dep1/src/a.txt".as_ref())
.unwrap();
assert_eq!(work_directory.deref(), Path::new("dir1/deps/dep1"));
let entry = tree.repo_for("dir1/deps/dep1/src/a.txt".as_ref()).unwrap();
assert_eq!(entry.work_directory.deref(), Path::new("dir1/deps/dep1"));
assert_eq!(
entry(&work_directory, &tree).git_dir_path.as_ref(),
entry.git_dir_path.as_ref(),
Path::new("dir1/deps/dep1/.git"),
);
});
let original_scan_id = tree.read_with(cx, |tree, _cx| {
let tree = tree.as_local().unwrap();
let (key, _) = tree.repo_for_metadata("dir1/src/b.txt".as_ref()).unwrap();
entry(&key, &tree).scan_id
let entry = tree.repo_for("dir1/src/b.txt".as_ref()).unwrap();
entry.scan_id
});
std::fs::write(root.path().join("dir1/.git/random_new_file"), "hello").unwrap();
@ -3468,8 +3469,8 @@ mod tests {
tree.read_with(cx, |tree, _cx| {
let tree = tree.as_local().unwrap();
let new_scan_id = {
let (key, _) = tree.repo_for_metadata("dir1/src/b.txt".as_ref()).unwrap();
entry(&key, &tree).scan_id
let entry = tree.repo_for("dir1/src/b.txt".as_ref()).unwrap();
entry.scan_id
};
assert_ne!(
original_scan_id, new_scan_id,
@ -3483,7 +3484,7 @@ mod tests {
tree.read_with(cx, |tree, _cx| {
let tree = tree.as_local().unwrap();
assert!(tree.repo_for_metadata("dir1/src/b.txt".as_ref()).is_none());
assert!(tree.repo_for("dir1/src/b.txt".as_ref()).is_none());
});
}