summaryrefslogtreecommitdiff
path: root/crates/vcs_actions/src/registry
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2025-10-29 15:23:48 +0800
committer魏曹先生 <1992414357@qq.com>2025-10-29 15:23:48 +0800
commit805a2e38b09267f57213310af602c4ad4b51a5ac (patch)
tree7f4d15f1da046609411df58b0a7e1d99b1affc01 /crates/vcs_actions/src/registry
parentb48073e4c9a2ca80dd0503efc5b6ab121d504028 (diff)
Add LocalWorkspace and UserDirectory to client ActionContext
Initialize and insert Arc-wrapped LocalWorkspace and UserDirectory instances into the ActionContext for client environment actions. This provides workspace and user directory data to actions running in client mode. The LocalWorkspace is initialized from the current directory's local config, while UserDirectory uses the current document directory. Both are wrapped in Arc for efficient sharing across the action execution.
Diffstat (limited to 'crates/vcs_actions/src/registry')
-rw-r--r--crates/vcs_actions/src/registry/client_registry.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/crates/vcs_actions/src/registry/client_registry.rs b/crates/vcs_actions/src/registry/client_registry.rs
index 9769750..982a9f9 100644
--- a/crates/vcs_actions/src/registry/client_registry.rs
+++ b/crates/vcs_actions/src/registry/client_registry.rs
@@ -1,5 +1,12 @@
+use std::sync::Arc;
+
use action_system::{action::ActionContext, action_pool::ActionPool};
+use cfg_file::config::ConfigFile;
use tcp_connection::error::TcpTargetError;
+use vcs_data::data::{
+ local::{LocalWorkspace, config::LocalConfig},
+ user::UserDirectory,
+};
use crate::{
actions::local_actions::register_set_upstream_vault_action,
@@ -36,6 +43,33 @@ async fn on_proc_begin(
let action_name = ctx.action_name().to_string();
let action_args_json = ctx.action_args_json().clone();
+ // Insert LocalWorkspace Arc
+ let Ok(local_config) = LocalConfig::read().await else {
+ return Err(TcpTargetError::NotFound(
+ "The current directory does not have a local workspace".to_string(),
+ ));
+ };
+ let local_workspace = match LocalWorkspace::init_current_dir(local_config) {
+ Some(workspace) => workspace,
+ None => {
+ return Err(TcpTargetError::NotFound(format!(
+ "Failed to initialize local workspace.",
+ )));
+ }
+ };
+ let local_workspace_arc = Arc::new(local_workspace);
+ ctx.insert_arc_data(local_workspace_arc);
+
+ // Insert UserDirectory Arc
+ let Some(user_directory) = UserDirectory::current_doc_dir() else {
+ return Err(TcpTargetError::NotFound(
+ "The user directory does not exist.".to_string(),
+ ));
+ };
+
+ let user_directory_arc = Arc::new(user_directory);
+ ctx.insert_arc_data(user_directory_arc);
+
// Get instance
let Some(instance) = ctx.instance() else {
return Err(TcpTargetError::Unsupported(