From 2d5449b3dc4021e089972b6815bdf949c4377623 Mon Sep 17 00:00:00 2001 From: Surma Date: Sat, 7 Nov 2026 18:23:01 +0000 Subject: [PATCH] Handle world Cargo help locally before the host request --- userland/cargo/src/lib.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/userland/cargo/src/lib.rs b/userland/cargo/src/lib.rs index 7eaa064..656cf4b 100644 --- a/userland/cargo/src/lib.rs +++ b/userland/cargo/src/lib.rs @@ -23,8 +23,17 @@ struct Executable { fn error(value: impl std::fmt::Debug) -> io::Error { io::Error::other(format!("{value:?}")) } +fn local_help(argv: &[String]) -> Option<&'static str> { + matches!(argv.first().map(String::as_str), Some("--help" | "-h" | "help")).then_some( + "Usage: cargo [OPTIONS]\n\nWorld commands: build, check, clippy, test, run, fmt, fetch, add, remove\n", + ) +} pub fn run() -> io::Result { let argv: Vec = std::env::args().skip(1).collect(); + if let Some(help) = local_help(&argv) { + io::stdout().write_all(help.as_bytes())?; + return Ok(0); + } let data = serde_json::to_vec( &serde_json::json!({"argv": argv, "cwd": std::env::current_dir()?.to_string_lossy()}), )?; @@ -108,6 +117,17 @@ pub fn run() -> io::Result { } Ok(0) } +#[cfg(test)] +#[test] +fn help_is_local_and_lists_world_commands() { + for flag in ["--help", "-h", "help"] { + let help = local_help(&[flag.into()]).expect("local help"); + assert!(help.starts_with("Usage: cargo [OPTIONS]\n")); + assert!(help.contains("build, check, clippy, test, run, fmt, fetch, add, remove")); + } + assert!(local_help(&["build".into()]).is_none()); + assert!(local_help(&[]).is_none()); +} fn execution_args(argv: &[String]) -> Vec { let split = argv.iter().position(|a| a == "--").unwrap_or(argv.len()); let mut args = argv.get(split + 1..).unwrap_or_default().to_vec();