refactor git cache
This commit is contained in:
@@ -90,9 +90,13 @@ pub fn nostr_dir() -> &'static PathBuf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the local git clone cache, the grasp mirrors.
|
/// Returns the path to the local git clone cache, the grasp mirrors.
|
||||||
|
///
|
||||||
|
/// The mirrors are disposable and re-cloned from their grasp server on
|
||||||
|
/// demand, so the cache lives in the OS temp directory for the system to
|
||||||
|
/// reclaim.
|
||||||
pub fn repos_dir() -> &'static PathBuf {
|
pub fn repos_dir() -> &'static PathBuf {
|
||||||
static REPOS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
static REPOS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||||
REPOS_DIR.get_or_init(|| data_dir().join("repos"))
|
REPOS_DIR.get_or_init(|| std::env::temp_dir().join(APP_NAME_LOWERCASE).join("repos"))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn settings_file() -> &'static PathBuf {
|
pub fn settings_file() -> &'static PathBuf {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ use nostr_sdk::prelude::*;
|
|||||||
use signed_core::{Announcement, RepoAddr, build_state, filters, identifier_from_name};
|
use signed_core::{Announcement, RepoAddr, build_state, filters, identifier_from_name};
|
||||||
use signed_nostr::{SignedAuthUrlHandler, UniversalSigner, Update};
|
use signed_nostr::{SignedAuthUrlHandler, UniversalSigner, Update};
|
||||||
|
|
||||||
use crate::git_store::GitStore;
|
use crate::git_store::git_cache;
|
||||||
use crate::inbox::Inbox;
|
use crate::inbox::Inbox;
|
||||||
use crate::repos::RepoListStore;
|
use crate::repos::RepoListStore;
|
||||||
|
|
||||||
@@ -756,7 +756,7 @@ impl Backend {
|
|||||||
announcement: Announcement,
|
announcement: Announcement,
|
||||||
cx: &mut Context<Self>,
|
cx: &mut Context<Self>,
|
||||||
) -> Task<Result<PushOutcome, Error>> {
|
) -> Task<Result<PushOutcome, Error>> {
|
||||||
let cache = GitStore::global(cx).cache().clone();
|
let cache = git_cache();
|
||||||
let path = cache.repo_path(&announcement.addr());
|
let path = cache.repo_path(&announcement.addr());
|
||||||
self.push_repo_from(announcement, path, None, cx)
|
self.push_repo_from(announcement, path, None, cx)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use settings::{CheckoutRecord, SettingsStore};
|
|||||||
use signed_core::{Announcement, RepoAddr};
|
use signed_core::{Announcement, RepoAddr};
|
||||||
|
|
||||||
use crate::backend::{Backend, BackendEvent};
|
use crate::backend::{Backend, BackendEvent};
|
||||||
use crate::git_store::GitStore;
|
use crate::git_store::git_cache;
|
||||||
use crate::refresh::{RefreshGate, RefreshRequest};
|
use crate::refresh::{RefreshGate, RefreshRequest};
|
||||||
use crate::repos::{LocalReposStore, RepoListStore};
|
use crate::repos::{LocalReposStore, RepoListStore};
|
||||||
|
|
||||||
@@ -328,7 +328,7 @@ impl CheckoutsStore {
|
|||||||
|
|
||||||
let announcements = RepoListStore::global(cx).read(cx).announcements.clone();
|
let announcements = RepoListStore::global(cx).read(cx).announcements.clone();
|
||||||
let scanned = LocalReposStore::global(cx).read(cx).repos.clone();
|
let scanned = LocalReposStore::global(cx).read(cx).repos.clone();
|
||||||
let cache_root = GitStore::global(cx).cache().root().canonicalize().ok();
|
let cache_root = git_cache().root().canonicalize().ok();
|
||||||
|
|
||||||
let requested: Vec<(RepoAddr, Option<String>)> = self
|
let requested: Vec<(RepoAddr, Option<String>)> = self
|
||||||
.status_requested
|
.status_requested
|
||||||
|
|||||||
@@ -1,32 +1,19 @@
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use std::sync::OnceLock;
|
||||||
|
|
||||||
use gpui::{App, Global};
|
|
||||||
use signed_git::GitCache;
|
use signed_git::GitCache;
|
||||||
|
|
||||||
struct GlobalGitStore(GitCache);
|
static GIT_CACHE: OnceLock<GitCache> = OnceLock::new();
|
||||||
|
|
||||||
impl Global for GlobalGitStore {}
|
|
||||||
|
|
||||||
/// Global access to the on-disk git clone cache, the grasp mirrors.
|
/// Global access to the on-disk git clone cache, the grasp mirrors.
|
||||||
#[derive(Debug, Clone)]
|
pub fn git_cache() -> &'static GitCache {
|
||||||
pub struct GitStore(GitCache);
|
GIT_CACHE
|
||||||
|
.get()
|
||||||
|
.expect("git cache is initialized by signed_state::init")
|
||||||
|
}
|
||||||
|
|
||||||
impl GitStore {
|
pub(crate) fn set_git_cache(root: impl Into<PathBuf>) {
|
||||||
pub fn set_global(root: impl Into<PathBuf>, cx: &mut App) -> Self {
|
if GIT_CACHE.set(GitCache::new(root.into())).is_err() {
|
||||||
let store = Self::new(root);
|
log::warn!("git cache root is already set, keeping the first one");
|
||||||
cx.set_global(GlobalGitStore(store.0.clone()));
|
|
||||||
store
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn global(cx: &App) -> Self {
|
|
||||||
Self(cx.global::<GlobalGitStore>().0.clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn new(root: impl Into<PathBuf>) -> Self {
|
|
||||||
Self(GitCache::new(root.into()))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn cache(&self) -> &GitCache {
|
|
||||||
&self.0
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ use std::path::{Path, PathBuf};
|
|||||||
|
|
||||||
pub use backend::{Backend, BackendEvent, user_grasp_list_servers};
|
pub use backend::{Backend, BackendEvent, user_grasp_list_servers};
|
||||||
pub use checkouts::{CheckoutStatus, CheckoutsStore, pr_proposes_checkout};
|
pub use checkouts::{CheckoutStatus, CheckoutsStore, pr_proposes_checkout};
|
||||||
pub use git_store::GitStore;
|
pub use git_store::git_cache;
|
||||||
|
use git_store::set_git_cache;
|
||||||
use gpui::{App, AppContext};
|
use gpui::{App, AppContext};
|
||||||
pub use inbox::{Inbox, query_inbox};
|
pub use inbox::{Inbox, query_inbox};
|
||||||
pub use nostr_sdk::prelude::Timestamp;
|
pub use nostr_sdk::prelude::Timestamp;
|
||||||
@@ -31,6 +32,7 @@ pub fn init(
|
|||||||
// rustls uses the `aws_lc_rs` provider by default.
|
// rustls uses the `aws_lc_rs` provider by default.
|
||||||
let _ = rustls::crypto::aws_lc_rs::default_provider().install_default();
|
let _ = rustls::crypto::aws_lc_rs::default_provider().install_default();
|
||||||
|
|
||||||
|
// Initialize the nostr client and signer
|
||||||
let (client, signer) = cx.foreground_executor().block_on(async move {
|
let (client, signer) = cx.foreground_executor().block_on(async move {
|
||||||
let path = db_path.as_ref().to_path_buf();
|
let path = db_path.as_ref().to_path_buf();
|
||||||
new_backend(path)
|
new_backend(path)
|
||||||
@@ -38,11 +40,22 @@ pub fn init(
|
|||||||
.expect("failed to initialize nostr backend")
|
.expect("failed to initialize nostr backend")
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Set Git cache for the repos root
|
||||||
|
set_git_cache(repos_root);
|
||||||
|
|
||||||
|
// Set global stores for the backend
|
||||||
Backend::set_global(cx.new(|cx| Backend::new(client, signer, cx)), cx);
|
Backend::set_global(cx.new(|cx| Backend::new(client, signer, cx)), cx);
|
||||||
|
|
||||||
|
// Set global stores for the profile
|
||||||
ProfileStore::set_global(cx.new(ProfileStore::new), cx);
|
ProfileStore::set_global(cx.new(ProfileStore::new), cx);
|
||||||
|
|
||||||
|
// Set global stores for the repo list and local repos
|
||||||
RepoListStore::set_global(cx.new(RepoListStore::new), cx);
|
RepoListStore::set_global(cx.new(RepoListStore::new), cx);
|
||||||
GitStore::set_global(repos_root, cx);
|
|
||||||
|
// Set global stores for the local repos
|
||||||
LocalReposStore::set_global(cx.new(|cx| LocalReposStore::new(scan_paths, cx)), cx);
|
LocalReposStore::set_global(cx.new(|cx| LocalReposStore::new(scan_paths, cx)), cx);
|
||||||
|
|
||||||
|
// Set global stores for the checkouts
|
||||||
CheckoutsStore::set_global(cx.new(CheckoutsStore::new), cx);
|
CheckoutsStore::set_global(cx.new(CheckoutsStore::new), cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,10 +63,10 @@ pub fn init(
|
|||||||
#[cfg(target_arch = "wasm32")]
|
#[cfg(target_arch = "wasm32")]
|
||||||
pub fn init(cx: &mut App) {
|
pub fn init(cx: &mut App) {
|
||||||
let (client, signer) = new_backend().expect("failed to initialize nostr backend");
|
let (client, signer) = new_backend().expect("failed to initialize nostr backend");
|
||||||
|
set_git_cache(PathBuf::new());
|
||||||
Backend::set_global(cx.new(|cx| Backend::new(client, signer, cx)), cx);
|
Backend::set_global(cx.new(|cx| Backend::new(client, signer, cx)), cx);
|
||||||
ProfileStore::set_global(cx.new(ProfileStore::new), cx);
|
ProfileStore::set_global(cx.new(ProfileStore::new), cx);
|
||||||
RepoListStore::set_global(cx.new(RepoListStore::new), cx);
|
RepoListStore::set_global(cx.new(RepoListStore::new), cx);
|
||||||
GitStore::set_global(PathBuf::new(), cx);
|
|
||||||
LocalReposStore::set_global(cx.new(|cx| LocalReposStore::new(Vec::new(), cx)), cx);
|
LocalReposStore::set_global(cx.new(|cx| LocalReposStore::new(Vec::new(), cx)), cx);
|
||||||
CheckoutsStore::set_global(cx.new(|cx| CheckoutsStore::new(cx)), cx);
|
CheckoutsStore::set_global(cx.new(|cx| CheckoutsStore::new(cx)), cx);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ use crate::backend::{
|
|||||||
user_grasp_list_servers,
|
user_grasp_list_servers,
|
||||||
};
|
};
|
||||||
use crate::checkouts::CheckoutsStore;
|
use crate::checkouts::CheckoutsStore;
|
||||||
use crate::git_store::GitStore;
|
use crate::git_store::git_cache;
|
||||||
use crate::refresh::{RefreshGate, RefreshRequest};
|
use crate::refresh::{RefreshGate, RefreshRequest};
|
||||||
use crate::repos::RepoListStore;
|
use crate::repos::RepoListStore;
|
||||||
|
|
||||||
@@ -1196,7 +1196,7 @@ impl RepoStore {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let cache = GitStore::global(cx).cache().clone();
|
let cache = git_cache();
|
||||||
|
|
||||||
let clone_urls: Vec<Url> = self
|
let clone_urls: Vec<Url> = self
|
||||||
.announcement
|
.announcement
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ use signed_core::{
|
|||||||
merge_base_of, pull_request_patch,
|
merge_base_of, pull_request_patch,
|
||||||
};
|
};
|
||||||
use signed_git::{FileCommit, patch_commits, patch_diffs};
|
use signed_git::{FileCommit, patch_commits, patch_diffs};
|
||||||
use signed_state::{Backend, GitStore, ProfileStore, RepoStore};
|
use signed_state::{Backend, ProfileStore, RepoStore, git_cache};
|
||||||
use signed_ui::{CountBadge, UserAvatar, placeholder, status_badge};
|
use signed_ui::{CountBadge, UserAvatar, placeholder, status_badge};
|
||||||
use utils::{relative_time, relative_time_secs};
|
use utils::{relative_time, relative_time_secs};
|
||||||
|
|
||||||
@@ -217,7 +217,7 @@ impl PullRequestDetailView {
|
|||||||
self.current_commit = binding.tip.clone().map(SharedString::from);
|
self.current_commit = binding.tip.clone().map(SharedString::from);
|
||||||
cx.notify();
|
cx.notify();
|
||||||
|
|
||||||
let cache = GitStore::global(cx).cache().clone();
|
let cache = git_cache();
|
||||||
|
|
||||||
self.load_generation = self.load_generation.wrapping_add(1);
|
self.load_generation = self.load_generation.wrapping_add(1);
|
||||||
let generation = self.load_generation;
|
let generation = self.load_generation;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ use signed_git::{
|
|||||||
delete_refs_with_prefix, fetch_repo_refs, fork_namespace, merge_base, refs_with_prefix,
|
delete_refs_with_prefix, fetch_repo_refs, fork_namespace, merge_base, refs_with_prefix,
|
||||||
worktree_commit_range_commits, worktree_commit_range_diff,
|
worktree_commit_range_commits, worktree_commit_range_diff,
|
||||||
};
|
};
|
||||||
use signed_state::{Backend, CheckoutsStore, GitStore, RepoListStore, RepoStore};
|
use signed_state::{Backend, CheckoutsStore, RepoListStore, RepoStore, git_cache};
|
||||||
use signed_ui::{CountBadge, placeholder, ref_selector_trigger};
|
use signed_ui::{CountBadge, placeholder, ref_selector_trigger};
|
||||||
|
|
||||||
use crate::views::commit_diff::{COMMIT_ROW_HEIGHT, CommitDiffView, DiffPane, commit_row};
|
use crate::views::commit_diff::{COMMIT_ROW_HEIGHT, CommitDiffView, DiffPane, commit_row};
|
||||||
@@ -533,7 +533,7 @@ impl NewPullRequestView {
|
|||||||
let Some((base, _euc)) = self.base_repo(cx) else {
|
let Some((base, _euc)) = self.base_repo(cx) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let cache = GitStore::global(cx).cache().clone();
|
let cache = git_cache();
|
||||||
let mirror_path = cache.repo_path(&base);
|
let mirror_path = cache.repo_path(&base);
|
||||||
let namespace = fork_namespace(&announcement);
|
let namespace = fork_namespace(&announcement);
|
||||||
let clone_urls = announcement.clone.clone();
|
let clone_urls = announcement.clone.clone();
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ use nostr::prelude::{RelayUrl, ToBech32, Url};
|
|||||||
use signed_core::{Announcement, RepoAddr, RepoStatus};
|
use signed_core::{Announcement, RepoAddr, RepoStatus};
|
||||||
use signed_git::FileCommit;
|
use signed_git::FileCommit;
|
||||||
use signed_state::{
|
use signed_state::{
|
||||||
Backend, CheckoutStatus, CheckoutsStore, GitStore, LocalReposStore, ProfileStore,
|
Backend, CheckoutStatus, CheckoutsStore, LocalReposStore, ProfileStore, RepoListStore,
|
||||||
RepoListStore, RepoStore, pr_proposes_checkout,
|
RepoStore, git_cache, pr_proposes_checkout,
|
||||||
};
|
};
|
||||||
use signed_ui::{
|
use signed_ui::{
|
||||||
CountBadge, DropdownButton, PixelAvatar, UserAvatar, copy_row, menu_copy_row, middle_truncate,
|
CountBadge, DropdownButton, PixelAvatar, UserAvatar, copy_row, menu_copy_row, middle_truncate,
|
||||||
@@ -343,7 +343,7 @@ impl RepoDetailView {
|
|||||||
|
|
||||||
self.repo_started = true;
|
self.repo_started = true;
|
||||||
|
|
||||||
let cache = GitStore::global(cx).cache().clone();
|
let cache = git_cache();
|
||||||
let addr = announcement.addr();
|
let addr = announcement.addr();
|
||||||
let clone_urls: Vec<Url> = announcement.clone.clone();
|
let clone_urls: Vec<Url> = announcement.clone.clone();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user