From 6885a82be7750515b38a76e67ae718318a7ce691 Mon Sep 17 00:00:00 2001 From: Dexoron Date: Tue, 2 Jun 2026 16:26:11 +0800 Subject: [PATCH] feat: add package name validation to init and new commands --- packaging/aur/dcr-git | 2 +- src/cli/init.rs | 11 ++++++++++- src/cli/new.rs | 11 ++++++++++- src/core/config.rs | 2 +- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packaging/aur/dcr-git b/packaging/aur/dcr-git index 12038a6..2c5743a 160000 --- a/packaging/aur/dcr-git +++ b/packaging/aur/dcr-git @@ -1 +1 @@ -Subproject commit 12038a613e9c314c545cbb912590dc6b698b1dd0 +Subproject commit 2c5743a45685577d1cae563bdb749ff070a15759 diff --git a/src/cli/init.rs b/src/cli/init.rs index 911fc65..76d2d16 100644 --- a/src/cli/init.rs +++ b/src/cli/init.rs @@ -16,7 +16,7 @@ // along with this program. If not, see . use crate::config::FILE_MAIN_C; -use crate::core::config::Config; +use crate::core::config::{validate_package_name, Config}; use crate::utils::fs::check_dir; use crate::utils::log::{error, warn}; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; @@ -41,6 +41,15 @@ pub fn init(args: &[String]) -> i32 { return 1; } + if let Err(e) = validate_package_name(&project_name) { + error(&format!( + "Invalid project name `{}`: {}", + colored(&project_name, BOLD_CYAN), + e + )); + return 1; + } + let cwd = std::env::current_dir() .map(|v| v.to_string_lossy().to_string()) .unwrap_or_else(|_| ".".to_string()); diff --git a/src/cli/new.rs b/src/cli/new.rs index b56bdff..bcc942d 100644 --- a/src/cli/new.rs +++ b/src/cli/new.rs @@ -16,7 +16,7 @@ // along with this program. If not, see . use crate::config::FILE_MAIN_C; -use crate::core::config::Config; +use crate::core::config::{validate_package_name, Config}; use crate::utils::fs::check_dir; use crate::utils::log::{error, warn}; use crate::utils::text::{BOLD_CYAN, BOLD_GREEN, colored, printc}; @@ -42,6 +42,15 @@ pub fn new(args: &[String]) -> i32 { colored(project_name, BOLD_CYAN) ); + if let Err(e) = validate_package_name(project_name) { + error(&format!( + "Invalid project name `{}`: {}", + colored(project_name, BOLD_CYAN), + e + )); + return 1; + } + if items.contains(project_name) { error(&format!( "Directory `{}` already exists\n", diff --git a/src/core/config.rs b/src/core/config.rs index f0fd405..25ee1f2 100644 --- a/src/core/config.rs +++ b/src/core/config.rs @@ -447,7 +447,7 @@ fn parse_typed_config(value: &Value) -> Result { value.clone().try_into().map_err(ConfigError::TomlDe) } -fn validate_package_name(name: &str) -> Result<(), ConfigError> { +pub fn validate_package_name(name: &str) -> Result<(), ConfigError> { let trimmed = name.trim(); if trimmed != name { return Err(ConfigError::Invalid(