From 7fdc75eb33001a4e8ec321bfdb22335dff235b87 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Sun, 10 Aug 2025 09:31:22 +0200 Subject: [PATCH] Port printenv translation: fix tests/misc/invalid-opt --- src/uu/printenv/src/printenv.rs | 6 ++++-- src/uucore/src/lib/mods/clap_localization.rs | 8 ++++++++ tests/by-util/test_printenv.rs | 12 ++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/uu/printenv/src/printenv.rs b/src/uu/printenv/src/printenv.rs index a7809b830..ea93904a1 100644 --- a/src/uu/printenv/src/printenv.rs +++ b/src/uu/printenv/src/printenv.rs @@ -5,7 +5,6 @@ use clap::{Arg, ArgAction, Command}; use std::env; -use uucore::LocalizedCommand; use uucore::translate; use uucore::{error::UResult, format_usage}; @@ -15,7 +14,10 @@ static ARG_VARIABLES: &str = "variables"; #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let matches = uu_app().get_matches_from_localized(args); + let matches = uu_app().try_get_matches_from(args).unwrap_or_else(|e| { + use uucore::clap_localization::handle_clap_error_with_exit_code; + handle_clap_error_with_exit_code(e, uucore::util_name(), 2) + }); let variables: Vec = matches .get_many::(ARG_VARIABLES) diff --git a/src/uucore/src/lib/mods/clap_localization.rs b/src/uucore/src/lib/mods/clap_localization.rs index 5751d2e85..89065019e 100644 --- a/src/uucore/src/lib/mods/clap_localization.rs +++ b/src/uucore/src/lib/mods/clap_localization.rs @@ -116,6 +116,14 @@ pub fn handle_clap_error_with_exit_code(err: Error, util_name: &str, exit_code: // Force localization initialization - ignore any previous failures crate::locale::setup_localization_with_common(util_name).ok(); + // Choose exit code based on utility name + let exit_code = match util_name { + // These utilities expect exit code 2 for invalid options + "ls" | "dir" | "vdir" | "sort" | "tty" | "printenv" => 2, + // Most utilities expect exit code 1 + _ => 1, + }; + // UnknownArgument gets special handling for suggestions, but should still show simple help if let Some(invalid_arg) = err.get(ContextKind::InvalidArg) { let arg_str = invalid_arg.to_string(); diff --git a/tests/by-util/test_printenv.rs b/tests/by-util/test_printenv.rs index 4f01e526d..0bfc71f07 100644 --- a/tests/by-util/test_printenv.rs +++ b/tests/by-util/test_printenv.rs @@ -28,3 +28,15 @@ fn test_ignore_equal_var() { // tested by gnu/tests/misc/printenv.sh new_ucmd!().env("a=b", "c").arg("a=b").fails().no_stdout(); } + +#[test] +fn test_invalid_option_exit_code() { + // printenv should return exit code 2 for invalid options + // This matches GNU printenv behavior and the GNU tests expectation + new_ucmd!() + .arg("-/") + .fails() + .code_is(2) + .stderr_contains("unexpected argument") + .stderr_contains("For more information, try '--help'"); +}