Add global Fs instance (#15044)

This PR adds a global `Fs` instance to the app context.

This will make it easier to access the filesystem in some cases instead
of having to thread it around.

Release Notes:

- N/A
This commit is contained in:
Marshall Bowers 2024-07-23 17:59:55 -04:00 committed by GitHub
parent 5062bf0b4d
commit d36ebc8c74
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 21 additions and 2 deletions

View File

@ -19,7 +19,7 @@ collections.workspace = true
futures.workspace = true futures.workspace = true
git.workspace = true git.workspace = true
git2.workspace = true git2.workspace = true
gpui = { workspace = true, optional = true } gpui.workspace = true
lazy_static.workspace = true lazy_static.workspace = true
libc.workspace = true libc.workspace = true
parking_lot.workspace = true parking_lot.workspace = true

View File

@ -12,6 +12,7 @@ use std::os::unix::fs::MetadataExt;
use async_tar::Archive; use async_tar::Archive;
use futures::{future::BoxFuture, AsyncRead, Stream, StreamExt}; use futures::{future::BoxFuture, AsyncRead, Stream, StreamExt};
use git::repository::{GitRepository, RealGitRepository}; use git::repository::{GitRepository, RealGitRepository};
use gpui::{AppContext, Global, ReadGlobal};
use rope::Rope; use rope::Rope;
use smol::io::AsyncWriteExt; use smol::io::AsyncWriteExt;
use std::{ use std::{
@ -102,6 +103,22 @@ pub trait Fs: Send + Sync {
} }
} }
struct GlobalFs(Arc<dyn Fs>);
impl Global for GlobalFs {}
impl dyn Fs {
/// Returns the global [`Fs`].
pub fn global(cx: &AppContext) -> Arc<Self> {
GlobalFs::global(cx).0.clone()
}
/// Sets the global [`Fs`].
pub fn set_global(fs: Arc<Self>, cx: &mut AppContext) {
cx.set_global(GlobalFs(fs));
}
}
#[derive(Copy, Clone, Default)] #[derive(Copy, Clone, Default)]
pub struct CreateOptions { pub struct CreateOptions {
pub overwrite: bool, pub overwrite: bool,

View File

@ -14,7 +14,7 @@ use collab_ui::channel_view::ChannelView;
use db::kvp::KEY_VALUE_STORE; use db::kvp::KEY_VALUE_STORE;
use editor::Editor; use editor::Editor;
use env_logger::Builder; use env_logger::Builder;
use fs::RealFs; use fs::{Fs, RealFs};
use futures::{future, StreamExt}; use futures::{future, StreamExt};
use git::GitHostingProviderRegistry; use git::GitHostingProviderRegistry;
use gpui::{ use gpui::{
@ -399,6 +399,8 @@ fn main() {
AppCommitSha::set_global(AppCommitSha(build_sha.into()), cx); AppCommitSha::set_global(AppCommitSha(build_sha.into()), cx);
} }
<dyn Fs>::set_global(fs.clone(), cx);
GitHostingProviderRegistry::set_global(git_hosting_provider_registry, cx); GitHostingProviderRegistry::set_global(git_hosting_provider_registry, cx);
git_hosting_providers::init(cx); git_hosting_providers::init(cx);