@@ -9,7 +9,7 @@ use ceres::api_service::ApiHandler;
99use ceres:: protocol:: repo:: Repo ;
1010use common:: config:: Config ;
1111use common:: model:: P2pOptions ;
12- use jupiter :: context:: Context as MegaContext ;
12+ use context:: AppContext as MegaContext ;
1313use mercury:: internal:: object:: tree:: Tree ;
1414use std:: fmt;
1515use std:: fmt:: { Debug , Formatter } ;
@@ -18,6 +18,7 @@ use std::path::{Component, Path, PathBuf};
1818use std:: sync:: atomic:: { AtomicBool , Ordering } ;
1919use std:: sync:: Arc ;
2020use tokio:: sync:: { oneshot, OnceCell , RwLock } ;
21+ use vault:: integration:: vault_core:: VaultCore ;
2122use vault:: pgp:: { SignedPublicKey , SignedSecretKey } ;
2223
2324pub struct MegaCore {
@@ -146,19 +147,28 @@ impl MegaCore {
146147 return ;
147148 }
148149
149- if let Some ( pk) = vault:: pgp:: load_pub_key ( ) . await {
150- let sk = vault:: pgp:: load_sec_key ( ) . await . unwrap ( ) ;
150+ let guard = self . running_context . read ( ) . await ;
151+ let vault_core = if let Some ( ctx) = guard. as_ref ( ) {
152+ & ctx. vault
153+ } else {
154+ let err_msg = "Mega core is not running, failed to get vault core" ;
155+ tracing:: error!( err_msg) ;
156+ return ;
157+ } ;
158+
159+ if let Some ( pk) = vault_core. load_pub_key ( ) {
160+ let sk = vault_core. load_sec_key ( ) . await . unwrap ( ) ;
151161 chan. send ( Ok ( ( ) ) ) . unwrap ( ) ;
152162 self . pgp . set ( ( pk, sk) ) . unwrap ( ) ;
153163 } else {
154- let uid = format ! ( "{} <{}>" , user_name , user_email ) ;
155- let params = vault :: pgp :: params (
164+ let uid = format ! ( "{user_name } <{user_email }>" ) ;
165+ let params = VaultCore :: params (
156166 vault:: pgp:: KeyType :: Rsa ( 2048 ) ,
157167 passwd. clone ( ) ,
158168 uid. as_ref ( ) ,
159169 ) ;
160- let ( pk, sk) = vault :: pgp :: gen_pgp_keypair ( params, passwd) ;
161- vault :: pgp :: save_keys ( pk. clone ( ) , sk. clone ( ) ) . await ;
170+ let ( pk, sk) = vault_core . gen_pgp_keypair ( params, passwd) ;
171+ vault_core . save_keys ( pk. clone ( ) , sk. clone ( ) ) ;
162172 chan. send ( Ok ( ( ) ) ) . unwrap ( ) ;
163173 self . pgp . set ( ( pk, sk) ) . unwrap ( ) ;
164174 }
@@ -190,9 +200,18 @@ impl MegaCore {
190200 self . initialized . store ( true , Ordering :: Release ) ;
191201 }
192202
203+ let guard = self . running_context . read ( ) . await ;
204+ let vault_core = if let Some ( ctx) = guard. as_ref ( ) {
205+ & ctx. vault
206+ } else {
207+ let err_msg = "Mega core is not running, failed to get vault core" ;
208+ tracing:: error!( err_msg) ;
209+ return ;
210+ } ;
211+
193212 // Try to load pgp keys from vault.
194- if let Some ( pk) = vault :: pgp :: load_pub_key ( ) . await {
195- let sk = vault :: pgp :: load_sec_key ( ) . await . unwrap ( ) ;
213+ if let Some ( pk) = vault_core . load_pub_key ( ) {
214+ let sk = vault_core . load_sec_key ( ) . await . unwrap ( ) ;
196215 self . pgp . set ( ( pk, sk) ) . unwrap ( ) ;
197216 tracing:: debug!( "Loaded pgp keys from vault" ) ;
198217 }
@@ -211,13 +230,9 @@ impl MegaCore {
211230 return Err ( MonoBeanError :: MegaCoreError ( err. to_string ( ) ) ) ;
212231 }
213232
214- let config: Arc < Config > = self . config . read ( ) . await . clone ( ) . into ( ) ;
233+ let config = self . config . read ( ) . await . clone ( ) ;
234+
215235 let inner = MegaContext :: new ( config. clone ( ) ) . await ;
216- inner
217- . services
218- . mono_storage
219- . init_monorepo ( & config. monorepo )
220- . await ;
221236
222237 let http_ctx = inner. clone ( ) ;
223238 * self . http_options . write ( ) . await = http_addr
@@ -281,21 +296,23 @@ impl MegaCore {
281296
282297 if path. as_ref ( ) . starts_with ( & import_dir) && path. as_ref ( ) != import_dir {
283298 if let Some ( model) = ctx
299+ . storage
284300 . services
301+ . as_ref ( )
285302 . git_db_storage
286303 . find_git_repo_like_path ( path. as_ref ( ) . to_string_lossy ( ) . as_ref ( ) )
287304 . await
288305 . unwrap ( )
289306 {
290307 let repo: Repo = model. into ( ) ;
291308 return Ok ( Box :: new ( ImportApiService {
292- context : ctx. clone ( ) ,
309+ storage : ctx. storage . clone ( ) ,
293310 repo,
294311 } ) ) ;
295312 }
296313 }
297314 let ret: Box < dyn ApiHandler > = Box :: new ( MonoApiService {
298- context : ctx. clone ( ) ,
315+ storage : ctx. storage . clone ( ) ,
299316 } ) ;
300317
301318 // Rust-analyzer cannot infer the type of `ret` correctly and always reports an error.
@@ -319,7 +336,7 @@ impl MegaCore {
319336 match tree {
320337 Ok ( Some ( tree) ) => Ok ( tree) ,
321338 _ => {
322- let err_msg = format ! ( "Failed to load tree: {:?}" , path ) ;
339+ let err_msg = format ! ( "Failed to load tree: {path :?}" ) ;
323340 tracing:: error!( err_msg) ;
324341 Err ( MonoBeanError :: MegaCoreError ( err_msg) )
325342 }
@@ -328,7 +345,9 @@ impl MegaCore {
328345
329346 async fn load_blob ( & self , id : impl AsRef < str > ) -> MonoBeanResult < String > {
330347 let ctx = self . running_context . read ( ) . await . clone ( ) . unwrap ( ) ;
331- let mono = MonoApiService { context : ctx } ;
348+ let mono = MonoApiService {
349+ storage : ctx. storage ,
350+ } ;
332351 let raw = mono
333352 . get_raw_blob_by_hash ( id. as_ref ( ) )
334353 . await
@@ -338,7 +357,7 @@ impl MegaCore {
338357 Some ( data) => match String :: from_utf8 ( data) {
339358 Ok ( string) => Ok ( string) ,
340359 Err ( err) => {
341- let err_msg = format ! ( "Invalid UTF-8 data: {}" , err ) ;
360+ let err_msg = format ! ( "Invalid UTF-8 data: {err}" ) ;
342361 tracing:: error!( err_msg) ;
343362 Err ( MonoBeanError :: MegaCoreError ( err_msg) )
344363 }
@@ -500,7 +519,14 @@ mod tests {
500519 #[ tokio:: test]
501520 async fn test_launch_http ( ) {
502521 let temp_base = TempDir :: new ( ) . unwrap ( ) ;
522+
523+ // 设置环境变量,让 mega_base() 返回临时目录
524+ unsafe {
525+ std:: env:: set_var ( "MEGA_BASE_DIR" , temp_base. path ( ) ) ;
526+ }
527+
503528 let core = test_core ( & temp_base) . await ;
529+
504530 core. process_command ( MegaCommands :: MegaStart (
505531 Some ( SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: UNSPECIFIED ) , 8080 ) ) ,
506532 None ,
@@ -515,9 +541,12 @@ mod tests {
515541 assert ! ( core. ssh_options. read( ) . await . is_none( ) ) ;
516542 }
517543
518- #[ tokio:: test]
544+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
519545 async fn test_launch_ssh ( ) {
520546 let temp_base = TempDir :: new ( ) . unwrap ( ) ;
547+ unsafe {
548+ std:: env:: set_var ( "MEGA_BASE_DIR" , temp_base. path ( ) ) ;
549+ }
521550 let core = test_core ( & temp_base) . await ;
522551 core. process_command ( MegaCommands :: MegaStart (
523552 None ,
0 commit comments