From e207c761a7266a842066c45df2f0cfd57cf2d958 Mon Sep 17 00:00:00 2001 From: pleasedontbreak123 Date: Mon, 30 Jun 2025 15:11:01 +0800 Subject: [PATCH 1/5] adapt new conntext api --- monobean/Cargo.toml | 1 + monobean/src/core/mega_core.rs | 58 +++++++++++++++++++++++----------- monobean/src/core/servers.rs | 9 +++--- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/monobean/Cargo.toml b/monobean/Cargo.toml index 21f621928..9d5a4e9f1 100644 --- a/monobean/Cargo.toml +++ b/monobean/Cargo.toml @@ -25,6 +25,7 @@ vault = { path = "../vault" } gateway = { path = "../gateway" } ceres = { path = "../ceres" } mercury = { path = "../mercury" } +context = {path = "../context"} thiserror = { version = "2.0.11", features = ["default"] } tracing-subscriber = { version = "0.3.19", features = ["default", "env-filter"] } diff --git a/monobean/src/core/mega_core.rs b/monobean/src/core/mega_core.rs index cadba8386..4eeaa1098 100644 --- a/monobean/src/core/mega_core.rs +++ b/monobean/src/core/mega_core.rs @@ -9,7 +9,8 @@ use ceres::api_service::ApiHandler; use ceres::protocol::repo::Repo; use common::config::Config; use common::model::P2pOptions; -use jupiter::context::Context as MegaContext; +// use jupiter::context::Context as MegaContext; +use context::AppContext as MegaContext; use mercury::internal::object::tree::Tree; use std::fmt; use std::fmt::{Debug, Formatter}; @@ -19,6 +20,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use tokio::sync::{oneshot, OnceCell, RwLock}; use vault::pgp::{SignedPublicKey, SignedSecretKey}; +use vault::integration::vault_core::VaultCore; pub struct MegaCore { config: Arc>, @@ -145,20 +147,30 @@ impl MegaCore { chan.send(Err(MonoBeanError::ReinitError)).unwrap(); return; } + + + let guard = self.running_context.read().await; + let vault_core = if let Some(ctx) = guard.as_ref() { + &ctx.vault + } else { + return; + }; + + - if let Some(pk) = vault::pgp::load_pub_key().await { - let sk = vault::pgp::load_sec_key().await.unwrap(); + if let Some(pk) = vault_core.load_pub_key() { + let sk = vault_core.load_sec_key().await.unwrap(); chan.send(Ok(())).unwrap(); self.pgp.set((pk, sk)).unwrap(); } else { let uid = format!("{} <{}>", user_name, user_email); - let params = vault::pgp::params( + let params = VaultCore::params( vault::pgp::KeyType::Rsa(2048), passwd.clone(), uid.as_ref(), ); - let (pk, sk) = vault::pgp::gen_pgp_keypair(params, passwd); - vault::pgp::save_keys(pk.clone(), sk.clone()).await; + let (pk, sk) = vault_core.gen_pgp_keypair(params, passwd); + vault_core.save_keys(pk.clone(), sk.clone()); chan.send(Ok(())).unwrap(); self.pgp.set((pk, sk)).unwrap(); } @@ -190,9 +202,16 @@ impl MegaCore { self.initialized.store(true, Ordering::Release); } + let guard = self.running_context.read().await; + let vault_core = if let Some(ctx) = guard.as_ref() { + &ctx.vault + } else { + return; + }; + // Try to load pgp keys from vault. - if let Some(pk) = vault::pgp::load_pub_key().await { - let sk = vault::pgp::load_sec_key().await.unwrap(); + if let Some(pk) = vault_core.load_pub_key(){ + let sk = vault_core.load_sec_key().await.unwrap(); self.pgp.set((pk, sk)).unwrap(); tracing::debug!("Loaded pgp keys from vault"); } @@ -211,13 +230,14 @@ impl MegaCore { return Err(MonoBeanError::MegaCoreError(err.to_string())); } - let config: Arc = self.config.read().await.clone().into(); + // let config: Arc = self.config.read().await.clone().into(); + let config = self.config.read().await.clone(); let inner = MegaContext::new(config.clone()).await; - inner - .services - .mono_storage - .init_monorepo(&config.monorepo) - .await; + // inner + // .services + // .mono_storage + // .init_monorepo(&config.monorepo) + // .await; let http_ctx = inner.clone(); *self.http_options.write().await = http_addr @@ -281,7 +301,8 @@ impl MegaCore { if path.as_ref().starts_with(&import_dir) && path.as_ref() != import_dir { if let Some(model) = ctx - .services + .storage + .services.as_ref() .git_db_storage .find_git_repo_like_path(path.as_ref().to_string_lossy().as_ref()) .await @@ -289,13 +310,13 @@ impl MegaCore { { let repo: Repo = model.into(); return Ok(Box::new(ImportApiService { - context: ctx.clone(), + storage: ctx.storage.clone(), repo, })); } } let ret: Box = Box::new(MonoApiService { - context: ctx.clone(), + storage: ctx.storage.clone(), }); // Rust-analyzer cannot infer the type of `ret` correctly and always reports an error. @@ -328,7 +349,7 @@ impl MegaCore { async fn load_blob(&self, id: impl AsRef) -> MonoBeanResult { let ctx = self.running_context.read().await.clone().unwrap(); - let mono = MonoApiService { context: ctx }; + let mono = MonoApiService {storage: ctx.storage }; let raw = mono .get_raw_blob_by_hash(id.as_ref()) .await @@ -500,6 +521,7 @@ mod tests { #[tokio::test] async fn test_launch_http() { let temp_base = TempDir::new().unwrap(); + let core = test_core(&temp_base).await; core.process_command(MegaCommands::MegaStart( Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 8080)), diff --git a/monobean/src/core/servers.rs b/monobean/src/core/servers.rs index 4c8358489..e38460a4b 100644 --- a/monobean/src/core/servers.rs +++ b/monobean/src/core/servers.rs @@ -2,7 +2,8 @@ use crate::error::MonoBeanResult; use bytes::BytesMut; use common::model::P2pOptions; use gateway::https_server::{app, check_run_with_p2p}; -use jupiter::context::Context as MegaContext; +// use jupiter::context::Context as MegaContext; +use context::AppContext as MegaContext; use mono::git_protocol::ssh::SshServer; use russh::server::Server; use std::collections::HashMap; @@ -31,7 +32,7 @@ impl HttpOptions { pub async fn run_server(&self, mega_ctx: MegaContext) -> MonoBeanResult<()> { let app = app( - mega_ctx.clone(), + mega_ctx.storage.clone(), self.addr.ip().to_string(), self.addr.port(), self.p2p.clone(), @@ -88,7 +89,7 @@ impl SshOptions { // Use rusty vault configurations... let (tx, mut rx) = mpsc::channel::<()>(1); self.abort.set(tx).unwrap(); - let key = mono::server::ssh_server::load_key().await; + let key = mono::server::ssh_server::load_key(mega_ctx.clone()); let ssh_config = russh::server::Config { auth_rejection_time: std::time::Duration::from_secs(3), keys: vec![key], @@ -100,7 +101,7 @@ impl SshOptions { let mut ssh_server = SshServer { clients: Arc::new(Mutex::new(HashMap::new())), id: 0, - context: mega_ctx, + storage: mega_ctx.storage.clone(), smart_protocol: None, data_combined: BytesMut::new(), }; From a57c092308fa846acbfe080d76ee2c83f0bdee31 Mon Sep 17 00:00:00 2001 From: pleasedontbreak123 Date: Mon, 30 Jun 2025 22:36:46 +0800 Subject: [PATCH 2/5] =?UTF-8?q?monobean=EF=BC=9Aadapt=20new=20context=20ap?= =?UTF-8?q?i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- context/Cargo.toml | 1 + context/src/lib.rs | 13 +++++++- monobean/src/core/mega_core.rs | 49 ++++++++++++++++++++++++----- vault/src/integration/vault_core.rs | 35 +++++++++++++++------ 4 files changed, 80 insertions(+), 18 deletions(-) diff --git a/context/Cargo.toml b/context/Cargo.toml index 7c7419019..d88453ba2 100644 --- a/context/Cargo.toml +++ b/context/Cargo.toml @@ -17,3 +17,4 @@ jupiter = { workspace = true } vault = { workspace = true } gemini = { workspace = true, optional = true } +tokio = "1.45.1" diff --git a/context/src/lib.rs b/context/src/lib.rs index b168e19a0..a22e49117 100644 --- a/context/src/lib.rs +++ b/context/src/lib.rs @@ -22,9 +22,17 @@ pub struct AppContext { impl AppContext { /// Creates a new application context with the given configuration. pub async fn new(config: common::config::Config) -> Self { + let config = Arc::new(config); + let storage = jupiter::storage::Storage::new(config.clone()).await; - let vault = vault::integration::vault_core::VaultCore::new(storage.clone()); + + let storage_for_vault = storage.clone(); + let vault = tokio::task::spawn_blocking(move || { + vault::integration::vault_core::VaultCore::new(storage_for_vault) + }).await.expect("VaultCore::new panicked"); + + #[cfg(feature = "p2p")] let client = gemini::p2p::client::P2PClient::new(storage.clone(), vault.clone()); @@ -41,9 +49,12 @@ impl AppContext { #[cfg(feature = "p2p")] client, } + + } pub fn wrapped_context(&self) -> Arc { Arc::new(self.clone()) } } + diff --git a/monobean/src/core/mega_core.rs b/monobean/src/core/mega_core.rs index 4eeaa1098..e753a8950 100644 --- a/monobean/src/core/mega_core.rs +++ b/monobean/src/core/mega_core.rs @@ -201,7 +201,7 @@ impl MegaCore { } else { self.initialized.store(true, Ordering::Release); } - + let guard = self.running_context.read().await; let vault_core = if let Some(ctx) = guard.as_ref() { &ctx.vault @@ -229,16 +229,17 @@ impl MegaCore { tracing::error!(err); return Err(MonoBeanError::MegaCoreError(err.to_string())); } - + // let config: Arc = self.config.read().await.clone().into(); let config = self.config.read().await.clone(); + let inner = MegaContext::new(config.clone()).await; // inner // .services // .mono_storage // .init_monorepo(&config.monorepo) // .await; - + let http_ctx = inner.clone(); *self.http_options.write().await = http_addr .map(|addr| HttpOptions::new(addr, p2p_opt)) @@ -255,7 +256,7 @@ impl MegaCore { } } }); - + let ssh_ctx = inner.clone(); let ssh_opt = ssh_addr.map(SshOptions::new).or(None); *self.ssh_options.write().await = ssh_opt; @@ -271,7 +272,7 @@ impl MegaCore { } } }); - + *self.running_context.write().await = Some(inner); Ok(()) } @@ -476,6 +477,7 @@ mod tests { use std::net::{IpAddr, Ipv4Addr}; use tempfile::TempDir; + async fn test_core(temp_base: &TempDir) -> MegaCore { let (tx, _) = bounded(1); let (_, cmd_rx) = bounded(1); @@ -495,6 +497,7 @@ mod tests { }; let core = MegaCore::new(tx, cmd_rx, config); + println!("core start ok"); core.init().await; core } @@ -520,9 +523,13 @@ mod tests { #[tokio::test] async fn test_launch_http() { - let temp_base = TempDir::new().unwrap(); + let temp_base = TempDir::new().unwrap(); + let core = test_core(&temp_base).await; + println!("temp_base: {:?}", temp_base.path()); + + core.process_command(MegaCommands::MegaStart( Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 8080)), None, @@ -531,7 +538,7 @@ mod tests { .await; assert!(core.http_options.read().await.is_some()); assert!(!core.ssh_options.read().await.is_some()); - + core.process_command(MegaCommands::MegaShutdown).await; assert!(core.http_options.read().await.is_none()); assert!(core.ssh_options.read().await.is_none()); @@ -557,4 +564,32 @@ mod tests { #[tokio::test] async fn test_run_with_config() {} + + #[tokio::test(flavor = "multi_thread", worker_threads = 1)] + async fn test_mega_context_new() { + // 创建临时目录作为 base_dir + let temp_base = TempDir::new().unwrap(); + + // 构造一个简单的 Config + let config = Config { + base_dir: temp_base.path().to_path_buf(), + log: LogConfig { + log_path: temp_base.path().to_path_buf(), + level: "debug".to_string(), + print_std: true, + }, + database: DbConfig { + db_type: "sqlite".to_string(), + db_path: temp_base.path().to_path_buf().join("test.db"), + ..Default::default() + }, + ..Default::default() + }; + + eprintln!("排查阻塞"); + // 调用 MegaContext::new + let ctx = MegaContext::new(config).await; + + + } } diff --git a/vault/src/integration/vault_core.rs b/vault/src/integration/vault_core.rs index ee07f5651..0e807330e 100644 --- a/vault/src/integration/vault_core.rs +++ b/vault/src/integration/vault_core.rs @@ -1,8 +1,5 @@ -use std::{ - path::PathBuf, - sync::{Arc, RwLock}, -}; - +use std::{path::PathBuf, result, sync::{Arc, RwLock}}; +use std::sync::{Mutex, OnceLock}; use crate::integration::jupiter_backend::JupiterBackend; use common::errors::MegaError; use jupiter::storage::Storage; @@ -18,6 +15,8 @@ use tracing::log; const CORE_KEY_FILE: &str = "core_key.json"; // where the core key is stored, like `root_token` + + #[derive(Debug, Clone, Serialize, Deserialize)] struct CoreKey { secret_shares: Vec>, @@ -51,9 +50,10 @@ impl VaultCore { pub fn new(ctx: Storage) -> Self { let dir = common::config::mega_base().join("vault"); let key_path = dir.join(CORE_KEY_FILE); - + println!("{:?}", key_path); std::fs::create_dir_all(&dir).expect("Failed to create vault directory"); - Self::config(ctx, key_path) + let result = Self::config(ctx.clone(), key_path); + result } fn config(ctx: Storage, key_path: PathBuf) -> Self { @@ -71,6 +71,7 @@ impl VaultCore { }; let core = Arc::new(RwLock::new(core)); + let key = { let mut managed_core = core.write().unwrap(); managed_core @@ -78,6 +79,9 @@ impl VaultCore { .expect("Failed to configure vault core"); let core_key = if !key_path.exists() { + + let _guard = INIT_MUTEX.get_or_init(|| Mutex::new(())).lock().unwrap(); + let result = managed_core .init(&seal_config) .expect("Failed to initialize vault"); @@ -85,9 +89,9 @@ impl VaultCore { secret_shares: Vec::from(&result.secret_shares[..]), root_token: result.root_token, }; - let file = std::fs::File::create(key_path).unwrap(); + println!("[vault] Creating new core_key.json at: {}", key_path.display()); + let file = std::fs::File::create(&key_path).unwrap(); serde_json::to_writer_pretty(file, &core_key).unwrap(); - core_key } else { println!("Using existing vault core key file: {}", key_path.display()); @@ -110,7 +114,6 @@ impl VaultCore { core_key.into() }; - Self { core, key } } } @@ -182,11 +185,13 @@ mod tests { use super::*; use std::collections::HashMap; + use tempfile::TempDir; #[tokio::test(flavor = "multi_thread", worker_threads = 1)] async fn test_vault_core_initialization() { let temp_dir = tempfile::tempdir().expect("Failed to create temporary directory"); let key_path = temp_dir.path().join(CORE_KEY_FILE); + println!("Key path: {:?}", key_path); let storage = test_storage(temp_dir.path()).await; let vault_core = VaultCore::config(storage, key_path); @@ -200,6 +205,16 @@ mod tests { ); } + #[tokio::test(flavor = "multi_thread", worker_threads = 1)] + async fn test_vault_core_new() { + let temp_dir = tempfile::tempdir().expect("Failed to create temporary directory"); + let key_path = temp_dir.path().join(CORE_KEY_FILE); + println!("Key path: {:?}", key_path); + let storage = test_storage(temp_dir.path()).await; + let vault_core = VaultCore::new(storage); + + } + #[tokio::test(flavor = "multi_thread", worker_threads = 1)] async fn test_vault_api() { let temp_dir = tempfile::tempdir().expect("Failed to create temporary directory"); From 66c0094c37854aa63de23f464c2a2953ab032317 Mon Sep 17 00:00:00 2001 From: pleasedontbreak123 Date: Tue, 1 Jul 2025 08:56:51 +0800 Subject: [PATCH 3/5] passed unit tests --- monobean/src/core/mega_core.rs | 44 ++++++----------------------- monobean/src/core/servers.rs | 1 - vault/src/integration/vault_core.rs | 16 ++--------- 3 files changed, 10 insertions(+), 51 deletions(-) diff --git a/monobean/src/core/mega_core.rs b/monobean/src/core/mega_core.rs index e753a8950..dfd56b38d 100644 --- a/monobean/src/core/mega_core.rs +++ b/monobean/src/core/mega_core.rs @@ -9,7 +9,6 @@ use ceres::api_service::ApiHandler; use ceres::protocol::repo::Repo; use common::config::Config; use common::model::P2pOptions; -// use jupiter::context::Context as MegaContext; use context::AppContext as MegaContext; use mercury::internal::object::tree::Tree; use std::fmt; @@ -153,6 +152,8 @@ impl MegaCore { let vault_core = if let Some(ctx) = guard.as_ref() { &ctx.vault } else { + let err_msg = "Mega core is not running, failed to get vault core"; + tracing::error!(err_msg); return; }; @@ -206,7 +207,9 @@ impl MegaCore { let vault_core = if let Some(ctx) = guard.as_ref() { &ctx.vault } else { - return; + let err_msg = "Mega core is not running, failed to get vault core"; + tracing::error!(err_msg); + return ; }; // Try to load pgp keys from vault. @@ -230,15 +233,11 @@ impl MegaCore { return Err(MonoBeanError::MegaCoreError(err.to_string())); } - // let config: Arc = self.config.read().await.clone().into(); + let config = self.config.read().await.clone(); let inner = MegaContext::new(config.clone()).await; - // inner - // .services - // .mono_storage - // .init_monorepo(&config.monorepo) - // .await; + let http_ctx = inner.clone(); *self.http_options.write().await = http_addr @@ -564,32 +563,5 @@ mod tests { #[tokio::test] async fn test_run_with_config() {} - - #[tokio::test(flavor = "multi_thread", worker_threads = 1)] - async fn test_mega_context_new() { - // 创建临时目录作为 base_dir - let temp_base = TempDir::new().unwrap(); - - // 构造一个简单的 Config - let config = Config { - base_dir: temp_base.path().to_path_buf(), - log: LogConfig { - log_path: temp_base.path().to_path_buf(), - level: "debug".to_string(), - print_std: true, - }, - database: DbConfig { - db_type: "sqlite".to_string(), - db_path: temp_base.path().to_path_buf().join("test.db"), - ..Default::default() - }, - ..Default::default() - }; - - eprintln!("排查阻塞"); - // 调用 MegaContext::new - let ctx = MegaContext::new(config).await; - - - } + } diff --git a/monobean/src/core/servers.rs b/monobean/src/core/servers.rs index e38460a4b..add57415f 100644 --- a/monobean/src/core/servers.rs +++ b/monobean/src/core/servers.rs @@ -2,7 +2,6 @@ use crate::error::MonoBeanResult; use bytes::BytesMut; use common::model::P2pOptions; use gateway::https_server::{app, check_run_with_p2p}; -// use jupiter::context::Context as MegaContext; use context::AppContext as MegaContext; use mono::git_protocol::ssh::SshServer; use russh::server::Server; diff --git a/vault/src/integration/vault_core.rs b/vault/src/integration/vault_core.rs index 0e807330e..ca24c9d82 100644 --- a/vault/src/integration/vault_core.rs +++ b/vault/src/integration/vault_core.rs @@ -1,5 +1,4 @@ -use std::{path::PathBuf, result, sync::{Arc, RwLock}}; -use std::sync::{Mutex, OnceLock}; +use std::{path::PathBuf, sync::{Arc, RwLock}}; use crate::integration::jupiter_backend::JupiterBackend; use common::errors::MegaError; use jupiter::storage::Storage; @@ -80,7 +79,6 @@ impl VaultCore { let core_key = if !key_path.exists() { - let _guard = INIT_MUTEX.get_or_init(|| Mutex::new(())).lock().unwrap(); let result = managed_core .init(&seal_config) @@ -185,7 +183,6 @@ mod tests { use super::*; use std::collections::HashMap; - use tempfile::TempDir; #[tokio::test(flavor = "multi_thread", worker_threads = 1)] async fn test_vault_core_initialization() { @@ -204,16 +201,7 @@ mod tests { "Vault core should be initialized" ); } - - #[tokio::test(flavor = "multi_thread", worker_threads = 1)] - async fn test_vault_core_new() { - let temp_dir = tempfile::tempdir().expect("Failed to create temporary directory"); - let key_path = temp_dir.path().join(CORE_KEY_FILE); - println!("Key path: {:?}", key_path); - let storage = test_storage(temp_dir.path()).await; - let vault_core = VaultCore::new(storage); - - } + #[tokio::test(flavor = "multi_thread", worker_threads = 1)] async fn test_vault_api() { From 6a4e533729293a2d7d65b80262fa1fc661a0e868 Mon Sep 17 00:00:00 2001 From: pleasedontbreak123 Date: Tue, 1 Jul 2025 13:25:58 +0800 Subject: [PATCH 4/5] fix clippy erro --- context/src/lib.rs | 2 +- monobean/src/application.rs | 2 +- monobean/src/components/hello_page.rs | 4 +- monobean/src/config.rs | 4 +- monobean/src/core/mega_core.rs | 72 +++++++++++++-------------- monobean/src/core/servers.rs | 2 +- monobean/src/window.rs | 2 +- 7 files changed, 44 insertions(+), 44 deletions(-) diff --git a/context/src/lib.rs b/context/src/lib.rs index a22e49117..bdeca9250 100644 --- a/context/src/lib.rs +++ b/context/src/lib.rs @@ -30,7 +30,7 @@ impl AppContext { let storage_for_vault = storage.clone(); let vault = tokio::task::spawn_blocking(move || { vault::integration::vault_core::VaultCore::new(storage_for_vault) - }).await.expect("VaultCore::new panicked"); + }).await.expect("VaultCore::new panicked________"); #[cfg(feature = "p2p")] diff --git a/monobean/src/application.rs b/monobean/src/application.rs index 03cd320c1..9058346ea 100644 --- a/monobean/src/application.rs +++ b/monobean/src/application.rs @@ -294,7 +294,7 @@ impl MonobeanApplication { glib::LogLevel::Debug => tracing::Level::DEBUG, }; - println!("{}: {}", level, fields); + println!("{level}: {fields}"); }, ); } diff --git a/monobean/src/components/hello_page.rs b/monobean/src/components/hello_page.rs index 7af4792d6..dcc9a04cf 100644 --- a/monobean/src/components/hello_page.rs +++ b/monobean/src/components/hello_page.rs @@ -89,7 +89,7 @@ impl HelloPage { fn setup_logo(&self) { let logo = self.imp().logo.clone(); let id = random_int_range(1, 6); - logo.set_icon_name(Some(format!("walrus-{}", id).as_str())); + logo.set_icon_name(Some(format!("walrus-{id}").as_str())); let gesture = gtk::GestureClick::new(); gesture.connect_pressed(clone!( @@ -97,7 +97,7 @@ impl HelloPage { logo, move |_, _, _, _| { let id = random_int_range(1, 6); - logo.set_icon_name(Some(format!("walrus-{}", id).as_str())); + logo.set_icon_name(Some(format!("walrus-{id}").as_str())); } )); logo.add_controller(gesture); diff --git a/monobean/src/config.rs b/monobean/src/config.rs index 08f4de201..470a3eccd 100644 --- a/monobean/src/config.rs +++ b/monobean/src/config.rs @@ -95,7 +95,7 @@ macro_rules! get_setting { pub fn monobean_base() -> PathBuf { // Get the base directory from the environment variable or use the default std::env::var("MONOBEAN_BASE_DIR") - .map(|inner| PathBuf::from(inner)) + .map(PathBuf::from) .unwrap_or_else(|_| common::config::mega_base().join("monobean")) } @@ -119,7 +119,7 @@ pub fn monobean_base() -> PathBuf { pub fn monobean_cache() -> PathBuf { // Get the cache directory from the environment variable or use the default std::env::var("MONOBEAN_CACHE_DIR") - .map(|inner| PathBuf::from(inner)) + .map(PathBuf::from) .unwrap_or_else(|_| common::config::mega_cache().join("monobean")) } diff --git a/monobean/src/core/mega_core.rs b/monobean/src/core/mega_core.rs index dfd56b38d..0268396de 100644 --- a/monobean/src/core/mega_core.rs +++ b/monobean/src/core/mega_core.rs @@ -18,8 +18,8 @@ use std::path::{Component, Path, PathBuf}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use tokio::sync::{oneshot, OnceCell, RwLock}; -use vault::pgp::{SignedPublicKey, SignedSecretKey}; use vault::integration::vault_core::VaultCore; +use vault::pgp::{SignedPublicKey, SignedSecretKey}; pub struct MegaCore { config: Arc>, @@ -146,25 +146,22 @@ impl MegaCore { chan.send(Err(MonoBeanError::ReinitError)).unwrap(); return; } - - + let guard = self.running_context.read().await; let vault_core = if let Some(ctx) = guard.as_ref() { - &ctx.vault + &ctx.vault } else { let err_msg = "Mega core is not running, failed to get vault core"; tracing::error!(err_msg); return; }; - - if let Some(pk) = vault_core.load_pub_key() { let sk = vault_core.load_sec_key().await.unwrap(); chan.send(Ok(())).unwrap(); self.pgp.set((pk, sk)).unwrap(); } else { - let uid = format!("{} <{}>", user_name, user_email); + let uid = format!("{user_name} <{user_email}>"); let params = VaultCore::params( vault::pgp::KeyType::Rsa(2048), passwd.clone(), @@ -202,18 +199,18 @@ impl MegaCore { } else { self.initialized.store(true, Ordering::Release); } - + let guard = self.running_context.read().await; let vault_core = if let Some(ctx) = guard.as_ref() { - &ctx.vault - } else { - let err_msg = "Mega core is not running, failed to get vault core"; - tracing::error!(err_msg); - return ; - }; + &ctx.vault + } else { + let err_msg = "Mega core is not running, failed to get vault core"; + tracing::error!(err_msg); + return; + }; // Try to load pgp keys from vault. - if let Some(pk) = vault_core.load_pub_key(){ + if let Some(pk) = vault_core.load_pub_key() { let sk = vault_core.load_sec_key().await.unwrap(); self.pgp.set((pk, sk)).unwrap(); tracing::debug!("Loaded pgp keys from vault"); @@ -232,13 +229,11 @@ impl MegaCore { tracing::error!(err); return Err(MonoBeanError::MegaCoreError(err.to_string())); } - - + let config = self.config.read().await.clone(); - + let inner = MegaContext::new(config.clone()).await; - - + let http_ctx = inner.clone(); *self.http_options.write().await = http_addr .map(|addr| HttpOptions::new(addr, p2p_opt)) @@ -255,7 +250,7 @@ impl MegaCore { } } }); - + let ssh_ctx = inner.clone(); let ssh_opt = ssh_addr.map(SshOptions::new).or(None); *self.ssh_options.write().await = ssh_opt; @@ -271,7 +266,7 @@ impl MegaCore { } } }); - + *self.running_context.write().await = Some(inner); Ok(()) } @@ -302,7 +297,8 @@ impl MegaCore { if path.as_ref().starts_with(&import_dir) && path.as_ref() != import_dir { if let Some(model) = ctx .storage - .services.as_ref() + .services + .as_ref() .git_db_storage .find_git_repo_like_path(path.as_ref().to_string_lossy().as_ref()) .await @@ -340,7 +336,7 @@ impl MegaCore { match tree { Ok(Some(tree)) => Ok(tree), _ => { - let err_msg = format!("Failed to load tree: {:?}", path); + let err_msg = format!("Failed to load tree: {path:?}"); tracing::error!(err_msg); Err(MonoBeanError::MegaCoreError(err_msg)) } @@ -349,7 +345,9 @@ impl MegaCore { async fn load_blob(&self, id: impl AsRef) -> MonoBeanResult { let ctx = self.running_context.read().await.clone().unwrap(); - let mono = MonoApiService {storage: ctx.storage }; + let mono = MonoApiService { + storage: ctx.storage, + }; let raw = mono .get_raw_blob_by_hash(id.as_ref()) .await @@ -359,7 +357,7 @@ impl MegaCore { Some(data) => match String::from_utf8(data) { Ok(string) => Ok(string), Err(err) => { - let err_msg = format!("Invalid UTF-8 data: {}", err); + let err_msg = format!("Invalid UTF-8 data: {err}"); tracing::error!(err_msg); Err(MonoBeanError::MegaCoreError(err_msg)) } @@ -476,7 +474,6 @@ mod tests { use std::net::{IpAddr, Ipv4Addr}; use tempfile::TempDir; - async fn test_core(temp_base: &TempDir) -> MegaCore { let (tx, _) = bounded(1); let (_, cmd_rx) = bounded(1); @@ -496,7 +493,6 @@ mod tests { }; let core = MegaCore::new(tx, cmd_rx, config); - println!("core start ok"); core.init().await; core } @@ -522,13 +518,15 @@ mod tests { #[tokio::test] async fn test_launch_http() { - let temp_base = TempDir::new().unwrap(); - + + // 设置环境变量,让 mega_base() 返回临时目录 + unsafe { + std::env::set_var("MEGA_BASE_DIR", temp_base.path()); + } + let core = test_core(&temp_base).await; - println!("temp_base: {:?}", temp_base.path()); - - + core.process_command(MegaCommands::MegaStart( Some(SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 8080)), None, @@ -537,15 +535,18 @@ mod tests { .await; assert!(core.http_options.read().await.is_some()); assert!(!core.ssh_options.read().await.is_some()); - + core.process_command(MegaCommands::MegaShutdown).await; assert!(core.http_options.read().await.is_none()); assert!(core.ssh_options.read().await.is_none()); } - #[tokio::test] + #[tokio::test(flavor = "multi_thread", worker_threads = 1)] async fn test_launch_ssh() { let temp_base = TempDir::new().unwrap(); + unsafe { + std::env::set_var("MEGA_BASE_DIR", temp_base.path()); + } let core = test_core(&temp_base).await; core.process_command(MegaCommands::MegaStart( None, @@ -563,5 +564,4 @@ mod tests { #[tokio::test] async fn test_run_with_config() {} - } diff --git a/monobean/src/core/servers.rs b/monobean/src/core/servers.rs index add57415f..fe110a9d8 100644 --- a/monobean/src/core/servers.rs +++ b/monobean/src/core/servers.rs @@ -1,8 +1,8 @@ use crate::error::MonoBeanResult; use bytes::BytesMut; use common::model::P2pOptions; -use gateway::https_server::{app, check_run_with_p2p}; use context::AppContext as MegaContext; +use gateway::https_server::{app, check_run_with_p2p}; use mono::git_protocol::ssh::SshServer; use russh::server::Server; use std::collections::HashMap; diff --git a/monobean/src/window.rs b/monobean/src/window.rs index 3004e4bc6..0fb48cbe4 100644 --- a/monobean/src/window.rs +++ b/monobean/src/window.rs @@ -253,7 +253,7 @@ fn load_css() { .into_iter() .map(|f| { let provider = CssProvider::new(); - provider.load_from_resource(&format!("{}/css/{}", PREFIX, f)); + provider.load_from_resource(&format!("{PREFIX}/css/{f}")); style_context_add_provider_for_display( >k::gdk::Display::default().expect("Could not connect to a display."), &provider, From 8fbac478a73bab5efdc15faf68cd1b4242014bd5 Mon Sep 17 00:00:00 2001 From: pleasedontbreak123 Date: Tue, 1 Jul 2025 13:27:56 +0800 Subject: [PATCH 5/5] fix clippy erro --- context/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/context/src/lib.rs b/context/src/lib.rs index bdeca9250..a22e49117 100644 --- a/context/src/lib.rs +++ b/context/src/lib.rs @@ -30,7 +30,7 @@ impl AppContext { let storage_for_vault = storage.clone(); let vault = tokio::task::spawn_blocking(move || { vault::integration::vault_core::VaultCore::new(storage_for_vault) - }).await.expect("VaultCore::new panicked________"); + }).await.expect("VaultCore::new panicked"); #[cfg(feature = "p2p")]