diff options
Diffstat (limited to 'crates/vcs_data')
| -rw-r--r-- | crates/vcs_data/src/data/local/config.rs | 25 | ||||
| -rw-r--r-- | crates/vcs_data/src/data/sheet.rs | 8 | ||||
| -rw-r--r-- | crates/vcs_data/src/data/vault/config.rs | 78 | ||||
| -rw-r--r-- | crates/vcs_data/todo.md | 31 | ||||
| -rw-r--r-- | crates/vcs_data/todo.txt | 36 | ||||
| -rw-r--r-- | crates/vcs_data/vcs_data_test/src/test_sheet_creation_management_and_persistence.rs | 2 |
6 files changed, 135 insertions, 45 deletions
diff --git a/crates/vcs_data/src/data/local/config.rs b/crates/vcs_data/src/data/local/config.rs index 5444047..338d01b 100644 --- a/crates/vcs_data/src/data/local/config.rs +++ b/crates/vcs_data/src/data/local/config.rs @@ -5,6 +5,7 @@ use std::net::SocketAddr; use crate::constants::CLIENT_FILE_WORKSPACE; use crate::constants::PORT; use crate::data::member::MemberId; +use crate::data::vault::config::VaultUuid; #[derive(Serialize, Deserialize, ConfigFile)] #[cfg_file(path = CLIENT_FILE_WORKSPACE)] @@ -16,6 +17,14 @@ pub struct LocalConfig { /// The member ID used by the current local workspace. /// This ID will be used to verify access permissions when connecting to the upstream server. using_account: MemberId, + + /// Whether the local workspace is stained. + /// + /// If stained, it can only set an upstream server with the same identifier. + /// + /// If the value is None, it means not stained; + /// otherwise, it contains the stain identifier (i.e., the upstream vault's unique ID) + stained_uuid: Option<VaultUuid>, } impl Default for LocalConfig { @@ -26,6 +35,7 @@ impl Default for LocalConfig { PORT, )), using_account: "unknown".to_string(), + stained_uuid: None, } } } @@ -50,4 +60,19 @@ impl LocalConfig { pub fn current_account(&self) -> MemberId { self.using_account.clone() } + + /// Check if the local workspace is stained. + pub fn stained(&self) -> bool { + self.stained_uuid.is_some() + } + + /// Stain the local workspace with the given UUID. + pub fn stain(&mut self, uuid: VaultUuid) { + self.stained_uuid = Some(uuid); + } + + /// Unstain the local workspace. + pub fn unstain(&mut self) { + self.stained_uuid = None; + } } diff --git a/crates/vcs_data/src/data/sheet.rs b/crates/vcs_data/src/data/sheet.rs index a6220c9..f1cf67c 100644 --- a/crates/vcs_data/src/data/sheet.rs +++ b/crates/vcs_data/src/data/sheet.rs @@ -107,7 +107,7 @@ impl<'a> Sheet<'a> { } /// Accept an input package and insert to the sheet - pub fn accept_import( + pub async fn accept_import( &mut self, input_name: &InputName, insert_to: &SheetPathBuf, @@ -129,7 +129,8 @@ impl<'a> Sheet<'a> { // Insert to sheet for (relative_path, virtual_file_id) in input.files { - let _ = self.add_mapping(insert_to.join(relative_path), virtual_file_id); + self.add_mapping(insert_to.join(relative_path), virtual_file_id) + .await?; } Ok(()) @@ -176,8 +177,7 @@ impl<'a> Sheet<'a> { } Err(_) => { // Error checking rights, don't allow modifying the mapping - Err(std::io::Error::new( - std::io::ErrorKind::Other, + Err(std::io::Error::other( "Failed to check virtual file edit rights", )) } diff --git a/crates/vcs_data/src/data/vault/config.rs b/crates/vcs_data/src/data/vault/config.rs index 6eea25a..5586e1e 100644 --- a/crates/vcs_data/src/data/vault/config.rs +++ b/crates/vcs_data/src/data/vault/config.rs @@ -2,15 +2,22 @@ use std::net::{IpAddr, Ipv4Addr}; use cfg_file::ConfigFile; use serde::{Deserialize, Serialize}; +use uuid::Uuid; use crate::constants::{PORT, SERVER_FILE_VAULT}; use crate::data::member::{Member, MemberId}; +pub type VaultName = String; +pub type VaultUuid = Uuid; + #[derive(Serialize, Deserialize, ConfigFile)] #[cfg_file(path = SERVER_FILE_VAULT)] pub struct VaultConfig { + /// Vault uuid, unique identifier for the vault + vault_uuid: VaultUuid, + /// Vault name, which can be used as the project name and generally serves as a hint - vault_name: String, + vault_name: VaultName, /// Vault admin id, a list of member id representing administrator identities vault_admin_list: Vec<MemberId>, @@ -42,6 +49,7 @@ pub struct VaultServerConfig { impl Default for VaultConfig { fn default() -> Self { Self { + vault_uuid: Uuid::new_v4(), vault_name: "JustEnoughVault".to_string(), vault_admin_list: Vec::new(), server_config: VaultServerConfig { @@ -56,12 +64,12 @@ impl Default for VaultConfig { /// Vault Management impl VaultConfig { - // Change name of the vault. + /// Change name of the vault. pub fn change_name(&mut self, name: impl Into<String>) { self.vault_name = name.into() } - // Add admin + /// Add admin pub fn add_admin(&mut self, member: &Member) { let uuid = member.id(); if !self.vault_admin_list.contains(&uuid) { @@ -69,9 +77,71 @@ impl VaultConfig { } } - // Remove admin + /// Remove admin pub fn remove_admin(&mut self, member: &Member) { let id = member.id(); self.vault_admin_list.retain(|x| x != &id); } + + /// Get vault UUID + pub fn vault_uuid(&self) -> &VaultUuid { + &self.vault_uuid + } + + /// Set vault UUID + pub fn set_vault_uuid(&mut self, vault_uuid: VaultUuid) { + self.vault_uuid = vault_uuid; + } + + /// Get vault name + pub fn vault_name(&self) -> &VaultName { + &self.vault_name + } + + /// Set vault name + pub fn set_vault_name(&mut self, vault_name: VaultName) { + self.vault_name = vault_name; + } + + /// Get vault admin list + pub fn vault_admin_list(&self) -> &Vec<MemberId> { + &self.vault_admin_list + } + + /// Set vault admin list + pub fn set_vault_admin_list(&mut self, vault_admin_list: Vec<MemberId>) { + self.vault_admin_list = vault_admin_list; + } + + /// Get server config + pub fn server_config(&self) -> &VaultServerConfig { + &self.server_config + } + + /// Set server config + pub fn set_server_config(&mut self, server_config: VaultServerConfig) { + self.server_config = server_config; + } +} + +impl VaultServerConfig { + /// Get local bind IP address + pub fn local_bind(&self) -> &IpAddr { + &self.local_bind + } + + /// Set local bind IP address + pub fn set_local_bind(&mut self, local_bind: IpAddr) { + self.local_bind = local_bind; + } + + /// Get port + pub fn port(&self) -> u16 { + self.port + } + + /// Set port + pub fn set_port(&mut self, port: u16) { + self.port = port; + } } diff --git a/crates/vcs_data/todo.md b/crates/vcs_data/todo.md new file mode 100644 index 0000000..3c7e0c0 --- /dev/null +++ b/crates/vcs_data/todo.md @@ -0,0 +1,31 @@ +| 类别 | 项 | 可完成性 | 已完成 | +|----------|----|----------|--------| +| 本地文件 | 设置上游服务器(仅设置,不会连接和修改染色标识) | y | | +| 本地文件 | 验证连接、权限,并为当前工作区染色(若已染色,则无法连接不同标识的服务器) | y | | +| 本地文件 | 进入表 (否则无法做任何操作) | | | +| 本地文件 | 退出表 (文件将会从当前目录移出,等待下次进入时还原) | | | +| 本地文件 | 去色 - 断开与上游服务器的关联 | y | | +| 本地文件 | 跟踪本地文件的移动、重命名,立刻同步至表 | | | +| 本地文件 | 扫描本地文件结构,标记变化 | | | +| 本地文件 | 通过本地暂存的表索引搜索文件 | | | +| 本地文件 | 查询本地某个文件的状态 | | | +| 本地文件 | 查询当前目录的状态 | | | +| 本地文件 | 查询工作区状态 | | | +| 本地文件 | 将本地所有文件更新到最新状态 | | | +| 本地文件 | 提交所有产生变化的自身所属文件 | | | +| 表 | 表查看 - 指定表并查看结构 | | | +| 表 | 从参照表拉入文件项目 | | | +| 表 | 将文件项目(或多个)导出到指定表 | | | +| 表 | 查看导入请求 | | | +| 表 | 在某个本地地址同意并导入文件 | | | +| 表 | 拒绝某个、某些或所有导入请求 | | | +| 表 | 删除表中的映射,但要确保实际文件已被移除 (忽略文件) | | | +| 表 | 放弃表,所有者消失,下一个切换至表的人获得(放弃需要确保表中没有任何文件是所有者持有的)(替代目前的安全删除) | | | +| 虚拟文件 | 跟踪本地某些文件,并将其创建为虚拟文件,然后添加到自己的表 | | | +| 虚拟文件 | 根据本地文件的目录查找虚拟文件,并为自己获得所有权(需要确保版本和上游同步才可) | | | +| 虚拟文件 | 根据本地文件的目录查找虚拟文件,并放弃所有权(需要确保和上游同步才可) | | | +| 虚拟文件 | 根据本地文件的目录查找虚拟文件,并定向到指定的存在的老版本 | | | + + +?为什么虚拟文件不能删除:虚拟文件的唯一删除方式就是,没有人再用他 +?为什么没有删除表:同理,表权限可以转移,但是删除只能等待定期清除无主人的表 diff --git a/crates/vcs_data/todo.txt b/crates/vcs_data/todo.txt deleted file mode 100644 index 65c94ef..0000000 --- a/crates/vcs_data/todo.txt +++ /dev/null @@ -1,36 +0,0 @@ -本地文件操作 -设置上游服务器(仅设置,不会连接和修改染色标识) -验证连接、权限,并为当前工作区染色(若已染色,则无法连接不同标识的服务器) -进入表 (否则无法做任何操作) -退出表 (文件将会从当前目录移出,等待下次进入时还原) -去色 - 断开与上游服务器的关联 -跟踪本地文件的移动、重命名,立刻同步至表 -扫描本地文件结构,标记变化 -通过本地暂存的表索引搜索文件 -查询本地某个文件的状态 -查询当前目录的状态 -查询工作区状态 -将本地所有文件更新到最新状态 -提交所有产生变化的自身所属文件 - - -表操作(必须指定成员和表) -表查看 - 指定表并查看结构 -从参照表拉入文件项目 -将文件项目(或多个)导出到指定表 -查看导入请求 -在某个本地地址同意并导入文件 -拒绝某个、某些或所有导入请求 -删除表中的映射,但要确保实际文件已被移除 (忽略文件) -放弃表,所有者消失,下一个切换至表的人获得(放弃需要确保表中没有任何文件是所有者持有的)(替代目前的安全删除) - - -虚拟文件操作 -跟踪本地某些文件,并将其创建为虚拟文件,然后添加到自己的表 -根据本地文件的目录查找虚拟文件,并为自己获得所有权(需要确保版本和上游同步才可) -根据本地文件的目录查找虚拟文件,并放弃所有权(需要确保和上游同步才可) -根据本地文件的目录查找虚拟文件,并定向到指定的存在的老版本 - - -?为什么虚拟文件不能删除:虚拟文件的唯一删除方式就是,没有人再用他 -?为什么没有删除表:同理,表权限可以转移,但是删除只能等待定期清除无主人的表 diff --git a/crates/vcs_data/vcs_data_test/src/test_sheet_creation_management_and_persistence.rs b/crates/vcs_data/vcs_data_test/src/test_sheet_creation_management_and_persistence.rs index 461d465..a8dfb89 100644 --- a/crates/vcs_data/vcs_data_test/src/test_sheet_creation_management_and_persistence.rs +++ b/crates/vcs_data/vcs_data_test/src/test_sheet_creation_management_and_persistence.rs @@ -254,7 +254,7 @@ async fn test_sheet_data_serialization() -> Result<(), std::io::Error> { // Add some inputs let input_name = "source_files".to_string(); - let _files = vec