aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/commands/init.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-23 01:25:49 +0900
committernsfisis <nsfisis@gmail.com>2026-02-23 01:57:21 +0900
commit587a79ec395c3e7ed861b19099ffefefac64e3b5 (patch)
treef9ef282a803e85c0fa4ea15288dacc0d776049e6 /crates/mozart/src/commands/init.rs
parentf421ddde23a3e285977c4f879d450ed3f9a34963 (diff)
downloadphp-mozart-587a79ec395c3e7ed861b19099ffefefac64e3b5.tar.gz
php-mozart-587a79ec395c3e7ed861b19099ffefefac64e3b5.tar.zst
php-mozart-587a79ec395c3e7ed861b19099ffefefac64e3b5.zip
fix(init): support COMPOSER_DEFAULT_* env vars and fix abort handling
- Add COMPOSER_DEFAULT_VENDOR env var support for package name default - Swap USERNAME/USER check order to match Composer (matters on Windows) - Add COMPOSER_DEFAULT_AUTHOR/COMPOSER_DEFAULT_EMAIL env var support - Require both name and email for author (Composer behavior) - Use bail_silent for abort to prevent double error message Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/commands/init.rs')
-rw-r--r--crates/mozart/src/commands/init.rs30
1 files changed, 21 insertions, 9 deletions
diff --git a/crates/mozart/src/commands/init.rs b/crates/mozart/src/commands/init.rs
index dc32c7c..15ec531 100644
--- a/crates/mozart/src/commands/init.rs
+++ b/crates/mozart/src/commands/init.rs
@@ -101,7 +101,9 @@ pub async fn execute(
"Do you confirm generation [<comment>yes</comment>]?"
)) {
console.error("Command aborted");
- bail!("Command aborted");
+ return Err(mozart_core::exit_code::bail_silent(
+ mozart_core::exit_code::GENERAL_ERROR,
+ ));
}
} else {
console.info(&format!("Writing {}", composer_file.display()));
@@ -623,9 +625,12 @@ fn get_default_package_name(working_dir: &Path) -> String {
.unwrap_or("project");
let name = validation::sanitize_package_name_component(dir_name);
- let vendor = get_git_config_value("github.user")
- .or_else(|| std::env::var("USER").ok())
- .or_else(|| std::env::var("USERNAME").ok())
+ let vendor = std::env::var("COMPOSER_DEFAULT_VENDOR")
+ .ok()
+ .filter(|v| !v.is_empty())
+ .or_else(|| get_git_config_value("github.user"))
+ .or_else(|| std::env::var("USERNAME").ok().filter(|v| !v.is_empty()))
+ .or_else(|| std::env::var("USER").ok().filter(|v| !v.is_empty()))
.map(|v| validation::sanitize_package_name_component(&v))
.unwrap_or_else(|| name.clone());
@@ -633,12 +638,19 @@ fn get_default_package_name(working_dir: &Path) -> String {
}
fn get_default_author() -> Option<String> {
- let name = get_git_config_value("user.name")?;
- let email = get_git_config_value("user.email");
+ let name = std::env::var("COMPOSER_DEFAULT_AUTHOR")
+ .ok()
+ .filter(|v| !v.is_empty())
+ .or_else(|| get_git_config_value("user.name"));
+
+ let email = std::env::var("COMPOSER_DEFAULT_EMAIL")
+ .ok()
+ .filter(|v| !v.is_empty())
+ .or_else(|| get_git_config_value("user.email"));
- match email {
- Some(email) => Some(format!("{name} <{email}>")),
- None => Some(name),
+ match (name, email) {
+ (Some(n), Some(e)) => Some(format!("{n} <{e}>")),
+ _ => None,
}
}