diff --git a/src/uu/arch/src/arch.rs b/src/uu/arch/src/arch.rs index 3b7b4dc10..8fe80b602 100644 --- a/src/uu/arch/src/arch.rs +++ b/src/uu/arch/src/arch.rs @@ -24,6 +24,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("arch-about")) .after_help(translate!("arch-after-help")) .infer_long_args(true) diff --git a/src/uu/base32/src/base_common.rs b/src/uu/base32/src/base_common.rs index 619eb9b4a..db1e97016 100644 --- a/src/uu/base32/src/base_common.rs +++ b/src/uu/base32/src/base_common.rs @@ -107,6 +107,7 @@ pub fn parse_base_cmd_args( pub fn base_app(about: &'static str, usage: &str) -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(about) .override_usage(format_usage(usage)) .infer_long_args(true) diff --git a/src/uu/basename/src/basename.rs b/src/uu/basename/src/basename.rs index 557d981d7..61ac69289 100644 --- a/src/uu/basename/src/basename.rs +++ b/src/uu/basename/src/basename.rs @@ -82,6 +82,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("basename-about")) .override_usage(format_usage(&translate!("basename-usage"))) .infer_long_args(true) diff --git a/src/uu/cat/src/cat.rs b/src/uu/cat/src/cat.rs index f69364310..f03c7c3b9 100644 --- a/src/uu/cat/src/cat.rs +++ b/src/uu/cat/src/cat.rs @@ -287,6 +287,7 @@ pub fn uu_app() -> Command { .version(uucore::crate_version!()) .override_usage(format_usage(&translate!("cat-usage"))) .about(translate!("cat-about")) + .help_template(uucore::localized_help_template(uucore::util_name())) .infer_long_args(true) .args_override_self(true) .arg( diff --git a/src/uu/chcon/src/chcon.rs b/src/uu/chcon/src/chcon.rs index 263d73475..25c2d099e 100644 --- a/src/uu/chcon/src/chcon.rs +++ b/src/uu/chcon/src/chcon.rs @@ -157,6 +157,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("chcon-about")) .override_usage(format_usage(&translate!("chcon-usage"))) .infer_long_args(true) diff --git a/src/uu/chgrp/src/chgrp.rs b/src/uu/chgrp/src/chgrp.rs index 9df217fd0..aca69d103 100644 --- a/src/uu/chgrp/src/chgrp.rs +++ b/src/uu/chgrp/src/chgrp.rs @@ -99,6 +99,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("chgrp-about")) .override_usage(format_usage(&translate!("chgrp-usage"))) .infer_long_args(true) diff --git a/src/uu/chmod/src/chmod.rs b/src/uu/chmod/src/chmod.rs index 01fa0422c..92ea6024e 100644 --- a/src/uu/chmod/src/chmod.rs +++ b/src/uu/chmod/src/chmod.rs @@ -178,6 +178,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("chmod-about")) .override_usage(format_usage(&translate!("chmod-usage"))) .args_override_self(true) diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index bd5872d51..ceff36b59 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -77,6 +77,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("chown-about")) .override_usage(format_usage(&translate!("chown-usage"))) .infer_long_args(true) diff --git a/src/uu/chroot/src/chroot.rs b/src/uu/chroot/src/chroot.rs index 3d8ea589b..52db47e36 100644 --- a/src/uu/chroot/src/chroot.rs +++ b/src/uu/chroot/src/chroot.rs @@ -236,6 +236,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("chroot-about")) .override_usage(format_usage(&translate!("chroot-usage"))) .infer_long_args(true) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index dd36cfefc..01e3da55f 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -344,6 +344,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("cksum-about")) .override_usage(format_usage(&translate!("cksum-usage"))) .infer_long_args(true) diff --git a/src/uu/comm/src/comm.rs b/src/uu/comm/src/comm.rs index 8ba393b5b..b77c549d7 100644 --- a/src/uu/comm/src/comm.rs +++ b/src/uu/comm/src/comm.rs @@ -316,6 +316,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("comm-about")) .override_usage(format_usage(&translate!("comm-usage"))) .infer_long_args(true) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 01c08324e..41cded5f0 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -521,6 +521,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) .about(translate!("cp-about")) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("cp-usage"))) .after_help(format!( "{}\n\n{}", diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index 4a13ad40f..fc18b97da 100644 --- a/src/uu/csplit/src/csplit.rs +++ b/src/uu/csplit/src/csplit.rs @@ -630,6 +630,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("csplit-about")) .override_usage(format_usage(&translate!("csplit-usage"))) .args_override_self(true) diff --git a/src/uu/cut/src/cut.rs b/src/uu/cut/src/cut.rs index 1bc8cb0d6..57f0e61d1 100644 --- a/src/uu/cut/src/cut.rs +++ b/src/uu/cut/src/cut.rs @@ -595,6 +595,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("cut-usage"))) .about(translate!("cut-about")) .after_help(translate!("cut-after-help")) diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index 6a33aa74f..1685844d9 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -265,6 +265,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("date-about")) .override_usage(format_usage(&translate!("date-usage"))) .infer_long_args(true) diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index 0de57fe70..0ddeefeb4 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -1443,6 +1443,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("dd-about")) .override_usage(format_usage(&translate!("dd-usage"))) .after_help(translate!("dd-after-help")) diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index 7db47355d..3a7a10f92 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -463,6 +463,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("df-about")) .override_usage(format_usage(&translate!("df-usage"))) .after_help(translate!("df-after-help")) diff --git a/src/uu/dircolors/src/dircolors.rs b/src/uu/dircolors/src/dircolors.rs index 0a58ce37a..87a459f29 100644 --- a/src/uu/dircolors/src/dircolors.rs +++ b/src/uu/dircolors/src/dircolors.rs @@ -239,6 +239,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("dircolors-about")) .after_help(translate!("dircolors-after-help")) .override_usage(format_usage(&translate!("dircolors-usage"))) diff --git a/src/uu/dirname/src/dirname.rs b/src/uu/dirname/src/dirname.rs index 5f301edd7..aac8e57f3 100644 --- a/src/uu/dirname/src/dirname.rs +++ b/src/uu/dirname/src/dirname.rs @@ -64,6 +64,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .about(translate!("dirname-about")) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("dirname-usage"))) .args_override_self(true) .infer_long_args(true) diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index 12d94edf1..64a7662bb 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -805,6 +805,7 @@ fn parse_depth(max_depth_str: Option<&str>, summarize: bool) -> UResult Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("du-about")) .after_help(translate!("du-after-help")) .override_usage(format_usage(&translate!("du-usage"))) diff --git a/src/uu/echo/src/echo.rs b/src/uu/echo/src/echo.rs index 6c61ec7d8..4bbff02e9 100644 --- a/src/uu/echo/src/echo.rs +++ b/src/uu/echo/src/echo.rs @@ -193,6 +193,7 @@ pub fn uu_app() -> Command { .about(translate!("echo-about")) .after_help(translate!("echo-after-help")) .override_usage(format_usage(&translate!("echo-usage"))) + .help_template(uucore::localized_help_template(uucore::util_name())) .arg( Arg::new(options::NO_NEWLINE) .short('n') diff --git a/src/uu/env/src/env.rs b/src/uu/env/src/env.rs index 9e42b1694..52e3bfa22 100644 --- a/src/uu/env/src/env.rs +++ b/src/uu/env/src/env.rs @@ -225,6 +225,7 @@ fn load_config_file(opts: &mut Options) -> UResult<()> { pub fn uu_app() -> Command { Command::new(crate_name!()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("env-about")) .override_usage(format_usage(&translate!("env-usage"))) .after_help(translate!("env-after-help")) diff --git a/src/uu/expand/src/expand.rs b/src/uu/expand/src/expand.rs index 8d768522d..cd528316e 100644 --- a/src/uu/expand/src/expand.rs +++ b/src/uu/expand/src/expand.rs @@ -251,6 +251,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("expand-about")) .after_help(LONG_HELP) .override_usage(format_usage(&translate!("expand-usage"))) diff --git a/src/uu/expr/src/expr.rs b/src/uu/expr/src/expr.rs index ba980357c..75ce8620d 100644 --- a/src/uu/expr/src/expr.rs +++ b/src/uu/expr/src/expr.rs @@ -73,6 +73,7 @@ impl UError for ExprError { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("expr-about")) .override_usage(format_usage(&translate!("expr-usage"))) .after_help(translate!("expr-after-help")) diff --git a/src/uu/factor/src/factor.rs b/src/uu/factor/src/factor.rs index 1e7a176b6..8516b1eb6 100644 --- a/src/uu/factor/src/factor.rs +++ b/src/uu/factor/src/factor.rs @@ -122,6 +122,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("factor-about")) .override_usage(format_usage(&translate!("factor-usage"))) .infer_long_args(true) diff --git a/src/uu/false/src/false.rs b/src/uu/false/src/false.rs index a0a3f944f..108349031 100644 --- a/src/uu/false/src/false.rs +++ b/src/uu/false/src/false.rs @@ -47,6 +47,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("false-about")) // We provide our own help and version options, to ensure maximum compatibility with GNU. .disable_help_flag(true) diff --git a/src/uu/fmt/src/fmt.rs b/src/uu/fmt/src/fmt.rs index ed7ab7ff7..46f9d547f 100644 --- a/src/uu/fmt/src/fmt.rs +++ b/src/uu/fmt/src/fmt.rs @@ -353,6 +353,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("fmt-about")) .override_usage(format_usage(&translate!("fmt-usage"))) .infer_long_args(true) diff --git a/src/uu/fold/src/fold.rs b/src/uu/fold/src/fold.rs index 34bc6b656..22fc6df23 100644 --- a/src/uu/fold/src/fold.rs +++ b/src/uu/fold/src/fold.rs @@ -62,6 +62,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("fold-usage"))) .about(translate!("fold-about")) .infer_long_args(true) diff --git a/src/uu/groups/src/groups.rs b/src/uu/groups/src/groups.rs index 156555798..17624ffde 100644 --- a/src/uu/groups/src/groups.rs +++ b/src/uu/groups/src/groups.rs @@ -82,6 +82,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("groups-about")) .override_usage(format_usage(&translate!("groups-usage"))) .infer_long_args(true) diff --git a/src/uu/hashsum/src/hashsum.rs b/src/uu/hashsum/src/hashsum.rs index 199a09bc7..0fc23e35f 100644 --- a/src/uu/hashsum/src/hashsum.rs +++ b/src/uu/hashsum/src/hashsum.rs @@ -312,6 +312,7 @@ mod options { pub fn uu_app_common() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("hashsum-about")) .override_usage(format_usage(&translate!("hashsum-usage"))) .infer_long_args(true) diff --git a/src/uu/head/src/head.rs b/src/uu/head/src/head.rs index c3f1c2c0c..818062ba9 100644 --- a/src/uu/head/src/head.rs +++ b/src/uu/head/src/head.rs @@ -72,6 +72,7 @@ type HeadResult = Result; pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("head-about")) .override_usage(format_usage(&translate!("head-usage"))) .infer_long_args(true) diff --git a/src/uu/hostid/src/hostid.rs b/src/uu/hostid/src/hostid.rs index efbe75475..8a4f5efd8 100644 --- a/src/uu/hostid/src/hostid.rs +++ b/src/uu/hostid/src/hostid.rs @@ -22,6 +22,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("hostid-about")) .override_usage(format_usage(&translate!("hostid-usage"))) .infer_long_args(true) diff --git a/src/uu/hostname/src/hostname.rs b/src/uu/hostname/src/hostname.rs index 734cfdbed..acefbf732 100644 --- a/src/uu/hostname/src/hostname.rs +++ b/src/uu/hostname/src/hostname.rs @@ -77,6 +77,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("hostname-about")) .override_usage(format_usage(&translate!("hostname-usage"))) .infer_long_args(true) diff --git a/src/uu/id/src/id.rs b/src/uu/id/src/id.rs index 86fd86a17..0852d9927 100644 --- a/src/uu/id/src/id.rs +++ b/src/uu/id/src/id.rs @@ -350,6 +350,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("id-about")) .override_usage(format_usage(&translate!("id-usage"))) .infer_long_args(true) diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index bb3663779..66e80b90d 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -184,6 +184,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("install-about")) .override_usage(format_usage(&translate!("install-usage"))) .infer_long_args(true) diff --git a/src/uu/join/src/join.rs b/src/uu/join/src/join.rs index a55c9afd5..dd1323506 100644 --- a/src/uu/join/src/join.rs +++ b/src/uu/join/src/join.rs @@ -855,6 +855,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("join-about")) .override_usage(format_usage(&translate!("join-usage"))) .infer_long_args(true) diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index aef9b45e3..e749e982b 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -100,6 +100,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("kill-about")) .override_usage(format_usage(&translate!("kill-usage"))) .infer_long_args(true) diff --git a/src/uu/link/src/link.rs b/src/uu/link/src/link.rs index 8f18bf86b..773d52d20 100644 --- a/src/uu/link/src/link.rs +++ b/src/uu/link/src/link.rs @@ -37,6 +37,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("link-about")) .override_usage(format_usage(&translate!("link-usage"))) .infer_long_args(true) diff --git a/src/uu/ln/src/ln.rs b/src/uu/ln/src/ln.rs index d9a7afbd7..8b21bd093 100644 --- a/src/uu/ln/src/ln.rs +++ b/src/uu/ln/src/ln.rs @@ -144,6 +144,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("ln-about")) .override_usage(format_usage(&translate!("ln-usage"))) .infer_long_args(true) diff --git a/src/uu/logname/src/logname.rs b/src/uu/logname/src/logname.rs index bb34f4b74..1cf1872a8 100644 --- a/src/uu/logname/src/logname.rs +++ b/src/uu/logname/src/logname.rs @@ -37,6 +37,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(uucore::util_name()) .about(translate!("logname-about")) .infer_long_args(true) diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 5e9477c29..b25924c3f 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -57,7 +57,7 @@ use uucore::libc::{S_IXGRP, S_IXOTH, S_IXUSR}; use uucore::libc::{dev_t, major, minor}; use uucore::{ display::Quotable, - error::{UError, UResult, USimpleError, set_exit_code}, + error::{UError, UResult, set_exit_code}, format::human::{SizeFormat, human_readable}, format_usage, fs::FileInformation, @@ -1104,18 +1104,9 @@ impl Config { #[uucore::main] pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = match uu_app().try_get_matches_from(args) { - // clap successfully parsed the arguments: Ok(matches) => matches, - // --help, --version, etc.: - Err(e) if e.exit_code() == 0 => { - return Err(e.into()); - } - // Errors in argument *values* cause exit code 1: - Err(e) if e.kind() == clap::error::ErrorKind::InvalidValue => { - return Err(USimpleError::new(1, e.to_string())); - } - // All other argument parsing errors cause exit code 2: Err(e) => { + // Use localization handler for all clap errors uucore::clap_localization::handle_clap_error_with_exit_code(e, "ls", 2); } }; @@ -1134,6 +1125,7 @@ pub fn uu_app() -> Command { .version(uucore::crate_version!()) .override_usage(format_usage(&translate!("ls-usage"))) .about(translate!("ls-about")) + .help_template(uucore::localized_help_template(uucore::util_name())) .infer_long_args(true) .disable_help_flag(true) .args_override_self(true) diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index c82309087..fb82d963c 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -112,6 +112,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("mkdir-about")) .override_usage(format_usage(&translate!("mkdir-usage"))) .infer_long_args(true) diff --git a/src/uu/mkfifo/src/mkfifo.rs b/src/uu/mkfifo/src/mkfifo.rs index ae3466da6..5cae85cc8 100644 --- a/src/uu/mkfifo/src/mkfifo.rs +++ b/src/uu/mkfifo/src/mkfifo.rs @@ -84,6 +84,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("mkfifo-usage"))) .about(translate!("mkfifo-about")) .infer_long_args(true) diff --git a/src/uu/mknod/src/mknod.rs b/src/uu/mknod/src/mknod.rs index b67e48e0c..d922c3b82 100644 --- a/src/uu/mknod/src/mknod.rs +++ b/src/uu/mknod/src/mknod.rs @@ -171,6 +171,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("mknod-usage"))) .after_help(translate!("mknod-after-help")) .about(translate!("mknod-about")) diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index b1dbacf71..23d22d361 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -397,6 +397,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("mktemp-about")) .override_usage(format_usage(&translate!("mktemp-usage"))) .infer_long_args(true) diff --git a/src/uu/more/src/more.rs b/src/uu/more/src/more.rs index 473a7f859..8aa6b7729 100644 --- a/src/uu/more/src/more.rs +++ b/src/uu/more/src/more.rs @@ -213,6 +213,7 @@ pub fn uu_app() -> Command { .about(translate!("more-about")) .override_usage(format_usage(&translate!("more-usage"))) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .infer_long_args(true) .arg( Arg::new(options::SILENT) diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index b3ae7114e..b89290149 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -226,6 +226,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) .about(translate!("mv-about")) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("mv-usage"))) .after_help(format!( "{}\n\n{}", diff --git a/src/uu/nice/src/nice.rs b/src/uu/nice/src/nice.rs index 776332797..5e9b555e8 100644 --- a/src/uu/nice/src/nice.rs +++ b/src/uu/nice/src/nice.rs @@ -185,6 +185,7 @@ pub fn uu_app() -> Command { .trailing_var_arg(true) .infer_long_args(true) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .arg( Arg::new(options::ADJUSTMENT) .short('n') diff --git a/src/uu/nl/src/nl.rs b/src/uu/nl/src/nl.rs index f759b5926..890de1e86 100644 --- a/src/uu/nl/src/nl.rs +++ b/src/uu/nl/src/nl.rs @@ -230,6 +230,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .about(translate!("nl-about")) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("nl-usage"))) .after_help(translate!("nl-after-help")) .infer_long_args(true) diff --git a/src/uu/nohup/src/nohup.rs b/src/uu/nohup/src/nohup.rs index 92dc510b5..f20ec29af 100644 --- a/src/uu/nohup/src/nohup.rs +++ b/src/uu/nohup/src/nohup.rs @@ -86,6 +86,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("nohup-about")) .after_help(translate!("nohup-after-help")) .override_usage(format_usage(&translate!("nohup-usage"))) diff --git a/src/uu/nproc/src/nproc.rs b/src/uu/nproc/src/nproc.rs index 7137ebda7..dd53e81b9 100644 --- a/src/uu/nproc/src/nproc.rs +++ b/src/uu/nproc/src/nproc.rs @@ -93,6 +93,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("nproc-about")) .override_usage(format_usage(&translate!("nproc-usage"))) .infer_long_args(true) diff --git a/src/uu/numfmt/src/numfmt.rs b/src/uu/numfmt/src/numfmt.rs index 008f51558..e5cec7692 100644 --- a/src/uu/numfmt/src/numfmt.rs +++ b/src/uu/numfmt/src/numfmt.rs @@ -280,6 +280,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("numfmt-about")) .after_help(translate!("numfmt-after-help")) .override_usage(format_usage(&translate!("numfmt-usage"))) diff --git a/src/uu/od/src/od.rs b/src/uu/od/src/od.rs index 936e32c88..e63a29a00 100644 --- a/src/uu/od/src/od.rs +++ b/src/uu/od/src/od.rs @@ -252,6 +252,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("od-about")) .override_usage(format_usage(&translate!("od-usage"))) .after_help(translate!("od-after-help")) diff --git a/src/uu/paste/src/paste.rs b/src/uu/paste/src/paste.rs index 807e4debf..82a03f93b 100644 --- a/src/uu/paste/src/paste.rs +++ b/src/uu/paste/src/paste.rs @@ -42,6 +42,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("paste-about")) .override_usage(format_usage(&translate!("paste-usage"))) .infer_long_args(true) diff --git a/src/uu/pathchk/src/pathchk.rs b/src/uu/pathchk/src/pathchk.rs index 9016a4878..c46ed39ae 100644 --- a/src/uu/pathchk/src/pathchk.rs +++ b/src/uu/pathchk/src/pathchk.rs @@ -82,6 +82,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("pathchk-about")) .override_usage(format_usage(&translate!("pathchk-usage"))) .infer_long_args(true) diff --git a/src/uu/pinky/src/pinky.rs b/src/uu/pinky/src/pinky.rs index e494ba555..c2d303e26 100644 --- a/src/uu/pinky/src/pinky.rs +++ b/src/uu/pinky/src/pinky.rs @@ -36,6 +36,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(about) .override_usage(format_usage(&translate!("pinky-usage"))) .infer_long_args(true) diff --git a/src/uu/pr/src/pr.rs b/src/uu/pr/src/pr.rs index fef4ba5cc..75fea4be1 100644 --- a/src/uu/pr/src/pr.rs +++ b/src/uu/pr/src/pr.rs @@ -159,6 +159,7 @@ enum PrError { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("pr-about")) .after_help(translate!("pr-after-help")) .override_usage(format_usage(&translate!("pr-usage"))) diff --git a/src/uu/printenv/src/printenv.rs b/src/uu/printenv/src/printenv.rs index ea93904a1..3ae77a77e 100644 --- a/src/uu/printenv/src/printenv.rs +++ b/src/uu/printenv/src/printenv.rs @@ -57,6 +57,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("printenv-about")) .override_usage(format_usage(&translate!("printenv-usage"))) .infer_long_args(true) diff --git a/src/uu/printf/src/printf.rs b/src/uu/printf/src/printf.rs index f5a7bc67c..e48d253f5 100644 --- a/src/uu/printf/src/printf.rs +++ b/src/uu/printf/src/printf.rs @@ -85,6 +85,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .allow_hyphen_values(true) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("printf-about")) .after_help(translate!("printf-after-help")) .override_usage(format_usage(&translate!("printf-usage"))) diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index 728c17d4c..b8352e06f 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -771,6 +771,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .about(translate!("ptx-about")) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("ptx-usage"))) .infer_long_args(true) .arg( diff --git a/src/uu/pwd/src/pwd.rs b/src/uu/pwd/src/pwd.rs index 130b11096..fccf8c7b3 100644 --- a/src/uu/pwd/src/pwd.rs +++ b/src/uu/pwd/src/pwd.rs @@ -142,6 +142,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("pwd-about")) .override_usage(format_usage(&translate!("pwd-usage"))) .infer_long_args(true) diff --git a/src/uu/readlink/src/readlink.rs b/src/uu/readlink/src/readlink.rs index b9aca641c..f634c970a 100644 --- a/src/uu/readlink/src/readlink.rs +++ b/src/uu/readlink/src/readlink.rs @@ -108,6 +108,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("readlink-about")) .override_usage(format_usage(&translate!("readlink-usage"))) .infer_long_args(true) diff --git a/src/uu/realpath/src/realpath.rs b/src/uu/realpath/src/realpath.rs index d5d77cc2c..1b4ea6028 100644 --- a/src/uu/realpath/src/realpath.rs +++ b/src/uu/realpath/src/realpath.rs @@ -86,6 +86,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("realpath-about")) .override_usage(format_usage(&translate!("realpath-usage"))) .infer_long_args(true) diff --git a/src/uu/rm/src/rm.rs b/src/uu/rm/src/rm.rs index 7030d0627..9e3fa9b39 100644 --- a/src/uu/rm/src/rm.rs +++ b/src/uu/rm/src/rm.rs @@ -227,6 +227,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) .about(translate!("rm-about")) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("rm-usage"))) .after_help(translate!("rm-after-help")) .infer_long_args(true) diff --git a/src/uu/rmdir/src/rmdir.rs b/src/uu/rmdir/src/rmdir.rs index 25bc666b6..d2c2ac105 100644 --- a/src/uu/rmdir/src/rmdir.rs +++ b/src/uu/rmdir/src/rmdir.rs @@ -171,6 +171,7 @@ struct Opts { pub fn uu_app() -> Command { Command::new(util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(util_name())) .about(translate!("rmdir-about")) .override_usage(format_usage(&translate!("rmdir-usage"))) .infer_long_args(true) diff --git a/src/uu/runcon/src/runcon.rs b/src/uu/runcon/src/runcon.rs index 3dfa5cc0c..f6fee9158 100644 --- a/src/uu/runcon/src/runcon.rs +++ b/src/uu/runcon/src/runcon.rs @@ -87,6 +87,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("runcon-about")) .after_help(translate!("runcon-after-help")) .override_usage(format_usage(&translate!("runcon-usage"))) diff --git a/src/uu/seq/src/seq.rs b/src/uu/seq/src/seq.rs index 6e343f534..5ab029b1a 100644 --- a/src/uu/seq/src/seq.rs +++ b/src/uu/seq/src/seq.rs @@ -221,6 +221,7 @@ pub fn uu_app() -> Command { .trailing_var_arg(true) .infer_long_args(true) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("seq-about")) .override_usage(format_usage(&translate!("seq-usage"))) .arg( diff --git a/src/uu/shred/src/shred.rs b/src/uu/shred/src/shred.rs index adc0db2bd..c158678a4 100644 --- a/src/uu/shred/src/shred.rs +++ b/src/uu/shred/src/shred.rs @@ -316,6 +316,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("shred-about")) .after_help(translate!("shred-after-help")) .override_usage(format_usage(&translate!("shred-usage"))) diff --git a/src/uu/shuf/src/shuf.rs b/src/uu/shuf/src/shuf.rs index 3e80e745e..45c1e4ece 100644 --- a/src/uu/shuf/src/shuf.rs +++ b/src/uu/shuf/src/shuf.rs @@ -146,6 +146,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .about(translate!("shuf-about")) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("shuf-usage"))) .infer_long_args(true) .arg( diff --git a/src/uu/sleep/src/sleep.rs b/src/uu/sleep/src/sleep.rs index 87141e571..4cbaa6e6f 100644 --- a/src/uu/sleep/src/sleep.rs +++ b/src/uu/sleep/src/sleep.rs @@ -40,6 +40,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("sleep-about")) .after_help(translate!("sleep-after-help")) .override_usage(format_usage(&translate!("sleep-usage"))) diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index 29346315b..f9224f865 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -43,7 +43,7 @@ use std::str::Utf8Error; use thiserror::Error; use uucore::display::Quotable; use uucore::error::{FromIo, strip_errno}; -use uucore::error::{UError, UResult, USimpleError, UUsageError, set_exit_code}; +use uucore::error::{UError, UResult, USimpleError, UUsageError}; use uucore::extendedbigdecimal::ExtendedBigDecimal; use uucore::format_usage; use uucore::line_ending::LineEnding; @@ -1051,14 +1051,8 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { // This logic is similar to the code in clap, but we return 2 as the exit code in case of real failure // (clap returns 1). use uucore::clap_localization::handle_clap_error_with_exit_code; - if e.kind() == clap::error::ErrorKind::UnknownArgument { - handle_clap_error_with_exit_code(e, uucore::util_name(), 2); - } - e.print().unwrap(); - if e.use_stderr() { - set_exit_code(2); - } - return Ok(()); + // Always use the localization handler for proper error and help handling + handle_clap_error_with_exit_code(e, uucore::util_name(), 2); } }; @@ -1349,6 +1343,7 @@ pub fn uu_app() -> Command { .about(translate!("sort-about")) .after_help(translate!("sort-after-help")) .override_usage(format_usage(&translate!("sort-usage"))) + .help_template(uucore::localized_help_template(uucore::util_name())) .infer_long_args(true) .disable_help_flag(true) .disable_version_flag(true) diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index 2bcb5a3a0..70c475782 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -228,6 +228,7 @@ fn handle_preceding_options( pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("split-about")) .after_help(translate!("split-after-help")) .override_usage(format_usage(&translate!("split-usage"))) diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index 0142f3dd5..4d5dde949 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -1235,6 +1235,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("stat-about")) .override_usage(format_usage(&translate!("stat-usage"))) .infer_long_args(true) diff --git a/src/uu/stdbuf/src/stdbuf.rs b/src/uu/stdbuf/src/stdbuf.rs index e4ccd55e0..c2c6beab8 100644 --- a/src/uu/stdbuf/src/stdbuf.rs +++ b/src/uu/stdbuf/src/stdbuf.rs @@ -234,6 +234,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("stdbuf-about")) .after_help(translate!("stdbuf-after-help")) .override_usage(format_usage(&translate!("stdbuf-usage"))) diff --git a/src/uu/stty/src/stty.rs b/src/uu/stty/src/stty.rs index 0391b32a5..69400c855 100644 --- a/src/uu/stty/src/stty.rs +++ b/src/uu/stty/src/stty.rs @@ -1007,6 +1007,7 @@ fn get_sane_control_char(cc_index: S) -> u8 { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("stty-usage"))) .about(translate!("stty-about")) .infer_long_args(true) diff --git a/src/uu/sum/src/sum.rs b/src/uu/sum/src/sum.rs index c45ffc944..2366a59d3 100644 --- a/src/uu/sum/src/sum.rs +++ b/src/uu/sum/src/sum.rs @@ -138,6 +138,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("sum-usage"))) .about(translate!("sum-about")) .infer_long_args(true) diff --git a/src/uu/sync/src/sync.rs b/src/uu/sync/src/sync.rs index 4efaebd5c..d58463591 100644 --- a/src/uu/sync/src/sync.rs +++ b/src/uu/sync/src/sync.rs @@ -227,6 +227,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("sync-about")) .override_usage(format_usage(&translate!("sync-usage"))) .infer_long_args(true) diff --git a/src/uu/tac/src/tac.rs b/src/uu/tac/src/tac.rs index f24320183..799e65571 100644 --- a/src/uu/tac/src/tac.rs +++ b/src/uu/tac/src/tac.rs @@ -57,6 +57,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("tac-usage"))) .about(translate!("tac-about")) .infer_long_args(true) diff --git a/src/uu/tail/src/args.rs b/src/uu/tail/src/args.rs index 7e2a20bcb..ef53b3943 100644 --- a/src/uu/tail/src/args.rs +++ b/src/uu/tail/src/args.rs @@ -461,6 +461,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("tail-about")) .override_usage(format_usage(&translate!("tail-usage"))) .infer_long_args(true) diff --git a/src/uu/tee/src/tee.rs b/src/uu/tee/src/tee.rs index 29dfef9d5..5c6a120e7 100644 --- a/src/uu/tee/src/tee.rs +++ b/src/uu/tee/src/tee.rs @@ -95,6 +95,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("tee-about")) .override_usage(format_usage(&translate!("tee-usage"))) .after_help(translate!("tee-after-help")) diff --git a/src/uu/test/src/test.rs b/src/uu/test/src/test.rs index c1a680093..c553e1f8b 100644 --- a/src/uu/test/src/test.rs +++ b/src/uu/test/src/test.rs @@ -15,6 +15,7 @@ use std::ffi::{OsStr, OsString}; use std::fs; #[cfg(unix)] use std::os::unix::fs::MetadataExt; +use uucore::LocalizedCommand; use uucore::display::Quotable; use uucore::error::{UResult, USimpleError}; use uucore::format_usage; @@ -35,6 +36,7 @@ pub fn uu_app() -> Command { // since we don't recognize -h and -v as help/version flags. Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("test-about")) .override_usage(format_usage(&translate!("test-usage"))) .after_help(translate!("test-after-help")) @@ -49,7 +51,7 @@ pub fn uumain(mut args: impl uucore::Args) -> UResult<()> { if binary_name.ends_with('[') { // If invoked as [ we should recognize --help and --version (but not -h or -v) if args.len() == 1 && (args[0] == "--help" || args[0] == "--version") { - uu_app().get_matches_from(std::iter::once(program).chain(args.into_iter())); + uu_app().get_matches_from_localized(std::iter::once(program).chain(args.into_iter())); return Ok(()); } // If invoked via name '[', matching ']' must be in the last arg diff --git a/src/uu/timeout/src/timeout.rs b/src/uu/timeout/src/timeout.rs index 755f593bf..dded6bad6 100644 --- a/src/uu/timeout/src/timeout.rs +++ b/src/uu/timeout/src/timeout.rs @@ -121,6 +121,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new("timeout") .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("timeout-about")) .override_usage(format_usage(&translate!("timeout-usage"))) .arg( diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index d61802b3c..451b5b560 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -255,6 +255,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("touch-about")) .override_usage(format_usage(&translate!("touch-usage"))) .infer_long_args(true) diff --git a/src/uu/tr/src/tr.rs b/src/uu/tr/src/tr.rs index c254252fb..709cf227b 100644 --- a/src/uu/tr/src/tr.rs +++ b/src/uu/tr/src/tr.rs @@ -171,6 +171,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("tr-about")) .override_usage(format_usage(&translate!("tr-usage"))) .after_help(translate!("tr-after-help")) diff --git a/src/uu/true/src/true.rs b/src/uu/true/src/true.rs index 788d23067..e19b26408 100644 --- a/src/uu/true/src/true.rs +++ b/src/uu/true/src/true.rs @@ -42,6 +42,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("true-about")) // We provide our own help and version options, to ensure maximum compatibility with GNU. .disable_help_flag(true) diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index b11796cc0..0ad207b7a 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -118,6 +118,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("truncate-about")) .override_usage(format_usage(&translate!("truncate-usage"))) .infer_long_args(true) diff --git a/src/uu/tsort/src/tsort.rs b/src/uu/tsort/src/tsort.rs index a83478d20..33822a474 100644 --- a/src/uu/tsort/src/tsort.rs +++ b/src/uu/tsort/src/tsort.rs @@ -77,6 +77,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("tsort-usage"))) .about(translate!("tsort-about")) .infer_long_args(true) diff --git a/src/uu/tty/src/tty.rs b/src/uu/tty/src/tty.rs index b893fa8b4..1ac6ed362 100644 --- a/src/uu/tty/src/tty.rs +++ b/src/uu/tty/src/tty.rs @@ -58,6 +58,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("tty-about")) .override_usage(format_usage(&translate!("tty-usage"))) .infer_long_args(true) diff --git a/src/uu/uname/src/uname.rs b/src/uu/uname/src/uname.rs index 84dd4ca7c..d23d8b7fc 100644 --- a/src/uu/uname/src/uname.rs +++ b/src/uu/uname/src/uname.rs @@ -142,6 +142,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("uname-about")) .override_usage(format_usage(&translate!("uname-usage"))) .infer_long_args(true) diff --git a/src/uu/unexpand/src/unexpand.rs b/src/uu/unexpand/src/unexpand.rs index f0b8924b2..e4a3a9964 100644 --- a/src/uu/unexpand/src/unexpand.rs +++ b/src/uu/unexpand/src/unexpand.rs @@ -155,6 +155,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .override_usage(format_usage(&translate!("unexpand-usage"))) .about(translate!("unexpand-about")) .infer_long_args(true) diff --git a/src/uu/uniq/src/uniq.rs b/src/uu/uniq/src/uniq.rs index 1a2a3c7d9..cb9f9d198 100644 --- a/src/uu/uniq/src/uniq.rs +++ b/src/uu/uniq/src/uniq.rs @@ -592,6 +592,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("uniq-about")) .override_usage(format_usage(&translate!("uniq-usage"))) .infer_long_args(true) diff --git a/src/uu/unlink/src/unlink.rs b/src/uu/unlink/src/unlink.rs index 4fc5492c6..14602cf38 100644 --- a/src/uu/unlink/src/unlink.rs +++ b/src/uu/unlink/src/unlink.rs @@ -30,6 +30,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("unlink-about")) .override_usage(format_usage(&translate!("unlink-usage"))) .infer_long_args(true) diff --git a/src/uu/uptime/src/uptime.rs b/src/uu/uptime/src/uptime.rs index 22a715306..6e028fbd6 100644 --- a/src/uu/uptime/src/uptime.rs +++ b/src/uu/uptime/src/uptime.rs @@ -72,6 +72,7 @@ pub fn uu_app() -> Command { let cmd = Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(about) .override_usage(format_usage(&translate!("uptime-usage"))) .infer_long_args(true) diff --git a/src/uu/users/src/users.rs b/src/uu/users/src/users.rs index 9439a3efa..ca63e527e 100644 --- a/src/uu/users/src/users.rs +++ b/src/uu/users/src/users.rs @@ -90,6 +90,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(about) .override_usage(format_usage(&translate!("users-usage"))) .infer_long_args(true) diff --git a/src/uu/wc/src/wc.rs b/src/uu/wc/src/wc.rs index 8b3070989..fa111e4e4 100644 --- a/src/uu/wc/src/wc.rs +++ b/src/uu/wc/src/wc.rs @@ -388,6 +388,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("wc-about")) .override_usage(format_usage(&translate!("wc-usage"))) .infer_long_args(true) diff --git a/src/uu/who/src/who.rs b/src/uu/who/src/who.rs index 1a139f20b..2a91b4cf6 100644 --- a/src/uu/who/src/who.rs +++ b/src/uu/who/src/who.rs @@ -47,6 +47,7 @@ pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(about) .override_usage(format_usage(&translate!("who-usage"))) .infer_long_args(true) diff --git a/src/uu/whoami/src/whoami.rs b/src/uu/whoami/src/whoami.rs index 40398accf..f65dfd078 100644 --- a/src/uu/whoami/src/whoami.rs +++ b/src/uu/whoami/src/whoami.rs @@ -28,6 +28,7 @@ pub fn whoami() -> UResult { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("whoami-about")) .override_usage(uucore::util_name()) .infer_long_args(true) diff --git a/src/uu/yes/src/yes.rs b/src/uu/yes/src/yes.rs index 5affbb6e3..028f6ba7e 100644 --- a/src/uu/yes/src/yes.rs +++ b/src/uu/yes/src/yes.rs @@ -41,6 +41,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pub fn uu_app() -> Command { Command::new(uucore::util_name()) .version(uucore::crate_version!()) + .help_template(uucore::localized_help_template(uucore::util_name())) .about(translate!("yes-about")) .override_usage(format_usage(&translate!("yes-usage"))) .arg( diff --git a/src/uucore/src/lib/lib.rs b/src/uucore/src/lib/lib.rs index 8c8dbb74e..6b1419e62 100644 --- a/src/uucore/src/lib/lib.rs +++ b/src/uucore/src/lib/lib.rs @@ -228,6 +228,41 @@ pub fn format_usage(s: &str) -> String { s.replace("{}", crate::execution_phrase()) } +/// Creates a localized help template for clap commands. +/// +/// This function returns a help template that uses the localized +/// "Usage:" label from the translation files. This ensures consistent +/// localization across all utilities. +/// +/// Note: We avoid using clap's `{usage-heading}` placeholder because it is +/// hardcoded to "Usage:" and cannot be localized. Instead, we manually +/// construct the usage line with the localized label. +/// +/// # Parameters +/// - `util_name`: The name of the utility (for localization setup) +/// +/// # Example +/// ```no_run +/// use clap::Command; +/// use uucore::localized_help_template; +/// +/// let app = Command::new("myutil") +/// .help_template(localized_help_template("myutil")); +/// ``` +pub fn localized_help_template(util_name: &str) -> clap::builder::StyledStr { + // Ensure localization is initialized for this utility + let _ = crate::locale::setup_localization(util_name); + + let usage_label = crate::locale::translate!("common-usage"); + + // Create a template that avoids clap's hardcoded {usage-heading} + let template = format!( + "{{before-help}}{{about-with-newline}}\n{usage_label}: {{usage}}\n\n{{all-args}}{{after-help}}" + ); + + clap::builder::StyledStr::from(template) +} + /// Used to check if the utility is the second argument. /// Used to check if we were called as a multicall binary (`coreutils `) pub fn get_utility_is_second_arg() -> bool { diff --git a/src/uucore/src/lib/mods/clap_localization.rs b/src/uucore/src/lib/mods/clap_localization.rs index 152c17ddb..824b606e5 100644 --- a/src/uucore/src/lib/mods/clap_localization.rs +++ b/src/uucore/src/lib/mods/clap_localization.rs @@ -17,7 +17,7 @@ use std::ffi::OsString; /// Based on clap's own design patterns and error categorization fn should_show_simple_help_for_clap_error(kind: ErrorKind) -> bool { match kind { - // Most validation errors should show simple help + // Show simple help ErrorKind::InvalidValue | ErrorKind::InvalidSubcommand | ErrorKind::ValueValidation @@ -73,21 +73,6 @@ fn colorize(text: &str, color: Color) -> String { format!("\x1b[{}m{text}\x1b[0m", color.code()) } -/// Display usage information and help suggestion for errors that require it -/// This consolidates the shared logic between clap errors and UUsageError -pub fn display_usage_and_help(util_name: &str) { - eprintln!(); - // Try to get usage information from localization - let usage_key = format!("{}-usage", util_name); - let usage_text = translate!(&usage_key); - let formatted_usage = crate::format_usage(&usage_text); - let usage_label = translate!("common-usage"); - eprintln!("{}: {}", usage_label, formatted_usage); - eprintln!(); - let help_msg = translate!("clap-error-help-suggestion", "command" => crate::execution_phrase()); - eprintln!("{help_msg}"); -} - pub fn handle_clap_error_with_exit_code(err: Error, util_name: &str, exit_code: i32) -> ! { // Ensure localization is initialized for this utility (always with common strings) let _ = crate::locale::setup_localization(util_name); @@ -106,8 +91,25 @@ pub fn handle_clap_error_with_exit_code(err: Error, util_name: &str, exit_code: }; match err.kind() { - ErrorKind::DisplayHelp | ErrorKind::DisplayVersion => { - // For help and version, use clap's built-in formatting and exit with 0 + ErrorKind::DisplayHelp => { + // For help messages, we use the localized help template + // The template should already have the localized usage label, + // but we also replace any remaining "Usage:" instances for fallback + + // Ensure localization is initialized + let _ = crate::locale::setup_localization(util_name); + + let help_text = err.render().to_string(); + + // Replace any remaining "Usage:" with localized version as fallback + let usage_label = translate!("common-usage"); + let localized_help = help_text.replace("Usage:", &format!("{usage_label}:")); + + print!("{}", localized_help); + std::process::exit(0); + } + ErrorKind::DisplayVersion => { + // For version, use clap's built-in formatting and exit with 0 // Output to stdout as expected by tests print!("{}", err.render()); std::process::exit(0); @@ -204,7 +206,15 @@ pub fn handle_clap_error_with_exit_code(err: Error, util_name: &str, exit_code: // Fallback to original rendering if we can't parse eprint!("{}", err.render()); } - std::process::exit(exit_code); + + // InvalidValue errors should exit with code 1 for all utilities + let actual_exit_code = if matches!(kind, ErrorKind::InvalidValue) { + 1 + } else { + exit_code + }; + + std::process::exit(actual_exit_code); } _ => { // For MissingRequiredArgument, use the full clap error as it includes proper usage diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index 15872affc..73046a7e5 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -1606,4 +1606,133 @@ fn test_argument_suggestion() { } } } + +#[test] +fn test_clap_localization_unknown_argument() { + let test_cases = vec![ + ( + "en_US.UTF-8", + vec![ + "error: unexpected argument '--unknown-option' found", + "Usage:", + "For more information, try '--help'.", + ], + ), + ( + "fr_FR.UTF-8", + vec![ + "erreur : argument inattendu '--unknown-option' trouvé", + "Utilisation:", + "Pour plus d'informations, essayez '--help'.", + ], + ), + ]; + + for (locale, expected_strings) in test_cases { + let result = new_ucmd!() + .env("LC_ALL", locale) + .arg("--unknown-option") + .env("LANG", locale) + .fails(); + + result.code_is(2); // sort uses exit code 2 for invalid options + let stderr = result.stderr_str(); + for expected in expected_strings { + assert!(stderr.contains(expected)); + } + } +} + +#[test] +fn test_clap_localization_help_message() { + // Test help message in English + let result_en = new_ucmd!() + .env("LC_ALL", "en_US.UTF-8") + .arg("--help") + .env("LANG", "en_US.UTF-8") + .succeeds(); + + let stdout_en = result_en.stdout_str(); + assert!(stdout_en.contains("Usage:")); + assert!(stdout_en.contains("Options:")); + + // Test help message in French + let result_fr = new_ucmd!() + .env("LC_ALL", "fr_FR.UTF-8") + .arg("--help") + .env("LANG", "fr_FR.UTF-8") + .succeeds(); + + let stdout_fr = result_fr.stdout_str(); + assert!(stdout_fr.contains("Utilisation:")); + assert!(stdout_fr.contains("Options:")); +} + +#[test] +fn test_clap_localization_missing_required_argument() { + // Test missing required argument + let result_en = new_ucmd!().env("LC_ALL", "en_US.UTF-8").arg("-k").fails(); + + let stderr_en = result_en.stderr_str(); + assert!(stderr_en.contains("error:")); + assert!(stderr_en.contains("-k")); + + // Test in French + let result_fr = new_ucmd!() + .env("LANG", "fr_FR.UTF-8") + .env("LC_ALL", "fr_FR.UTF-8") + .arg("-k") + .fails(); + + let stderr_fr = result_fr.stderr_str(); + // The main error message should contain French "erreur" + assert!(stderr_fr.contains("error:") || stderr_fr.contains("erreur")); +} + +#[test] +fn test_clap_localization_invalid_value() { + let test_cases = vec![ + ("en_US.UTF-8", "sort: failed to parse key 'invalid'"), + ("fr_FR.UTF-8", "sort: échec d'analyse de la clé 'invalid'"), + ]; + + for (locale, expected_message) in test_cases { + let result = new_ucmd!() + .env("LC_ALL", locale) + .arg("-k") + .env("LANG", locale) + .arg("invalid") + .fails(); + + let stderr = result.stderr_str(); + assert!(stderr.contains(expected_message)); + } +} + +#[test] +fn test_clap_localization_tip_for_value_with_dash() { + // Test tip for passing values that look like options + let result_en = new_ucmd!() + let test_cases = vec![ + ("en_US.UTF-8", vec!["tip:", "-- --file-with-dash"]), + ("fr_FR.UTF-8", vec!["tip:", "-- --file-with-dash"]), // TODO: fix French translation + ]; + assert!(stderr_en.contains("tip:") || stderr_en.contains("conseil:")); + for (locale, expected_strings) in test_cases { + let result = new_ucmd!() + .env("LANG", locale) + .env("LC_ALL", locale) + .arg("--output") + .arg("--file-with-dash") + .fails(); + + let stderr = result.stderr_str(); + for expected in expected_strings { + assert!(stderr.contains(expected)); + } + let result_fr = new_ucmd!() + } + } + // The tip should be preserved from clap + assert!(stderr_fr.contains("tip:") || stderr_fr.contains("conseil:")); /* spell-checker: enable */