summaryrefslogtreecommitdiff
path: root/crates/vcs_data
diff options
context:
space:
mode:
Diffstat (limited to 'crates/vcs_data')
-rw-r--r--crates/vcs_data/src/data/local/config.rs25
-rw-r--r--crates/vcs_data/src/data/sheet.rs8
-rw-r--r--crates/vcs_data/src/data/vault/config.rs78
-rw-r--r--crates/vcs_data/todo.md31
-rw-r--r--crates/vcs_data/todo.txt36
-rw-r--r--crates/vcs_data/vcs_data_test/src/test_sheet_creation_management_and_persistence.rs2
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![
+ let _files = [
(
InputRelativePathBuf::from("src/main.rs"),
VirtualFileId::new(),