From 38da7b4bc02b3a2815e188fb2cc03610ab5b8696 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Tue, 21 Oct 2025 21:49:37 +0800 Subject: Completed jv binary --- src/bin/jvv.rs | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) (limited to 'src/bin/jvv.rs') diff --git a/src/bin/jvv.rs b/src/bin/jvv.rs index 1dd2275..50dc3b3 100644 --- a/src/bin/jvv.rs +++ b/src/bin/jvv.rs @@ -8,7 +8,7 @@ use just_enough_vcs::{ }, vcs::{ connection::action_service::server_entry, - constants::{SERVER_FILE_VAULT, SERVER_FILE_VF_META}, + constants::SERVER_FILE_VAULT, current::current_vault_path, data::{ member::Member, @@ -35,11 +35,11 @@ rust_i18n::i18n!("locales/help_docs", fallback = "en"); )] struct JustEnoughVcsVault { #[command(subcommand)] - command: JustEnoughVcsCommand, + command: JustEnoughVcsVaultCommand, } #[derive(Subcommand, Debug)] -enum JustEnoughVcsCommand { +enum JustEnoughVcsVaultCommand { /// Get vault info in the current directory Here(HereArgs), @@ -161,28 +161,28 @@ async fn main() { }; match parser.command { - JustEnoughVcsCommand::Here(here_args) => { + JustEnoughVcsVaultCommand::Here(here_args) => { if here_args.help { println!("{}", md(t!("jvv.here"))); return; } jvv_here(here_args).await; } - JustEnoughVcsCommand::Create(create_vault_args) => { + JustEnoughVcsVaultCommand::Create(create_vault_args) => { if create_vault_args.help { println!("{}", md(t!("jvv.create"))); return; } jvv_create(create_vault_args).await; } - JustEnoughVcsCommand::Init(init_vault_args) => { + JustEnoughVcsVaultCommand::Init(init_vault_args) => { if init_vault_args.help { println!("{}", md(t!("jvv.init"))); return; } jvv_init(init_vault_args).await; } - JustEnoughVcsCommand::Member(member_manage) => { + JustEnoughVcsVaultCommand::Member(member_manage) => { let vault_cfg = VaultConfig::read() .await .unwrap_or_else(|_| panic!("{}", t!("jvv.fail.no_vault_here").trim().to_string())); @@ -226,7 +226,7 @@ async fn main() { } } } - JustEnoughVcsCommand::Service(service_manage) => match service_manage { + JustEnoughVcsVaultCommand::Service(service_manage) => match service_manage { ServiceManage::Listen(listen_args) => { if listen_args.help { println!("{}", md(t!("jvv.service"))); @@ -284,14 +284,8 @@ async fn jvv_here(_args: HereArgs) { while let Ok(Some(entry)) = entries.next_entry().await { if let Ok(metadata) = entry.metadata().await { if metadata.is_file() { - if entry - .file_name() - .to_string_lossy() - .ends_with(SERVER_FILE_VF_META) - { - num_vf += 1; - total_size += metadata.len(); - } + num_vf += 1; + total_size += metadata.len(); } } } @@ -332,6 +326,21 @@ async fn jvv_here(_args: HereArgs) { }; let num_ref_sheet_managed_files = ref_sheet.mapping().len(); + let total_size_str = if total_size < 1024 { + format!("{} B", total_size) + } else if total_size < 1024 * 1024 { + format!("{:.2} KB", total_size as f64 / 1024.0) + } else if total_size < 1024 * 1024 * 1024 { + format!("{:.2} MB", total_size as f64 / (1024.0 * 1024.0)) + } else if total_size < 1024 * 1024 * 1024 * 1024 { + format!("{:.2} GB", total_size as f64 / (1024.0 * 1024.0 * 1024.0)) + } else { + format!( + "{:.2} TB", + total_size as f64 / (1024.0 * 1024.0 * 1024.0 * 1024.0) + ) + }; + // Success println!( "{}", @@ -340,11 +349,10 @@ async fn jvv_here(_args: HereArgs) { name = vault_name, num_sheets = num_sheets, num_vf = num_vf, - total_size = total_size, num_mem = num_mem, num_pk = num_pk, num_ref_sheet_managed_files = num_ref_sheet_managed_files, - total_size_gb = (total_size as f64) / (1024.0 * 1024.0 * 1024.0) + total_size = total_size_str )) ) } -- cgit From b40443cae7b963048ddd3be8b55a4feaf1e6612d Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Fri, 24 Oct 2025 18:26:47 +0800 Subject: Completed "Account Manage" parts of jv --- src/bin/jvv.rs | 76 ++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 53 insertions(+), 23 deletions(-) (limited to 'src/bin/jvv.rs') diff --git a/src/bin/jvv.rs b/src/bin/jvv.rs index 50dc3b3..1886daa 100644 --- a/src/bin/jvv.rs +++ b/src/bin/jvv.rs @@ -153,7 +153,10 @@ async fn main() { // Init colored #[cfg(windows)] - colored::control::set_virtual_terminal(true).unwrap(); + if let Err(err) = colored::control::set_virtual_terminal(true) { + eprintln!("{}", t!("jvv.fail.colored_control", err = err.to_string())); + return; + } let Ok(parser) = JustEnoughVcsVault::try_parse() else { println!("{}", md(t!("jvv.help"))); @@ -183,9 +186,13 @@ async fn main() { jvv_init(init_vault_args).await; } JustEnoughVcsVaultCommand::Member(member_manage) => { - let vault_cfg = VaultConfig::read() - .await - .unwrap_or_else(|_| panic!("{}", t!("jvv.fail.no_vault_here").trim().to_string())); + let vault_cfg = match VaultConfig::read().await { + Ok(cfg) => cfg, + Err(_) => { + eprintln!("{}", t!("jvv.fail.no_vault_here").trim()); + return; + } + }; let vault = match Vault::init_current_dir(vault_cfg) { Some(vault) => vault, @@ -358,19 +365,28 @@ async fn jvv_here(_args: HereArgs) { } async fn jvv_init(_args: InitVaultArgs) { - let current_dir = std::env::current_dir() - .unwrap_or_else(|_| panic!("{}", t!("jvv.fail.std.current_dir").trim().to_string())); - if current_dir.read_dir().unwrap().next().is_some() { - eprintln!("{}", t!("jvv.fail.init.not_empty")); - return; + let current_dir = match std::env::current_dir() { + Ok(dir) => dir, + Err(_) => { + eprintln!("{}", t!("jvv.fail.std.current_dir").trim()); + return; + } + }; + if let Ok(mut entries) = current_dir.read_dir() { + if entries.next().is_some() { + eprintln!("{}", t!("jvv.fail.init.not_empty")); + return; + } } // Setup vault - let vault_name = current_dir - .file_name() - .unwrap_or_else(|| panic!("{}", t!("jvv.fail.std.current_dir_name").trim().to_string())) - .to_string_lossy() - .to_string(); + let vault_name = match current_dir.file_name() { + Some(name) => name.to_string_lossy().to_string(), + None => { + eprintln!("{}", t!("jvv.fail.std.current_dir_name").trim()); + return; + } + }; let vault_name = pascal_case!(vault_name); if let Err(err) = Vault::setup_vault(current_dir.clone()).await { @@ -401,8 +417,13 @@ async fn jvv_init(_args: InitVaultArgs) { } async fn jvv_create(args: CreateVaultArgs) { - let current_dir = std::env::current_dir() - .unwrap_or_else(|_| panic!("{}", t!("jvv.fail.std.current_dir").trim().to_string())); + let current_dir = match std::env::current_dir() { + Ok(dir) => dir, + Err(_) => { + eprintln!("{}", t!("jvv.fail.std.current_dir").trim()); + return; + } + }; let target_dir = current_dir.join(args.vault_name.clone()); // Create directory @@ -417,9 +438,11 @@ async fn jvv_create(args: CreateVaultArgs) { return; } - if target_dir.read_dir().unwrap().next().is_some() { - eprintln!("{}", t!("jvv.fail.create.not_empty")); - return; + if let Ok(mut entries) = target_dir.read_dir() { + if entries.next().is_some() { + eprintln!("{}", t!("jvv.fail.create.not_empty")); + return; + } } // Setup vault @@ -490,9 +513,13 @@ async fn jvv_member_remove(vault: Vault, args: MemberRemoveArgs) { async fn jvv_member_list(vault: Vault, _args: MemberListArgs) { // Get id list - let ids = vault - .member_ids() - .unwrap_or_else(|_| panic!("{}", t!("jvv.fail.member.list").trim().to_string())); + let ids = match vault.member_ids() { + Ok(ids) => ids, + Err(_) => { + eprintln!("{}", t!("jvv.fail.member.list").trim()); + return; + } + }; // Print header println!( @@ -560,7 +587,10 @@ async fn jvv_service_listen(args: ListenArgs) { "{}", t!( "jvv.success.service.listen", - path = current_vault.file_name().unwrap().display() + path = match current_vault.file_name() { + Some(name) => name.to_string_lossy(), + None => std::borrow::Cow::Borrowed("unknown"), + } ) ) } -- cgit From 28bdbb4ba457eb9e0707d2760f5d042ca6b7db68 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 27 Oct 2025 17:57:24 +0800 Subject: Add output for jvv service listen command results --- src/bin/jvv.rs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'src/bin/jvv.rs') diff --git a/src/bin/jvv.rs b/src/bin/jvv.rs index 1886daa..f6fbeaa 100644 --- a/src/bin/jvv.rs +++ b/src/bin/jvv.rs @@ -19,7 +19,7 @@ use just_enough_vcs::{ use just_enough_vcs_cli::utils::{ build_env_logger::build_env_logger, lang_selector::current_locales, md_colored::md, }; -use log::info; +use log::{error, info}; use rust_i18n::{set_locale, t}; use tokio::fs::{self}; @@ -586,7 +586,7 @@ async fn jvv_service_listen(args: ListenArgs) { info!( "{}", t!( - "jvv.success.service.listen", + "jvv.success.service.listen_start", path = match current_vault.file_name() { Some(name) => name.to_string_lossy(), None => std::borrow::Cow::Borrowed("unknown"), @@ -595,5 +595,15 @@ async fn jvv_service_listen(args: ListenArgs) { ) } - let _ = server_entry(current_vault).await; + match server_entry(current_vault).await { + Ok(_) => { + info!("{}", t!("jvv.success.service.listen_done").trim()); + } + Err(e) => { + error!( + "{}", + t!("jvv.fail.service.listen_done", error = e.to_string()).trim() + ); + } + } } -- cgit From fdffd0d081465fa4d08645f7e1b546e1addb2ef9 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Wed, 29 Oct 2025 15:28:04 +0800 Subject: Add confirmation options and alias commands - Add -C/--confirm flags to skip confirmation for direct/unstain commands - Add command aliases for account and vault subcommands (+/-/ls) - Improve error handling with better error messages - Implement unstain command functionality - Add port option to vault listen command - Refactor error handling to use centralized function --- src/bin/jvv.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'src/bin/jvv.rs') diff --git a/src/bin/jvv.rs b/src/bin/jvv.rs index f6fbeaa..57e9dbf 100644 --- a/src/bin/jvv.rs +++ b/src/bin/jvv.rs @@ -41,32 +41,42 @@ struct JustEnoughVcsVault { #[derive(Subcommand, Debug)] enum JustEnoughVcsVaultCommand { /// Get vault info in the current directory + #[command(alias = "-H")] Here(HereArgs), /// Create a new directory and initialize a vault + #[command(alias = "-c")] Create(CreateVaultArgs), /// Create a vault in the current directory + #[command(alias = "-i")] Init(InitVaultArgs), /// Member manage - #[command(subcommand)] + #[command(subcommand, alias = "-m")] Member(MemberManage), /// Manage service #[command(subcommand)] Service(ServiceManage), + + // Short commands + #[command(alias = "-l", alias = "listen")] + ServiceListen(ListenArgs), } #[derive(Subcommand, Debug)] enum MemberManage { /// Register a member to the vault + #[command(alias = "+")] Register(MemberRegisterArgs), /// Remove a member from the vault + #[command(alias = "-")] Remove(MemberRemoveArgs), /// List all members in the vault + #[command(alias = "ls")] List(MemberListArgs), /// Show help information @@ -144,6 +154,10 @@ struct ListenArgs { /// Disable logging #[arg(short, long)] no_log: bool, + + /// Custom port + #[arg(short, long)] + port: Option, } #[tokio::main] @@ -246,6 +260,14 @@ async fn main() { return; } }, + // Short commands + JustEnoughVcsVaultCommand::ServiceListen(listen_args) => { + if listen_args.help { + println!("{}", md(t!("jvv.service"))); + return; + } + jvv_service_listen(listen_args).await; + } } } @@ -595,7 +617,8 @@ async fn jvv_service_listen(args: ListenArgs) { ) } - match server_entry(current_vault).await { + let port = if let Some(port) = args.port { port } else { 0 }; + match server_entry(current_vault, port).await { Ok(_) => { info!("{}", t!("jvv.success.service.listen_done").trim()); } -- cgit From 0c0499abfb94d57d9b81c63b3df6e7e5e42a570d Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Wed, 29 Oct 2025 16:23:02 +0800 Subject: Apply clippy suggestion --- src/bin/jvv.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'src/bin/jvv.rs') diff --git a/src/bin/jvv.rs b/src/bin/jvv.rs index 57e9dbf..6bcf5c0 100644 --- a/src/bin/jvv.rs +++ b/src/bin/jvv.rs @@ -311,12 +311,11 @@ async fn jvv_here(_args: HereArgs) { if let Ok(mut entries) = fs::read_dir(&virtual_file_root).await { while let Ok(Some(entry)) = entries.next_entry().await { - if let Ok(metadata) = entry.metadata().await { - if metadata.is_file() { + if let Ok(metadata) = entry.metadata().await + && metadata.is_file() { num_vf += 1; total_size += metadata.len(); } - } } } @@ -394,12 +393,11 @@ async fn jvv_init(_args: InitVaultArgs) { return; } }; - if let Ok(mut entries) = current_dir.read_dir() { - if entries.next().is_some() { + if let Ok(mut entries) = current_dir.read_dir() + && entries.next().is_some() { eprintln!("{}", t!("jvv.fail.init.not_empty")); return; } - } // Setup vault let vault_name = match current_dir.file_name() { @@ -460,12 +458,11 @@ async fn jvv_create(args: CreateVaultArgs) { return; } - if let Ok(mut entries) = target_dir.read_dir() { - if entries.next().is_some() { + if let Ok(mut entries) = target_dir.read_dir() + && entries.next().is_some() { eprintln!("{}", t!("jvv.fail.create.not_empty")); return; } - } // Setup vault let vault_name = pascal_case!(args.vault_name); @@ -617,7 +614,7 @@ async fn jvv_service_listen(args: ListenArgs) { ) } - let port = if let Some(port) = args.port { port } else { 0 }; + let port = args.port.unwrap_or_default(); match server_entry(current_vault, port).await { Ok(_) => { info!("{}", t!("jvv.success.service.listen_done").trim()); -- cgit From 3a3f40b2abbaa47063cdc3aeb0149e3d02276c1e Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Thu, 30 Oct 2025 09:38:19 +0800 Subject: Simplify commands and improve jv error handling - Add help command alias for jv - Improve parser error message formatting - Fix code formatting in jvv commands --- src/bin/jvv.rs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'src/bin/jvv.rs') diff --git a/src/bin/jvv.rs b/src/bin/jvv.rs index 6bcf5c0..8480029 100644 --- a/src/bin/jvv.rs +++ b/src/bin/jvv.rs @@ -312,10 +312,11 @@ async fn jvv_here(_args: HereArgs) { if let Ok(mut entries) = fs::read_dir(&virtual_file_root).await { while let Ok(Some(entry)) = entries.next_entry().await { if let Ok(metadata) = entry.metadata().await - && metadata.is_file() { - num_vf += 1; - total_size += metadata.len(); - } + && metadata.is_file() + { + num_vf += 1; + total_size += metadata.len(); + } } } @@ -394,10 +395,11 @@ async fn jvv_init(_args: InitVaultArgs) { } }; if let Ok(mut entries) = current_dir.read_dir() - && entries.next().is_some() { - eprintln!("{}", t!("jvv.fail.init.not_empty")); - return; - } + && entries.next().is_some() + { + eprintln!("{}", t!("jvv.fail.init.not_empty")); + return; + } // Setup vault let vault_name = match current_dir.file_name() { @@ -459,10 +461,11 @@ async fn jvv_create(args: CreateVaultArgs) { } if let Ok(mut entries) = target_dir.read_dir() - && entries.next().is_some() { - eprintln!("{}", t!("jvv.fail.create.not_empty")); - return; - } + && entries.next().is_some() + { + eprintln!("{}", t!("jvv.fail.create.not_empty")); + return; + } // Setup vault let vault_name = pascal_case!(args.vault_name); -- cgit