diff --git a/src/bin/coreutils.rs b/src/bin/coreutils.rs index 3e8df57f7..477931dbd 100644 --- a/src/bin/coreutils.rs +++ b/src/bin/coreutils.rs @@ -70,6 +70,7 @@ fn main() { Some(OsString::from(*util)) } else { // unmatched binary name => regard as multi-binary container and advance argument list + uucore::set_utility_is_second_arg(); args.next() }; diff --git a/src/uu/arch/src/arch.rs b/src/uu/arch/src/arch.rs index 94ec97e98..478fef6f1 100644 --- a/src/uu/arch/src/arch.rs +++ b/src/uu/arch/src/arch.rs @@ -27,7 +27,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help(SUMMARY) diff --git a/src/uu/base32/src/base32.rs b/src/uu/base32/src/base32.rs index 9a29717ac..ac9ed1075 100644 --- a/src/uu/base32/src/base32.rs +++ b/src/uu/base32/src/base32.rs @@ -28,17 +28,17 @@ static VERSION: &str = env!("CARGO_PKG_VERSION"); static BASE_CMD_PARSE_ERROR: i32 = 1; -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { let format = Format::Base32; - let usage = get_usage(); - let name = executable!(); + let usage = usage(); + let name = uucore::util_name(); let config_result: Result = - base_common::parse_base_cmd_args(args, name, VERSION, ABOUT, &usage); + base_common::parse_base_cmd_args(args, &name, VERSION, ABOUT, &usage); let config = config_result.unwrap_or_else(|s| crash!(BASE_CMD_PARSE_ERROR, "{}", s)); // Create a reference to stdin so we can return a locked stdin from @@ -52,12 +52,12 @@ pub fn uumain(args: impl uucore::Args) -> i32 { config.wrap_cols, config.ignore_garbage, config.decode, - name, + &name, ); 0 } pub fn uu_app() -> App<'static, 'static> { - base_common::base_app(executable!(), VERSION, ABOUT) + base_common::base_app(&uucore::util_name(), VERSION, ABOUT) } diff --git a/src/uu/base64/src/base64.rs b/src/uu/base64/src/base64.rs index 71ed44e6e..e303f9d29 100644 --- a/src/uu/base64/src/base64.rs +++ b/src/uu/base64/src/base64.rs @@ -29,16 +29,16 @@ static VERSION: &str = env!("CARGO_PKG_VERSION"); static BASE_CMD_PARSE_ERROR: i32 = 1; -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { let format = Format::Base64; - let usage = get_usage(); - let name = executable!(); + let usage = usage(); + let name = uucore::util_name(); let config_result: Result = - base_common::parse_base_cmd_args(args, name, VERSION, ABOUT, &usage); + base_common::parse_base_cmd_args(args, &name, VERSION, ABOUT, &usage); let config = config_result.unwrap_or_else(|s| crash!(BASE_CMD_PARSE_ERROR, "{}", s)); // Create a reference to stdin so we can return a locked stdin from @@ -52,7 +52,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { config.wrap_cols, config.ignore_garbage, config.decode, - name, + &name, ); 0 diff --git a/src/uu/basename/src/basename.rs b/src/uu/basename/src/basename.rs index 5450ee3f2..2d2f649d1 100644 --- a/src/uu/basename/src/basename.rs +++ b/src/uu/basename/src/basename.rs @@ -17,11 +17,11 @@ use uucore::InvalidEncodingHandling; static SUMMARY: &str = "Print NAME with any leading directory components removed If specified, also remove a trailing SUFFIX"; -fn get_usage() -> String { +fn usage() -> String { format!( "{0} NAME [SUFFIX] {0} OPTION... NAME...", - executable!() + uucore::execution_phrase() ) } @@ -36,7 +36,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let args = args .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - let usage = get_usage(); + let usage = usage(); // // Argument parsing // @@ -47,7 +47,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { crash!( 1, "{1}\nTry '{0} --help' for more information.", - executable!(), + uucore::execution_phrase(), "missing operand" ); } @@ -61,7 +61,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { crash!( 1, "extra operand '{1}'\nTry '{0} --help' for more information.", - executable!(), + uucore::execution_phrase(), matches.values_of(options::NAME).unwrap().nth(2).unwrap() ); } @@ -93,7 +93,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(SUMMARY) .arg( diff --git a/src/uu/basenc/src/basenc.rs b/src/uu/basenc/src/basenc.rs index e1daea4e6..2b3193d49 100644 --- a/src/uu/basenc/src/basenc.rs +++ b/src/uu/basenc/src/basenc.rs @@ -42,12 +42,12 @@ const ENCODINGS: &[(&str, Format)] = &[ ("base2m", Format::Base2Msbf), ]; -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]", uucore::execution_phrase()) } pub fn uu_app() -> App<'static, 'static> { - let mut app = base_common::base_app(executable!(), crate_version!(), ABOUT); + let mut app = base_common::base_app(&uucore::util_name(), crate_version!(), ABOUT); for encoding in ENCODINGS { app = app.arg(Arg::with_name(encoding.0).long(encoding.0)); } @@ -55,7 +55,7 @@ pub fn uu_app() -> App<'static, 'static> { } fn parse_cmd_args(args: impl uucore::Args) -> (Config, Format) { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from( args.collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(), @@ -75,7 +75,7 @@ fn parse_cmd_args(args: impl uucore::Args) -> (Config, Format) { } pub fn uumain(args: impl uucore::Args) -> i32 { - let name = executable!(); + let name = uucore::util_name(); let (config, format) = parse_cmd_args(args); // Create a reference to stdin so we can return a locked stdin from // parse_base_cmd_args @@ -88,7 +88,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { config.wrap_cols, config.ignore_garbage, config.decode, - name, + &name, ); 0 diff --git a/src/uu/cat/src/cat.rs b/src/uu/cat/src/cat.rs index b9d07bcda..a176b8c5d 100644 --- a/src/uu/cat/src/cat.rs +++ b/src/uu/cat/src/cat.rs @@ -234,7 +234,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(SYNTAX) @@ -396,7 +396,7 @@ fn cat_files(files: Vec, options: &OutputOptions) -> UResult<()> { Ok(()) } else { // each next line is expected to display "cat: …" - let line_joiner = format!("\n{}: ", executable!()); + let line_joiner = format!("\n{}: ", uucore::util_name()); Err(uucore::error::USimpleError::new( error_messages.len() as i32, diff --git a/src/uu/chcon/src/chcon.rs b/src/uu/chcon/src/chcon.rs index 2a5efba46..5f6a80bde 100644 --- a/src/uu/chcon/src/chcon.rs +++ b/src/uu/chcon/src/chcon.rs @@ -2,7 +2,7 @@ #![allow(clippy::upper_case_acronyms)] -use uucore::{executable, show_error, show_usage_error, show_warning}; +use uucore::{show_error, show_usage_error, show_warning}; use clap::{App, Arg}; use selinux::{OpaqueSecurityContext, SecurityContext}; @@ -56,7 +56,7 @@ fn get_usage() -> String { "{0} [OPTION]... CONTEXT FILE... \n \ {0} [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE... \n \ {0} [OPTION]... --reference=RFILE FILE...", - executable!() + uucore::execution_phrase() ) } @@ -152,7 +152,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(VERSION) .about(ABOUT) .arg( @@ -563,7 +563,7 @@ fn process_file( if options.verbose { println!( "{}: Changing security context of: {}", - executable!(), + uucore::util_name(), file_full_name.to_string_lossy() ); } diff --git a/src/uu/chgrp/src/chgrp.rs b/src/uu/chgrp/src/chgrp.rs index dd851c504..7840ba829 100644 --- a/src/uu/chgrp/src/chgrp.rs +++ b/src/uu/chgrp/src/chgrp.rs @@ -59,10 +59,10 @@ const FTS_COMFOLLOW: u8 = 1; const FTS_PHYSICAL: u8 = 1 << 1; const FTS_LOGICAL: u8 = 1 << 2; -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... GROUP FILE...\n {0} [OPTION]... --reference=RFILE FILE...", - executable!() + uucore::execution_phrase() ) } @@ -71,7 +71,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - let usage = get_usage(); + let usage = usage(); let mut app = uu_app().usage(&usage[..]); @@ -197,7 +197,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(VERSION) .about(ABOUT) .arg( diff --git a/src/uu/chmod/src/chmod.rs b/src/uu/chmod/src/chmod.rs index d89827c97..5108ec924 100644 --- a/src/uu/chmod/src/chmod.rs +++ b/src/uu/chmod/src/chmod.rs @@ -36,12 +36,12 @@ mod options { pub const FILE: &str = "FILE"; } -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... MODE[,MODE]... FILE... or: {0} [OPTION]... OCTAL-MODE FILE... or: {0} [OPTION]... --reference=RFILE FILE...", - executable!() + uucore::execution_phrase() ) } @@ -58,7 +58,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { // a possible MODE prefix '-' needs to be removed (e.g. "chmod -x FILE"). let mode_had_minus_prefix = strip_minus_from_mode(&mut args); - let usage = get_usage(); + let usage = usage(); let after_help = get_long_usage(); let matches = uu_app() @@ -116,7 +116,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index 7df263c5d..8813c07e2 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -61,10 +61,10 @@ const FTS_COMFOLLOW: u8 = 1; const FTS_PHYSICAL: u8 = 1 << 1; const FTS_LOGICAL: u8 = 1 << 2; -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... [OWNER][:[GROUP]] FILE...\n{0} [OPTION]... --reference=RFILE FILE...", - executable!() + uucore::execution_phrase() ) } @@ -74,7 +74,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -165,7 +165,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/chroot/src/chroot.rs b/src/uu/chroot/src/chroot.rs index 2c0f8522c..c0f392913 100644 --- a/src/uu/chroot/src/chroot.rs +++ b/src/uu/chroot/src/chroot.rs @@ -18,7 +18,6 @@ use std::process::Command; use uucore::libc::{self, chroot, setgid, setgroups, setuid}; use uucore::{entries, InvalidEncodingHandling}; -static NAME: &str = "chroot"; static ABOUT: &str = "Run COMMAND with root directory set to NEWROOT."; static SYNTAX: &str = "[OPTION]... NEWROOT [COMMAND [ARG]...]"; @@ -47,7 +46,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { None => crash!( 1, "Missing operand: NEWROOT\nTry '{} --help' for more information.", - NAME + uucore::execution_phrase() ), }; @@ -92,7 +91,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .usage(SYNTAX) diff --git a/src/uu/cksum/src/cksum.rs b/src/uu/cksum/src/cksum.rs index e88cc78b3..a5beec368 100644 --- a/src/uu/cksum/src/cksum.rs +++ b/src/uu/cksum/src/cksum.rs @@ -213,7 +213,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .about(SUMMARY) diff --git a/src/uu/comm/src/comm.rs b/src/uu/comm/src/comm.rs index aa10432a2..56af42fd9 100644 --- a/src/uu/comm/src/comm.rs +++ b/src/uu/comm/src/comm.rs @@ -7,9 +7,6 @@ // spell-checker:ignore (ToDO) delim mkdelim -#[macro_use] -extern crate uucore; - use std::cmp::Ordering; use std::fs::File; use std::io::{self, stdin, BufRead, BufReader, Stdin}; @@ -31,8 +28,8 @@ mod options { pub const FILE_2: &str = "FILE2"; } -fn get_usage() -> String { - format!("{} [OPTION]... FILE1 FILE2", executable!()) +fn usage() -> String { + format!("{} [OPTION]... FILE1 FILE2", uucore::execution_phrase()) } fn mkdelim(col: usize, opts: &ArgMatches) -> String { @@ -132,7 +129,7 @@ fn open_file(name: &str) -> io::Result { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let args = args .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); @@ -148,7 +145,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help(LONG_HELP) diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 640e27c33..9a80b18ab 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -99,7 +99,7 @@ quick_error! { NotImplemented(opt: String) { display("Option '{}' not yet implemented.", opt) } /// Invalid arguments to backup - Backup(description: String) { display("{}\nTry 'cp --help' for more information.", description) } + Backup(description: String) { display("{}\nTry '{} --help' for more information.", description, uucore::execution_phrase()) } } } @@ -218,12 +218,12 @@ static LONG_HELP: &str = ""; static EXIT_OK: i32 = 0; static EXIT_ERR: i32 = 1; -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... [-T] SOURCE DEST {0} [OPTION]... SOURCE... DIRECTORY {0} [OPTION]... -t DIRECTORY SOURCE...", - executable!() + uucore::execution_phrase() ) } @@ -293,7 +293,7 @@ static DEFAULT_ATTRIBUTES: &[Attribute] = &[ ]; pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg(Arg::with_name(options::TARGET_DIRECTORY) @@ -465,7 +465,7 @@ pub fn uu_app() -> App<'static, 'static> { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app() .after_help(&*format!( "{}\n{}", @@ -1060,7 +1060,7 @@ impl OverwriteMode { match *self { OverwriteMode::NoClobber => Err(Error::NotAllFilesCopied), OverwriteMode::Interactive(_) => { - if prompt_yes!("{}: overwrite {}? ", executable!(), path.display()) { + if prompt_yes!("{}: overwrite {}? ", uucore::util_name(), path.display()) { Ok(()) } else { Err(Error::Skipped(format!( diff --git a/src/uu/csplit/src/csplit.rs b/src/uu/csplit/src/csplit.rs index 048ec80d8..9e93bbe42 100644 --- a/src/uu/csplit/src/csplit.rs +++ b/src/uu/csplit/src/csplit.rs @@ -34,8 +34,11 @@ mod options { pub const PATTERN: &str = "pattern"; } -fn get_usage() -> String { - format!("{0} [OPTION]... FILE PATTERN...", executable!()) +fn usage() -> String { + format!( + "{0} [OPTION]... FILE PATTERN...", + uucore::execution_phrase() + ) } /// Command line options for csplit. @@ -706,7 +709,7 @@ mod tests { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let args = args .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); @@ -739,7 +742,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(SUMMARY) .arg( diff --git a/src/uu/cut/src/cut.rs b/src/uu/cut/src/cut.rs index e33b8a2fe..783502e3d 100644 --- a/src/uu/cut/src/cut.rs +++ b/src/uu/cut/src/cut.rs @@ -548,7 +548,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(SYNTAX) diff --git a/src/uu/date/src/date.rs b/src/uu/date/src/date.rs index 042daa616..7bf6298c0 100644 --- a/src/uu/date/src/date.rs +++ b/src/uu/date/src/date.rs @@ -8,9 +8,6 @@ // spell-checker:ignore (chrono) Datelike Timelike ; (format) DATEFILE MMDDhhmm ; (vars) datetime datetimes -#[macro_use] -extern crate uucore; - use chrono::{DateTime, FixedOffset, Local, Offset, Utc}; #[cfg(windows)] use chrono::{Datelike, Timelike}; @@ -253,7 +250,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index 6be986649..9f1d28714 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -7,8 +7,6 @@ // spell-checker:ignore fname, tname, fpath, specfile, testfile, unspec, ifile, ofile, outfile, fullblock, urand, fileio, atoe, atoibm, behaviour, bmax, bremain, btotal, cflags, creat, ctable, ctty, datastructures, doesnt, etoa, fileout, fname, gnudd, iconvflags, nocache, noctty, noerror, nofollow, nolinks, nonblock, oconvflags, outfile, parseargs, rlen, rmax, rposition, rremain, rsofar, rstat, sigusr, sigval, wlen, wstat -#[macro_use] -extern crate uucore; use uucore::InvalidEncodingHandling; #[cfg(test)] @@ -956,7 +954,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> clap::App<'static, 'static> { - clap::App::new(executable!()) + clap::App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/df/src/df.rs b/src/uu/df/src/df.rs index cdfdf0b2d..e7f3944a0 100644 --- a/src/uu/df/src/df.rs +++ b/src/uu/df/src/df.rs @@ -79,8 +79,8 @@ struct Filesystem { usage: FsUsage, } -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]...", uucore::execution_phrase()) } impl FsSelector { @@ -284,7 +284,7 @@ impl UError for DfError { #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); let paths: Vec = matches @@ -295,7 +295,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { #[cfg(windows)] { if matches.is_present(OPT_INODES) { - println!("{}: doesn't support -i option", executable!()); + println!("{}: doesn't support -i option", uucore::util_name()); return Ok(()); } } @@ -427,7 +427,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/dircolors/src/dircolors.rs b/src/uu/dircolors/src/dircolors.rs index 70b609e31..2b9c25ba3 100644 --- a/src/uu/dircolors/src/dircolors.rs +++ b/src/uu/dircolors/src/dircolors.rs @@ -62,8 +62,8 @@ pub fn guess_syntax() -> OutputFmt { } } -fn get_usage() -> String { - format!("{0} {1}", executable!(), SYNTAX) +fn usage() -> String { + format!("{0} {1}", uucore::execution_phrase(), SYNTAX) } pub fn uumain(args: impl uucore::Args) -> i32 { @@ -71,7 +71,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(&args); @@ -153,7 +153,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(SUMMARY) .after_help(LONG_HELP) diff --git a/src/uu/dirname/src/dirname.rs b/src/uu/dirname/src/dirname.rs index e7dcc2195..3e91d598a 100644 --- a/src/uu/dirname/src/dirname.rs +++ b/src/uu/dirname/src/dirname.rs @@ -20,8 +20,8 @@ mod options { pub const DIR: &str = "dir"; } -fn get_usage() -> String { - format!("{0} [OPTION] NAME...", executable!()) +fn usage() -> String { + format!("{0} [OPTION] NAME...", uucore::execution_phrase()) } fn get_long_usage() -> String { @@ -37,7 +37,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - let usage = get_usage(); + let usage = usage(); let after_help = get_long_usage(); let matches = uu_app() @@ -86,7 +86,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .about(ABOUT) .version(crate_version!()) .arg( diff --git a/src/uu/du/src/du.rs b/src/uu/du/src/du.rs index d85cc941c..258d58bae 100644 --- a/src/uu/du/src/du.rs +++ b/src/uu/du/src/du.rs @@ -70,7 +70,6 @@ mod options { pub const FILE: &str = "FILE"; } -const NAME: &str = "du"; const SUMMARY: &str = "estimate file space usage"; const LONG_HELP: &str = " Display values are in units of the first available SIZE from --block-size, @@ -87,7 +86,7 @@ const UNITS: [(char, u32); 6] = [('E', 6), ('P', 5), ('T', 4), ('G', 3), ('M', 2 struct Options { all: bool, - program_name: String, + util_name: String, max_depth: Option, total: bool, separate_dirs: bool, @@ -295,7 +294,7 @@ fn du( safe_writeln!( stderr(), "{}: cannot read directory '{}': {}", - options.program_name, + options.util_name, my_stat.path.display(), e ); @@ -393,11 +392,11 @@ fn convert_size_other(size: u64, _multiplier: u64, block_size: u64) -> String { format!("{}", ((size as f64) / (block_size as f64)).ceil()) } -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... [FILE]... {0} [OPTION]... --files0-from=F", - executable!() + uucore::execution_phrase() ) } @@ -424,7 +423,8 @@ Valid arguments are: - 'long-iso' - 'iso' Try '{} --help' for more information.", - s, NAME + s, + uucore::execution_phrase() ), DuError::InvalidTimeArg(s) => write!( f, @@ -456,7 +456,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -466,7 +466,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let options = Options { all: matches.is_present(options::ALL), - program_name: NAME.to_owned(), + util_name: uucore::util_name(), max_depth, total: matches.is_present(options::TOTAL), separate_dirs: matches.is_present(options::SEPARATE_DIRS), @@ -625,7 +625,7 @@ fn parse_depth(max_depth_str: Option<&str>, summarize: bool) -> UResult App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(SUMMARY) .after_help(LONG_HELP) diff --git a/src/uu/echo/src/echo.rs b/src/uu/echo/src/echo.rs index aae1ad10d..601fd8d48 100644 --- a/src/uu/echo/src/echo.rs +++ b/src/uu/echo/src/echo.rs @@ -132,7 +132,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) // TrailingVarArg specifies the final positional argument is a VarArg // and it doesn't attempts the parse any further args. diff --git a/src/uu/expand/src/expand.rs b/src/uu/expand/src/expand.rs index d5c37ce21..04cb42649 100644 --- a/src/uu/expand/src/expand.rs +++ b/src/uu/expand/src/expand.rs @@ -32,8 +32,8 @@ static LONG_HELP: &str = ""; static DEFAULT_TABSTOP: usize = 8; -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]...", uucore::execution_phrase()) } /// The mode to use when replacing tabs beyond the last one specified in @@ -170,7 +170,7 @@ impl Options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); expand(Options::new(&matches)); @@ -178,7 +178,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help(LONG_HELP) diff --git a/src/uu/expr/src/expr.rs b/src/uu/expr/src/expr.rs index 92c15565d..2d82300ff 100644 --- a/src/uu/expr/src/expr.rs +++ b/src/uu/expr/src/expr.rs @@ -18,7 +18,7 @@ const VERSION: &str = "version"; const HELP: &str = "help"; pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .arg(Arg::with_name(VERSION).long(VERSION)) .arg(Arg::with_name(HELP).long(HELP)) } @@ -140,5 +140,5 @@ Environment variables: } fn print_version() { - println!("{} {}", executable!(), crate_version!()); + println!("{} {}", uucore::util_name(), crate_version!()); } diff --git a/src/uu/factor/src/cli.rs b/src/uu/factor/src/cli.rs index 7963f162f..95b8bb866 100644 --- a/src/uu/factor/src/cli.rs +++ b/src/uu/factor/src/cli.rs @@ -75,7 +75,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(SUMMARY) .arg(Arg::with_name(options::NUMBER).multiple(true)) diff --git a/src/uu/false/src/false.rs b/src/uu/false/src/false.rs index 170788898..88ec1af06 100644 --- a/src/uu/false/src/false.rs +++ b/src/uu/false/src/false.rs @@ -9,7 +9,7 @@ extern crate uucore; use clap::App; -use uucore::{error::UResult, executable}; +use uucore::error::UResult; #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { @@ -18,5 +18,5 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) } diff --git a/src/uu/fmt/src/fmt.rs b/src/uu/fmt/src/fmt.rs index 8c2c8d9d9..5203745a1 100644 --- a/src/uu/fmt/src/fmt.rs +++ b/src/uu/fmt/src/fmt.rs @@ -50,8 +50,8 @@ static OPT_TAB_WIDTH: &str = "tab-width"; static ARG_FILES: &str = "files"; -fn get_usage() -> String { - format!("{} [OPTION]... [FILE]...", executable!()) +fn usage() -> String { + format!("{} [OPTION]... [FILE]...", uucore::execution_phrase()) } pub type FileOrStdReader = BufReader>; @@ -75,7 +75,7 @@ pub struct FmtOptions { #[allow(clippy::cognitive_complexity)] pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -211,7 +211,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/fold/src/fold.rs b/src/uu/fold/src/fold.rs index 1dbc8cdc7..c5628125d 100644 --- a/src/uu/fold/src/fold.rs +++ b/src/uu/fold/src/fold.rs @@ -64,7 +64,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(SYNTAX) diff --git a/src/uu/groups/src/groups.rs b/src/uu/groups/src/groups.rs index a40d1a490..c2af5c4b0 100644 --- a/src/uu/groups/src/groups.rs +++ b/src/uu/groups/src/groups.rs @@ -28,12 +28,12 @@ static ABOUT: &str = "Print group memberships for each USERNAME or, \ if no USERNAME is specified, for\nthe current process \ (which may differ if the groups data‐base has changed)."; -fn get_usage() -> String { - format!("{0} [OPTION]... [USERNAME]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [USERNAME]...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -85,7 +85,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/hashsum/src/hashsum.rs b/src/uu/hashsum/src/hashsum.rs index d9feb6648..77cc0d558 100644 --- a/src/uu/hashsum/src/hashsum.rs +++ b/src/uu/hashsum/src/hashsum.rs @@ -342,7 +342,7 @@ pub fn uu_app_common() -> App<'static, 'static> { const TEXT_HELP: &str = "read in text mode"; #[cfg(not(windows))] const TEXT_HELP: &str = "read in text mode (default)"; - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about("Compute and check message digests.") .arg( diff --git a/src/uu/head/src/head.rs b/src/uu/head/src/head.rs index e17e17034..e47488ac4 100644 --- a/src/uu/head/src/head.rs +++ b/src/uu/head/src/head.rs @@ -9,7 +9,7 @@ use clap::{crate_version, App, Arg}; use std::convert::TryFrom; use std::ffi::OsString; use std::io::{self, ErrorKind, Read, Seek, SeekFrom, Write}; -use uucore::{crash, executable, show_error, show_error_custom_description}; +use uucore::{crash, show_error_custom_description}; const EXIT_FAILURE: i32 = 1; const EXIT_SUCCESS: i32 = 0; @@ -41,7 +41,7 @@ use lines::zlines; use take::take_all_but; pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .usage(USAGE) diff --git a/src/uu/hostid/src/hostid.rs b/src/uu/hostid/src/hostid.rs index b0f68968d..4c9cafa35 100644 --- a/src/uu/hostid/src/hostid.rs +++ b/src/uu/hostid/src/hostid.rs @@ -29,7 +29,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .usage(SYNTAX) } diff --git a/src/uu/hostname/src/hostname.rs b/src/uu/hostname/src/hostname.rs index 045e43045..8852e0f43 100644 --- a/src/uu/hostname/src/hostname.rs +++ b/src/uu/hostname/src/hostname.rs @@ -53,11 +53,12 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { result } -fn get_usage() -> String { - format!("{0} [OPTION]... [HOSTNAME]", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [HOSTNAME]", uucore::execution_phrase()) } + fn execute(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); match matches.value_of(OPT_HOST) { @@ -73,7 +74,7 @@ fn execute(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/id/src/id.rs b/src/uu/id/src/id.rs index 16c665273..4e8e30e52 100644 --- a/src/uu/id/src/id.rs +++ b/src/uu/id/src/id.rs @@ -76,8 +76,8 @@ mod options { pub const ARG_USERS: &str = "USER"; } -fn get_usage() -> String { - format!("{0} [OPTION]... [USER]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [USER]...", uucore::execution_phrase()) } fn get_description() -> String { @@ -127,7 +127,7 @@ struct State { #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); let after_help = get_description(); let matches = uu_app() @@ -347,7 +347,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/install/src/install.rs b/src/uu/install/src/install.rs index cbbe9c18b..5c951ad5b 100644 --- a/src/uu/install/src/install.rs +++ b/src/uu/install/src/install.rs @@ -86,11 +86,13 @@ impl Display for InstallError { use InstallError as IE; match self { IE::Unimplemented(opt) => write!(f, "Unimplemented feature: {}", opt), - IE::DirNeedsArg() => write!( - f, - "{} with -d requires at least one argument.", - executable!() - ), + IE::DirNeedsArg() => { + write!( + f, + "{} with -d requires at least one argument.", + uucore::util_name() + ) + } IE::CreateDirFailed(dir, e) => { Display::fmt(&uio_error!(e, "failed to create {}", dir.display()), f) } @@ -172,8 +174,8 @@ static OPT_CONTEXT: &str = "context"; static ARG_FILES: &str = "files"; -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]...", uucore::execution_phrase()) } /// Main install utility function, called from main.rs. @@ -182,7 +184,7 @@ fn get_usage() -> String { /// #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -202,7 +204,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/kill/src/kill.rs b/src/uu/kill/src/kill.rs index b3f5010ca..47bd97dbc 100644 --- a/src/uu/kill/src/kill.rs +++ b/src/uu/kill/src/kill.rs @@ -41,7 +41,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .accept_any(); let (args, obs_signal) = handle_obsolete(args); - let usage = format!("{} [OPTIONS]... PID...", executable!()); + let usage = format!("{} [OPTIONS]... PID...", uucore::execution_phrase()); let matches = uu_app().usage(&usage[..]).get_matches_from(args); let mode = if matches.is_present(options::TABLE) || matches.is_present(options::TABLE_OLD) { @@ -76,7 +76,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/link/src/link.rs b/src/uu/link/src/link.rs index ad7702044..73e81b107 100644 --- a/src/uu/link/src/link.rs +++ b/src/uu/link/src/link.rs @@ -19,8 +19,8 @@ pub mod options { pub static FILES: &str = "FILES"; } -fn get_usage() -> String { - format!("{0} FILE1 FILE2", executable!()) +fn usage() -> String { + format!("{0} FILE1 FILE2", uucore::execution_phrase()) } pub fn normalize_error_message(e: Error) -> String { @@ -31,7 +31,7 @@ pub fn normalize_error_message(e: Error) -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); let files: Vec<_> = matches @@ -51,7 +51,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/ln/src/ln.rs b/src/uu/ln/src/ln.rs index e4b718ed1..f1689a44b 100644 --- a/src/uu/ln/src/ln.rs +++ b/src/uu/ln/src/ln.rs @@ -70,7 +70,7 @@ impl Display for LnError { f, "extra operand '{}'\nTry '{} --help' for more information.", s, - executable!() + uucore::execution_phrase() ), Self::InvalidBackupMode(s) => write!(f, "{}", s), } @@ -92,17 +92,17 @@ impl UError for LnError { } } -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... [-T] TARGET LINK_NAME (1st form) {0} [OPTION]... TARGET (2nd form) {0} [OPTION]... TARGET... DIRECTORY (3rd form) {0} [OPTION]... -t DIRECTORY TARGET... (4th form)", - executable!() + uucore::execution_phrase() ) } -fn get_long_usage() -> String { +fn long_usage() -> String { String::from( " In the 1st form, create a link to TARGET with the name LINK_NAME. In the 2nd form, create a link to TARGET in the current directory. @@ -136,8 +136,8 @@ static ARG_FILES: &str = "files"; #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); - let long_usage = get_long_usage(); + let usage = usage(); + let long_usage = long_usage(); let matches = uu_app() .usage(&usage[..]) @@ -196,7 +196,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( @@ -435,7 +435,7 @@ fn link(src: &Path, dst: &Path, settings: &Settings) -> Result<()> { match settings.overwrite { OverwriteMode::NoClobber => {} OverwriteMode::Interactive => { - print!("{}: overwrite '{}'? ", executable!(), dst.display()); + print!("{}: overwrite '{}'? ", uucore::util_name(), dst.display()); if !read_yes() { return Ok(()); } diff --git a/src/uu/logname/src/logname.rs b/src/uu/logname/src/logname.rs index 4a6f43418..f8dd3fc5d 100644 --- a/src/uu/logname/src/logname.rs +++ b/src/uu/logname/src/logname.rs @@ -35,8 +35,8 @@ fn get_userlogin() -> Option { static SUMMARY: &str = "Print user's login name"; -fn get_usage() -> String { - String::from(executable!()) +fn usage() -> String { + uucore::execution_phrase() } pub fn uumain(args: impl uucore::Args) -> i32 { @@ -44,7 +44,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let _ = uu_app().usage(&usage[..]).get_matches_from(args); match get_userlogin() { @@ -56,7 +56,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(SUMMARY) } diff --git a/src/uu/ls/src/ls.rs b/src/uu/ls/src/ls.rs index 450acf8cd..da8955152 100644 --- a/src/uu/ls/src/ls.rs +++ b/src/uu/ls/src/ls.rs @@ -46,8 +46,8 @@ use unicode_width::UnicodeWidthStr; use uucore::libc::{S_IXGRP, S_IXOTH, S_IXUSR}; use uucore::{fs::display_permissions, version_cmp::version_cmp}; -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]...", uucore::execution_phrase()) } pub mod options { @@ -603,7 +603,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let app = uu_app().usage(&usage[..]); @@ -618,7 +618,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about( "By default, ls will list the files and contents of any directories on \ diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index a99867570..848f79988 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -22,13 +22,13 @@ mod options { pub const DIRS: &str = "dirs"; } -fn get_usage() -> String { - format!("{0} [OPTION]... [USER]", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [USER]", uucore::execution_phrase()) } #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); // Linux-specific options, not implemented // opts.optflag("Z", "context", "set SELinux security context" + @@ -51,7 +51,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( @@ -103,7 +103,11 @@ fn mkdir(path: &Path, recursive: bool, mode: u16, verbose: bool) -> UResult<()> create_dir(path).map_err_context(|| format!("cannot create directory '{}'", path.display()))?; if verbose { - println!("{}: created directory '{}'", executable!(), path.display()); + println!( + "{}: created directory '{}'", + uucore::util_name(), + path.display() + ); } chmod(path, mode) diff --git a/src/uu/mkfifo/src/mkfifo.rs b/src/uu/mkfifo/src/mkfifo.rs index ea0906567..009675811 100644 --- a/src/uu/mkfifo/src/mkfifo.rs +++ b/src/uu/mkfifo/src/mkfifo.rs @@ -70,7 +70,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(USAGE) diff --git a/src/uu/mknod/src/mknod.rs b/src/uu/mknod/src/mknod.rs index 8cc7db908..f8fb9c469 100644 --- a/src/uu/mknod/src/mknod.rs +++ b/src/uu/mknod/src/mknod.rs @@ -18,7 +18,6 @@ use libc::{S_IFBLK, S_IFCHR, S_IFIFO, S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOT use uucore::InvalidEncodingHandling; -static NAME: &str = "mknod"; static ABOUT: &str = "Create the special file NAME of the given TYPE."; static USAGE: &str = "mknod [OPTION]... NAME TYPE [MAJOR MINOR]"; static LONG_HELP: &str = "Mandatory arguments to long options are mandatory for short options too. @@ -72,7 +71,8 @@ fn _mknod(file_name: &str, mode: mode_t, dev: dev_t) -> i32 { } if errno == -1 { - let c_str = CString::new(NAME).expect("Failed to convert to CString"); + let c_str = CString::new(uucore::execution_phrase().as_bytes()) + .expect("Failed to convert to CString"); // shows the error from the mknod syscall libc::perror(c_str.as_ptr()); } @@ -113,7 +113,10 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if ch == 'p' { if matches.is_present("major") || matches.is_present("minor") { eprintln!("Fifos do not have major and minor device numbers."); - eprintln!("Try '{} --help' for more information.", NAME); + eprintln!( + "Try '{} --help' for more information.", + uucore::execution_phrase() + ); 1 } else { _mknod(file_name, S_IFIFO | mode, 0) @@ -122,7 +125,10 @@ pub fn uumain(args: impl uucore::Args) -> i32 { match (matches.value_of("major"), matches.value_of("minor")) { (None, None) | (_, None) | (None, _) => { eprintln!("Special files require major and minor device numbers."); - eprintln!("Try '{} --help' for more information.", NAME); + eprintln!( + "Try '{} --help' for more information.", + uucore::execution_phrase() + ); 1 } (Some(major), Some(minor)) => { @@ -145,7 +151,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .usage(USAGE) .after_help(LONG_HELP) diff --git a/src/uu/mktemp/src/mktemp.rs b/src/uu/mktemp/src/mktemp.rs index e1dd604a0..0b30f0087 100644 --- a/src/uu/mktemp/src/mktemp.rs +++ b/src/uu/mktemp/src/mktemp.rs @@ -36,8 +36,8 @@ static OPT_T: &str = "t"; static ARG_TEMPLATE: &str = "template"; -fn get_usage() -> String { - format!("{0} [OPTION]... [TEMPLATE]", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [TEMPLATE]", uucore::execution_phrase()) } #[derive(Debug)] @@ -74,7 +74,7 @@ impl Display for MkTempError { #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -134,7 +134,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/more/src/more.rs b/src/uu/more/src/more.rs index ecc779ba6..8097d1402 100644 --- a/src/uu/more/src/more.rs +++ b/src/uu/more/src/more.rs @@ -93,7 +93,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .about("A file perusal filter for CRT viewing.") .version(crate_version!()) .arg( diff --git a/src/uu/mv/src/mv.rs b/src/uu/mv/src/mv.rs index 166e8cb1a..5f825113b 100644 --- a/src/uu/mv/src/mv.rs +++ b/src/uu/mv/src/mv.rs @@ -58,17 +58,17 @@ static OPT_VERBOSE: &str = "verbose"; static ARG_FILES: &str = "files"; -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... [-T] SOURCE DEST {0} [OPTION]... SOURCE... DIRECTORY {0} [OPTION]... -t DIRECTORY SOURCE...", - executable!() + uucore::execution_phrase() ) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app() .after_help(&*format!( @@ -133,7 +133,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( @@ -296,7 +296,7 @@ fn exec(files: &[PathBuf], b: Behavior) -> i32 { "mv: extra operand '{}'\n\ Try '{} --help' for more information.", files[2].display(), - executable!() + uucore::execution_phrase() ); return 1; } @@ -353,7 +353,7 @@ fn rename(from: &Path, to: &Path, b: &Behavior) -> io::Result<()> { match b.overwrite { OverwriteMode::NoClobber => return Ok(()), OverwriteMode::Interactive => { - println!("{}: overwrite '{}'? ", executable!(), to.display()); + println!("{}: overwrite '{}'? ", uucore::util_name(), to.display()); if !read_yes() { return Ok(()); } diff --git a/src/uu/nice/src/nice.rs b/src/uu/nice/src/nice.rs index 49efe32e0..fbc2be0e5 100644 --- a/src/uu/nice/src/nice.rs +++ b/src/uu/nice/src/nice.rs @@ -22,7 +22,7 @@ pub mod options { pub static COMMAND: &str = "COMMAND"; } -fn get_usage() -> String { +fn usage() -> String { format!( " {0} [OPTIONS] [COMMAND [ARGS]] @@ -31,12 +31,12 @@ Run COMMAND with an adjusted niceness, which affects process scheduling. With no COMMAND, print the current niceness. Niceness values range from at least -20 (most favorable to the process) to 19 (least favorable to the process).", - executable!() + uucore::execution_phrase() ) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -53,8 +53,8 @@ pub fn uumain(args: impl uucore::Args) -> i32 { Some(nstr) => { if !matches.is_present(options::COMMAND) { show_error!( - "A command must be given with an adjustment.\nTry \"{} --help\" for more information.", - executable!() + "A command must be given with an adjustment.\nTry '{} --help' for more information.", + uucore::execution_phrase() ); return 125; } @@ -101,7 +101,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .setting(AppSettings::TrailingVarArg) .version(crate_version!()) .arg( diff --git a/src/uu/nl/src/nl.rs b/src/uu/nl/src/nl.rs index 81e76aa26..600ebace0 100644 --- a/src/uu/nl/src/nl.rs +++ b/src/uu/nl/src/nl.rs @@ -143,7 +143,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(USAGE) diff --git a/src/uu/nohup/src/nohup.rs b/src/uu/nohup/src/nohup.rs index acc101e4e..1ecb9914f 100644 --- a/src/uu/nohup/src/nohup.rs +++ b/src/uu/nohup/src/nohup.rs @@ -40,7 +40,7 @@ mod options { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let args = args .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); @@ -71,7 +71,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help(LONG_HELP) @@ -156,8 +156,11 @@ fn find_stdout() -> File { } } -fn get_usage() -> String { - format!("{0} COMMAND [ARG]...\n {0} FLAG", executable!()) +fn usage() -> String { + format!( + "{0} COMMAND [ARG]...\n {0} FLAG", + uucore::execution_phrase() + ) } #[cfg(target_vendor = "apple")] diff --git a/src/uu/nproc/src/nproc.rs b/src/uu/nproc/src/nproc.rs index 1f284685b..16b8d8c3a 100644 --- a/src/uu/nproc/src/nproc.rs +++ b/src/uu/nproc/src/nproc.rs @@ -27,12 +27,12 @@ static OPT_IGNORE: &str = "ignore"; static ABOUT: &str = "Print the number of cores available to the current process."; -fn get_usage() -> String { - format!("{0} [OPTIONS]...", executable!()) +fn usage() -> String { + format!("{0} [OPTIONS]...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); let mut ignore = match matches.value_of(OPT_IGNORE) { @@ -70,7 +70,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/numfmt/src/numfmt.rs b/src/uu/numfmt/src/numfmt.rs index 01f12c51b..1798975dc 100644 --- a/src/uu/numfmt/src/numfmt.rs +++ b/src/uu/numfmt/src/numfmt.rs @@ -50,8 +50,8 @@ FIELDS supports cut(1) style field ranges: Multiple fields/ranges can be separated with commas "; -fn get_usage() -> String { - format!("{0} [OPTION]... [NUMBER]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [NUMBER]...", uucore::execution_phrase()) } fn handle_args<'a>(args: impl Iterator, options: NumfmtOptions) -> Result<()> { @@ -154,7 +154,7 @@ fn parse_options(args: &ArgMatches) -> Result { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -175,7 +175,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help(LONG_HELP) diff --git a/src/uu/od/src/multifilereader.rs b/src/uu/od/src/multifilereader.rs index 1255da66d..2f44da803 100644 --- a/src/uu/od/src/multifilereader.rs +++ b/src/uu/od/src/multifilereader.rs @@ -57,12 +57,7 @@ impl<'b> MultifileReader<'b> { // print an error at the time that the file is needed, // then move on the the next file. // This matches the behavior of the original `od` - eprintln!( - "{}: '{}': {}", - executable!().split("::").next().unwrap(), // remove module - fname, - e - ); + eprintln!("{}: '{}': {}", uucore::util_name(), fname, e); self.any_err = true } } @@ -95,11 +90,7 @@ impl<'b> io::Read for MultifileReader<'b> { Ok(0) => break, Ok(n) => n, Err(e) => { - eprintln!( - "{}: I/O: {}", - executable!().split("::").next().unwrap(), // remove module - e - ); + eprintln!("{}: I/O: {}", uucore::util_name(), e); self.any_err = true; break; } diff --git a/src/uu/od/src/od.rs b/src/uu/od/src/od.rs index 359531d4e..6c1110362 100644 --- a/src/uu/od/src/od.rs +++ b/src/uu/od/src/od.rs @@ -252,7 +252,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> clap::App<'static, 'static> { - clap::App::new(executable!()) + clap::App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .usage(USAGE) diff --git a/src/uu/paste/src/paste.rs b/src/uu/paste/src/paste.rs index 7f7969687..9ac5507df 100644 --- a/src/uu/paste/src/paste.rs +++ b/src/uu/paste/src/paste.rs @@ -52,7 +52,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/pathchk/src/pathchk.rs b/src/uu/pathchk/src/pathchk.rs index 7f728667f..863bb6bf2 100644 --- a/src/uu/pathchk/src/pathchk.rs +++ b/src/uu/pathchk/src/pathchk.rs @@ -25,7 +25,6 @@ enum Mode { Both, // a combination of `Basic` and `Extra` } -static NAME: &str = "pathchk"; static ABOUT: &str = "Check whether file names are valid or portable"; mod options { @@ -39,12 +38,12 @@ mod options { const POSIX_PATH_MAX: usize = 256; const POSIX_NAME_MAX: usize = 14; -fn get_usage() -> String { - format!("{0} [OPTION]... NAME...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... NAME...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let args = args .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); @@ -69,7 +68,10 @@ pub fn uumain(args: impl uucore::Args) -> i32 { // take necessary actions let paths = matches.values_of(options::PATH); let mut res = if paths.is_none() { - show_error!("missing operand\nTry {} --help for more information", NAME); + show_error!( + "missing operand\nTry '{} --help' for more information", + uucore::execution_phrase() + ); false } else { true @@ -96,7 +98,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/pinky/src/pinky.rs b/src/uu/pinky/src/pinky.rs index 16bcfd3c9..02573c994 100644 --- a/src/uu/pinky/src/pinky.rs +++ b/src/uu/pinky/src/pinky.rs @@ -40,8 +40,8 @@ mod options { pub const USER: &str = "user"; } -fn get_usage() -> String { - format!("{0} [OPTION]... [USER]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [USER]...", uucore::execution_phrase()) } fn get_long_usage() -> String { @@ -57,7 +57,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let after_help = get_long_usage(); let matches = uu_app() @@ -130,7 +130,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/pr/src/pr.rs b/src/uu/pr/src/pr.rs index d6b9e8ca3..1358cef6c 100644 --- a/src/uu/pr/src/pr.rs +++ b/src/uu/pr/src/pr.rs @@ -23,7 +23,6 @@ use std::fs::{metadata, File}; use std::io::{stdin, stdout, BufRead, BufReader, Lines, Read, Stdout, Write}; #[cfg(unix)] use std::os::unix::fs::FileTypeExt; -use uucore::executable; type IOError = std::io::Error; @@ -170,7 +169,7 @@ quick_error! { pub fn uu_app() -> clap::App<'static, 'static> { // TODO: migrate to clap to get more shell completions - clap::App::new(executable!()) + clap::App::new(uucore::util_name()) } pub fn uumain(args: impl uucore::Args) -> i32 { diff --git a/src/uu/printenv/src/printenv.rs b/src/uu/printenv/src/printenv.rs index 6e0ca7157..5d32cfbcc 100644 --- a/src/uu/printenv/src/printenv.rs +++ b/src/uu/printenv/src/printenv.rs @@ -7,9 +7,6 @@ /* last synced with: printenv (GNU coreutils) 8.13 */ -#[macro_use] -extern crate uucore; - use clap::{crate_version, App, Arg}; use std::env; @@ -19,12 +16,12 @@ static OPT_NULL: &str = "null"; static ARG_VARIABLES: &str = "variables"; -fn get_usage() -> String { - format!("{0} [VARIABLE]... [OPTION]...", executable!()) +fn usage() -> String { + format!("{0} [VARIABLE]... [OPTION]...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -55,7 +52,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/printf/src/printf.rs b/src/uu/printf/src/printf.rs index efa9aea57..d3c8dca90 100644 --- a/src/uu/printf/src/printf.rs +++ b/src/uu/printf/src/printf.rs @@ -2,9 +2,6 @@ // spell-checker:ignore (change!) each's // spell-checker:ignore (ToDO) LONGHELP FORMATSTRING templating parameterizing formatstr -#[macro_use] -extern crate uucore; - use clap::{crate_version, App, Arg}; use uucore::InvalidEncodingHandling; @@ -281,11 +278,11 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let location = &args[0]; if args.len() <= 1 { println!( - "{0}: missing operand\nTry '{0} --help' for more information.", - location + "{0}: missing operand\nTry '{1} --help' for more information.", + uucore::util_name(), + uucore::execution_phrase() ); return 1; } @@ -294,7 +291,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if formatstr == "--help" { print!("{} {}", LONGHELP_LEAD, LONGHELP_BODY); } else if formatstr == "--version" { - println!("{} {}", executable!(), crate_version!()); + println!("{} {}", uucore::util_name(), crate_version!()); } else { let printf_args = &args[2..]; memo::Memo::run_all(formatstr, printf_args); @@ -303,7 +300,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .arg(Arg::with_name(VERSION).long(VERSION)) .arg(Arg::with_name(HELP).long(HELP)) } diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index 01b14bc4d..264a37d72 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -659,7 +659,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(BRIEF) diff --git a/src/uu/pwd/src/pwd.rs b/src/uu/pwd/src/pwd.rs index 37effe618..75dc637e6 100644 --- a/src/uu/pwd/src/pwd.rs +++ b/src/uu/pwd/src/pwd.rs @@ -34,13 +34,13 @@ pub fn absolute_path(path: &Path) -> io::Result { Ok(path_buf) } -fn get_usage() -> String { - format!("{0} [OPTION]... FILE...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... FILE...", uucore::execution_phrase()) } #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -66,7 +66,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/readlink/src/readlink.rs b/src/uu/readlink/src/readlink.rs index f9885939a..1c62d8278 100644 --- a/src/uu/readlink/src/readlink.rs +++ b/src/uu/readlink/src/readlink.rs @@ -16,7 +16,6 @@ use std::io::{stdout, Write}; use std::path::{Path, PathBuf}; use uucore::fs::{canonicalize, MissingHandling, ResolveMode}; -const NAME: &str = "readlink"; const ABOUT: &str = "Print value of a symbolic link or canonical file name."; const OPT_CANONICALIZE: &str = "canonicalize"; const OPT_CANONICALIZE_MISSING: &str = "canonicalize-missing"; @@ -29,12 +28,12 @@ const OPT_ZERO: &str = "zero"; const ARG_FILES: &str = "files"; -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); let mut no_newline = matches.is_present(OPT_NO_NEWLINE); @@ -66,13 +65,16 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if files.is_empty() { crash!( 1, - "missing operand\nTry {} --help for more information", - NAME + "missing operand\nTry '{} --help' for more information", + uucore::execution_phrase() ); } if no_newline && files.len() > 1 && !silent { - eprintln!("{}: ignoring --no-newline with multiple arguments", NAME); + eprintln!( + "{}: ignoring --no-newline with multiple arguments", + uucore::util_name() + ); no_newline = false; } @@ -83,7 +85,12 @@ pub fn uumain(args: impl uucore::Args) -> i32 { Ok(path) => show(&path, no_newline, use_zero), Err(err) => { if verbose { - eprintln!("{}: {}: errno {}", NAME, f, err.raw_os_error().unwrap()); + eprintln!( + "{}: {}: errno {}", + uucore::util_name(), + f, + err.raw_os_error().unwrap() + ); } return 1; } @@ -93,7 +100,12 @@ pub fn uumain(args: impl uucore::Args) -> i32 { Ok(path) => show(&path, no_newline, use_zero), Err(err) => { if verbose { - eprintln!("{}: {}: errno {:?}", NAME, f, err.raw_os_error().unwrap()); + eprintln!( + "{}: {}: errno {:?}", + uucore::util_name(), + f, + err.raw_os_error().unwrap() + ); } return 1; } @@ -105,7 +117,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/realpath/src/realpath.rs b/src/uu/realpath/src/realpath.rs index 40cd94383..cbe1d40da 100644 --- a/src/uu/realpath/src/realpath.rs +++ b/src/uu/realpath/src/realpath.rs @@ -24,12 +24,12 @@ static OPT_LOGICAL: &str = "logical"; static ARG_FILES: &str = "files"; -fn get_usage() -> String { - format!("{0} [OPTION]... FILE...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... FILE...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -58,7 +58,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/relpath/src/relpath.rs b/src/uu/relpath/src/relpath.rs index 48d02414d..95f03e423 100644 --- a/src/uu/relpath/src/relpath.rs +++ b/src/uu/relpath/src/relpath.rs @@ -7,9 +7,6 @@ // spell-checker:ignore (ToDO) subpath absto absfrom absbase -#[macro_use] -extern crate uucore; - use clap::{crate_version, App, Arg}; use std::env; use std::path::{Path, PathBuf}; @@ -25,15 +22,15 @@ mod options { pub const FROM: &str = "FROM"; } -fn get_usage() -> String { - format!("{} [-d DIR] TO [FROM]", executable!()) +fn usage() -> String { + format!("{} [-d DIR] TO [FROM]", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { let args = args .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -82,7 +79,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/rm/src/rm.rs b/src/uu/rm/src/rm.rs index 259d1ab39..0613ff857 100644 --- a/src/uu/rm/src/rm.rs +++ b/src/uu/rm/src/rm.rs @@ -52,8 +52,8 @@ static OPT_VERBOSE: &str = "verbose"; static ARG_FILES: &str = "files"; -fn get_usage() -> String { - format!("{0} [OPTION]... FILE...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... FILE...", uucore::execution_phrase()) } fn get_long_usage() -> String { @@ -74,7 +74,7 @@ fn get_long_usage() -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let long_usage = get_long_usage(); let matches = uu_app() @@ -93,7 +93,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { // Still check by hand and not use clap // Because "rm -f" is a thing show_error!("missing an argument"); - show_error!("for help, try '{0} --help'", executable!()); + show_error!("for help, try '{0} --help'", uucore::execution_phrase()); return 1; } else { let options = Options { @@ -140,7 +140,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) diff --git a/src/uu/rmdir/src/rmdir.rs b/src/uu/rmdir/src/rmdir.rs index 8dbaf79a8..cafd8e982 100644 --- a/src/uu/rmdir/src/rmdir.rs +++ b/src/uu/rmdir/src/rmdir.rs @@ -26,12 +26,12 @@ static ENOTDIR: i32 = 20; #[cfg(windows)] static ENOTDIR: i32 = 267; -fn get_usage() -> String { - format!("{0} [OPTION]... DIRECTORY...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... DIRECTORY...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -53,7 +53,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/seq/src/seq.rs b/src/uu/seq/src/seq.rs index 50a93d3af..05388e7a1 100644 --- a/src/uu/seq/src/seq.rs +++ b/src/uu/seq/src/seq.rs @@ -22,12 +22,12 @@ static OPT_WIDTHS: &str = "widths"; static ARG_NUMBERS: &str = "numbers"; -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... LAST {0} [OPTION]... FIRST LAST {0} [OPTION]... FIRST INCREMENT LAST", - executable!() + uucore::execution_phrase() ) } #[derive(Clone)] @@ -72,13 +72,13 @@ impl FromStr for Number { Ok(value) if value.is_nan() => Err(format!( "invalid 'not-a-number' argument: '{}'\nTry '{} --help' for more information.", s, - executable!(), + uucore::execution_phrase(), )), Ok(value) => Ok(Number::F64(value)), Err(_) => Err(format!( "invalid floating point argument: '{}'\nTry '{} --help' for more information.", s, - executable!(), + uucore::execution_phrase(), )), }, } @@ -86,7 +86,7 @@ impl FromStr for Number { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); let numbers = matches.values_of(ARG_NUMBERS).unwrap().collect::>(); @@ -123,7 +123,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { show_error!( "invalid Zero increment value: '{}'\nTry '{} --help' for more information.", numbers[1], - executable!() + uucore::execution_phrase() ); return 1; } @@ -163,7 +163,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .setting(AppSettings::AllowLeadingHyphen) .version(crate_version!()) .about(ABOUT) diff --git a/src/uu/shred/src/shred.rs b/src/uu/shred/src/shred.rs index 856908de2..0464c5d50 100644 --- a/src/uu/shred/src/shred.rs +++ b/src/uu/shred/src/shred.rs @@ -214,8 +214,8 @@ static ABOUT: &str = "Overwrite the specified FILE(s) repeatedly, in order to ma for even very expensive hardware probing to recover the data. "; -fn get_usage() -> String { - format!("{} [OPTION]... FILE...", executable!()) +fn usage() -> String { + format!("{} [OPTION]... FILE...", uucore::execution_phrase()) } static AFTER_HELP: &str = @@ -271,7 +271,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let app = uu_app().usage(&usage[..]); @@ -331,7 +331,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help(AFTER_HELP) diff --git a/src/uu/shuf/src/shuf.rs b/src/uu/shuf/src/shuf.rs index f43e41338..7125014b1 100644 --- a/src/uu/shuf/src/shuf.rs +++ b/src/uu/shuf/src/shuf.rs @@ -115,7 +115,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .template(TEMPLATE) diff --git a/src/uu/sleep/src/sleep.rs b/src/uu/sleep/src/sleep.rs index 127804a9f..a70a524c4 100644 --- a/src/uu/sleep/src/sleep.rs +++ b/src/uu/sleep/src/sleep.rs @@ -26,17 +26,17 @@ mod options { pub const NUMBER: &str = "NUMBER"; } -fn get_usage() -> String { +fn usage() -> String { format!( "{0} {1}[SUFFIX]... \n {0} OPTION", - executable!(), + uucore::execution_phrase(), options::NUMBER ) } #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -49,7 +49,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help(LONG_HELP) diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index e0b445782..9aae23bb8 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -52,7 +52,6 @@ use uucore::InvalidEncodingHandling; use crate::tmp_dir::TmpDirWrapper; -const NAME: &str = "sort"; const ABOUT: &str = "Display sorted concatenation of all FILE(s)."; const LONG_HELP_KEYS: &str = "The key format is FIELD[.CHAR][OPTIONS][,FIELD[.CHAR]][OPTIONS]. @@ -1055,13 +1054,13 @@ impl FieldSelector { } } -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... [FILE]... Write the sorted concatenation of all FILE(s) to standard output. Mandatory arguments for long options are mandatory for short options too. With no FILE, or when FILE is -, read standard input.", - NAME + uucore::execution_phrase() ) } @@ -1081,7 +1080,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let args = args .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let mut settings: GlobalSettings = Default::default(); let matches = match uu_app().usage(&usage[..]).get_matches_from_safe(args) { @@ -1287,7 +1286,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index ccc98ee5e..070df81f6 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -21,8 +21,6 @@ use std::path::Path; use std::{char, fs::remove_file}; use uucore::parse_size::parse_size; -static NAME: &str = "split"; - static OPT_BYTES: &str = "bytes"; static OPT_LINE_BYTES: &str = "line-bytes"; static OPT_LINES: &str = "lines"; @@ -36,8 +34,11 @@ static OPT_VERBOSE: &str = "verbose"; static ARG_INPUT: &str = "input"; static ARG_PREFIX: &str = "prefix"; -fn get_usage() -> String { - format!("{0} [OPTION]... [INPUT [PREFIX]]", NAME) +fn usage() -> String { + format!( + "{0} [OPTION]... [INPUT [PREFIX]]", + uucore::execution_phrase() + ) } fn get_long_usage() -> String { format!( @@ -47,12 +48,12 @@ fn get_long_usage() -> String { Output fixed-size pieces of INPUT to PREFIXaa, PREFIX ab, ...; default size is 1000, and default PREFIX is 'x'. With no INPUT, or when INPUT is -, read standard input.", - get_usage() + usage() ) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let long_usage = get_long_usage(); let matches = uu_app() @@ -127,7 +128,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about("Create output files containing consecutive or interleaved sections of input") // strategy (mutually exclusive) diff --git a/src/uu/stat/src/stat.rs b/src/uu/stat/src/stat.rs index c56971f6b..d017999b4 100644 --- a/src/uu/stat/src/stat.rs +++ b/src/uu/stat/src/stat.rs @@ -882,8 +882,8 @@ impl Stater { } } -fn get_usage() -> String { - format!("{0} [OPTION]... FILE...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... FILE...", uucore::execution_phrase()) } fn get_long_usage() -> String { @@ -945,7 +945,7 @@ for details about the options it supports. } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let long_usage = get_long_usage(); let matches = uu_app() @@ -963,7 +963,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/stdbuf/src/stdbuf.rs b/src/uu/stdbuf/src/stdbuf.rs index 7460a2cb2..e87b3a225 100644 --- a/src/uu/stdbuf/src/stdbuf.rs +++ b/src/uu/stdbuf/src/stdbuf.rs @@ -47,8 +47,8 @@ mod options { pub const COMMAND: &str = "command"; } -fn get_usage() -> String { - format!("{0} OPTION... COMMAND", executable!()) +fn usage() -> String { + format!("{0} OPTION... COMMAND", uucore::execution_phrase()) } const STDBUF_INJECT: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/libstdbuf.so")); @@ -152,12 +152,18 @@ pub fn uumain(args: impl uucore::Args) -> i32 { let args = args .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); - let options = ProgramOptions::try_from(&matches) - .unwrap_or_else(|e| crash!(125, "{}\nTry 'stdbuf --help' for more information.", e.0)); + let options = ProgramOptions::try_from(&matches).unwrap_or_else(|e| { + crash!( + 125, + "{}\nTry '{} --help' for more information.", + e.0, + uucore::execution_phrase() + ) + }); let mut command_values = matches.values_of::<&str>(options::COMMAND).unwrap(); let mut command = Command::new(command_values.next().unwrap()); @@ -185,7 +191,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help(LONG_HELP) diff --git a/src/uu/sum/src/sum.rs b/src/uu/sum/src/sum.rs index 0ce612859..f1147ca2e 100644 --- a/src/uu/sum/src/sum.rs +++ b/src/uu/sum/src/sum.rs @@ -140,7 +140,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(USAGE) diff --git a/src/uu/sync/src/sync.rs b/src/uu/sync/src/sync.rs index 4fcdf49f9..f49f51728 100644 --- a/src/uu/sync/src/sync.rs +++ b/src/uu/sync/src/sync.rs @@ -159,12 +159,12 @@ mod platform { } } -fn get_usage() -> String { - format!("{0} [OPTION]... FILE...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... FILE...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -193,7 +193,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/tac/src/tac.rs b/src/uu/tac/src/tac.rs index 01cf09215..67b361a76 100644 --- a/src/uu/tac/src/tac.rs +++ b/src/uu/tac/src/tac.rs @@ -51,7 +51,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(USAGE) diff --git a/src/uu/tail/src/tail.rs b/src/uu/tail/src/tail.rs index 471c1a404..44f910ea0 100644 --- a/src/uu/tail/src/tail.rs +++ b/src/uu/tail/src/tail.rs @@ -213,7 +213,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about("output the last part of files") // TODO: add usage diff --git a/src/uu/tee/src/tee.rs b/src/uu/tee/src/tee.rs index a207dee63..d98835265 100644 --- a/src/uu/tee/src/tee.rs +++ b/src/uu/tee/src/tee.rs @@ -32,12 +32,12 @@ struct Options { files: Vec, } -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -57,7 +57,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .after_help("If a FILE is -, it refers to a file named - .") diff --git a/src/uu/test/src/test.rs b/src/uu/test/src/test.rs index bed1472e2..6eea00080 100644 --- a/src/uu/test/src/test.rs +++ b/src/uu/test/src/test.rs @@ -14,7 +14,6 @@ use clap::{crate_version, App, AppSettings}; use parser::{parse, Symbol}; use std::ffi::{OsStr, OsString}; use std::path::Path; -use uucore::executable; const USAGE: &str = "test EXPRESSION or: test @@ -87,7 +86,7 @@ the version described here. Please refer to your shell's documentation for details about the options it supports."; pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .setting(AppSettings::DisableHelpFlags) .setting(AppSettings::DisableVersion) } diff --git a/src/uu/timeout/src/timeout.rs b/src/uu/timeout/src/timeout.rs index 464414c5e..89fde82ca 100644 --- a/src/uu/timeout/src/timeout.rs +++ b/src/uu/timeout/src/timeout.rs @@ -22,8 +22,11 @@ use uucore::InvalidEncodingHandling; static ABOUT: &str = "Start COMMAND, and kill it if still running after DURATION."; -fn get_usage() -> String { - format!("{0} [OPTION] DURATION COMMAND...", executable!()) +fn usage() -> String { + format!( + "{0} [OPTION] DURATION COMMAND...", + uucore::execution_phrase() + ) } const ERR_EXIT_STATUS: i32 = 125; @@ -100,7 +103,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - let usage = get_usage(); + let usage = usage(); let app = uu_app().usage(&usage[..]); diff --git a/src/uu/touch/src/touch.rs b/src/uu/touch/src/touch.rs index 49efa676a..7c0903665 100644 --- a/src/uu/touch/src/touch.rs +++ b/src/uu/touch/src/touch.rs @@ -47,13 +47,13 @@ fn local_tm_to_filetime(tm: time::Tm) -> FileTime { FileTime::from_unix_time(ts.sec as i64, ts.nsec as u32) } -fn get_usage() -> String { - format!("{0} [OPTION]... [USER]", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [USER]", uucore::execution_phrase()) } #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -129,7 +129,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/tr/src/tr.rs b/src/uu/tr/src/tr.rs index 6dd81badf..d46318e38 100644 --- a/src/uu/tr/src/tr.rs +++ b/src/uu/tr/src/tr.rs @@ -228,8 +228,8 @@ fn translate_input( } } -fn get_usage() -> String { - format!("{} [OPTION]... SET1 [SET2]", executable!()) +fn usage() -> String { + format!("{} [OPTION]... SET1 [SET2]", uucore::execution_phrase()) } fn get_long_usage() -> String { @@ -243,7 +243,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - let usage = get_usage(); + let usage = usage(); let after_help = get_long_usage(); let matches = uu_app() @@ -263,17 +263,17 @@ pub fn uumain(args: impl uucore::Args) -> i32 { if sets.is_empty() { show_error!( - "missing operand\nTry `{} --help` for more information.", - executable!() + "missing operand\nTry '{} --help' for more information.", + uucore::execution_phrase() ); return 1; } if !(delete_flag || squeeze_flag) && sets.len() < 2 { show_error!( - "missing operand after '{}'\nTry `{} --help` for more information.", + "missing operand after '{}'\nTry '{} --help' for more information.", sets[0], - executable!() + uucore::execution_phrase() ); return 1; } @@ -312,7 +312,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/true/src/true.rs b/src/uu/true/src/true.rs index f84a89176..6b4a87bf1 100644 --- a/src/uu/true/src/true.rs +++ b/src/uu/true/src/true.rs @@ -10,7 +10,6 @@ extern crate uucore; use clap::App; use uucore::error::UResult; -use uucore::executable; #[uucore_procs::gen_uumain] pub fn uumain(args: impl uucore::Args) -> UResult<()> { @@ -19,5 +18,5 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) } diff --git a/src/uu/truncate/src/truncate.rs b/src/uu/truncate/src/truncate.rs index bb7aa61d4..062ef3811 100644 --- a/src/uu/truncate/src/truncate.rs +++ b/src/uu/truncate/src/truncate.rs @@ -63,8 +63,8 @@ pub mod options { pub static ARG_FILES: &str = "files"; } -fn get_usage() -> String { - format!("{0} [OPTION]... [FILE]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]... [FILE]...", uucore::execution_phrase()) } fn get_long_usage() -> String { @@ -90,7 +90,7 @@ fn get_long_usage() -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let long_usage = get_long_usage(); let matches = uu_app() @@ -133,7 +133,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/tsort/src/tsort.rs b/src/uu/tsort/src/tsort.rs index 0a323f837..c0ef66598 100644 --- a/src/uu/tsort/src/tsort.rs +++ b/src/uu/tsort/src/tsort.rs @@ -90,7 +90,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .usage(USAGE) .about(SUMMARY) diff --git a/src/uu/tty/src/tty.rs b/src/uu/tty/src/tty.rs index 7412cdf45..94e2e6b24 100644 --- a/src/uu/tty/src/tty.rs +++ b/src/uu/tty/src/tty.rs @@ -9,9 +9,6 @@ // spell-checker:ignore (ToDO) ttyname filedesc -#[macro_use] -extern crate uucore; - use clap::{crate_version, App, Arg}; use std::ffi::CStr; use std::io::Write; @@ -23,12 +20,12 @@ mod options { pub const SILENT: &str = "silent"; } -fn get_usage() -> String { - format!("{0} [OPTION]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let args = args .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); @@ -78,7 +75,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/uname/src/uname.rs b/src/uu/uname/src/uname.rs index abd50d1b8..5f8dfd8a8 100644 --- a/src/uu/uname/src/uname.rs +++ b/src/uu/uname/src/uname.rs @@ -50,7 +50,7 @@ const HOST_OS: &str = "Fuchsia"; const HOST_OS: &str = "Redox"; pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = format!("{} [OPTION]...", executable!()); + let usage = format!("{} [OPTION]...", uucore::execution_phrase()); let matches = uu_app().usage(&usage[..]).get_matches_from(args); let uname = return_if_err!(1, PlatformInfo::new()); @@ -119,7 +119,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg(Arg::with_name(options::ALL) diff --git a/src/uu/unexpand/src/unexpand.rs b/src/uu/unexpand/src/unexpand.rs index 50e3f186d..cb8541048 100644 --- a/src/uu/unexpand/src/unexpand.rs +++ b/src/uu/unexpand/src/unexpand.rs @@ -102,7 +102,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .name(NAME) .version(crate_version!()) .usage(USAGE) diff --git a/src/uu/uniq/src/uniq.rs b/src/uu/uniq/src/uniq.rs index 20639c850..5c3fa3b1e 100644 --- a/src/uu/uniq/src/uniq.rs +++ b/src/uu/uniq/src/uniq.rs @@ -221,8 +221,11 @@ fn opt_parsed(opt_name: &str, matches: &ArgMatches) -> Option { }) } -fn get_usage() -> String { - format!("{0} [OPTION]... [INPUT [OUTPUT]]...", executable!()) +fn usage() -> String { + format!( + "{0} [OPTION]... [INPUT [OUTPUT]]...", + uucore::execution_phrase() + ) } fn get_long_usage() -> String { @@ -235,7 +238,7 @@ fn get_long_usage() -> String { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let long_usage = get_long_usage(); let matches = uu_app() @@ -281,7 +284,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/unlink/src/unlink.rs b/src/uu/unlink/src/unlink.rs index 49f17cb12..c7fc00639 100644 --- a/src/uu/unlink/src/unlink.rs +++ b/src/uu/unlink/src/unlink.rs @@ -22,8 +22,8 @@ use uucore::InvalidEncodingHandling; static ABOUT: &str = "Unlink the file at [FILE]."; static OPT_PATH: &str = "FILE"; -fn get_usage() -> String { - format!("{} [OPTION]... FILE", executable!()) +fn usage() -> String { + format!("{} [OPTION]... FILE", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { @@ -31,7 +31,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::ConvertLossy) .accept_any(); - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -44,13 +44,13 @@ pub fn uumain(args: impl uucore::Args) -> i32 { crash!( 1, "missing operand\nTry '{0} --help' for more information.", - executable!() + uucore::execution_phrase() ); } else if paths.len() > 1 { crash!( 1, "extra operand: '{1}'\nTry '{0} --help' for more information.", - executable!(), + uucore::execution_phrase(), paths[1] ); } @@ -95,7 +95,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg(Arg::with_name(OPT_PATH).hidden(true).multiple(true)) diff --git a/src/uu/uptime/src/uptime.rs b/src/uu/uptime/src/uptime.rs index 35270093c..e58f398db 100644 --- a/src/uu/uptime/src/uptime.rs +++ b/src/uu/uptime/src/uptime.rs @@ -32,12 +32,12 @@ extern "C" { fn GetTickCount() -> uucore::libc::uint32_t; } -fn get_usage() -> String { - format!("{0} [OPTION]...", executable!()) +fn usage() -> String { + format!("{0} [OPTION]...", uucore::execution_phrase()) } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); let (boot_time, user_count) = process_utmpx(); @@ -64,7 +64,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/users/src/users.rs b/src/uu/users/src/users.rs index ef878497c..866093189 100644 --- a/src/uu/users/src/users.rs +++ b/src/uu/users/src/users.rs @@ -8,9 +8,6 @@ // spell-checker:ignore (paths) wtmp -#[macro_use] -extern crate uucore; - use clap::{crate_version, App, Arg}; use uucore::utmpx::{self, Utmpx}; @@ -18,8 +15,8 @@ static ABOUT: &str = "Print the user names of users currently logged in to the c static ARG_FILES: &str = "files"; -fn get_usage() -> String { - format!("{0} [FILE]", executable!()) +fn usage() -> String { + format!("{0} [FILE]", uucore::execution_phrase()) } fn get_long_usage() -> String { @@ -31,7 +28,7 @@ If FILE is not specified, use {}. /var/log/wtmp as FILE is common.", } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let after_help = get_long_usage(); let matches = uu_app() @@ -65,7 +62,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg(Arg::with_name(ARG_FILES).takes_value(true).max_values(1)) diff --git a/src/uu/wc/src/wc.rs b/src/uu/wc/src/wc.rs index ab14cb7d2..d77cd6b4b 100644 --- a/src/uu/wc/src/wc.rs +++ b/src/uu/wc/src/wc.rs @@ -95,11 +95,11 @@ pub mod options { static ARG_FILES: &str = "files"; -fn get_usage() -> String { +fn usage() -> String { format!( "{0} [OPTION]... [FILE]... With no FILE, or when FILE is -, read standard input.", - executable!() + uucore::execution_phrase() ) } @@ -132,7 +132,7 @@ impl Input { } pub fn uumain(args: impl uucore::Args) -> i32 { - let usage = get_usage(); + let usage = usage(); let matches = uu_app().usage(&usage[..]).get_matches_from(args); @@ -164,7 +164,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uu/who/src/who.rs b/src/uu/who/src/who.rs index 6a9c88710..b0ef7b3fa 100644 --- a/src/uu/who/src/who.rs +++ b/src/uu/who/src/who.rs @@ -44,8 +44,11 @@ static RUNLEVEL_HELP: &str = "print current runlevel"; #[cfg(not(target_os = "linux"))] static RUNLEVEL_HELP: &str = "print current runlevel (This is meaningless on non Linux)"; -fn get_usage() -> String { - format!("{0} [OPTION]... [ FILE | ARG1 ARG2 ]", executable!()) +fn usage() -> String { + format!( + "{0} [OPTION]... [ FILE | ARG1 ARG2 ]", + uucore::execution_phrase() + ) } fn get_long_usage() -> String { @@ -61,7 +64,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { .collect_str(InvalidEncodingHandling::Ignore) .accept_any(); - let usage = get_usage(); + let usage = usage(); let after_help = get_long_usage(); let matches = uu_app() @@ -160,7 +163,7 @@ pub fn uumain(args: impl uucore::Args) -> i32 { } pub fn uu_app() -> App<'static, 'static> { - App::new(executable!()) + App::new(uucore::util_name()) .version(crate_version!()) .about(ABOUT) .arg( diff --git a/src/uucore/src/lib/lib.rs b/src/uucore/src/lib/lib.rs index aa96a1086..6acd4e017 100644 --- a/src/uucore/src/lib/lib.rs +++ b/src/uucore/src/lib/lib.rs @@ -77,6 +77,47 @@ pub use crate::features::wide; //## core functions use std::ffi::OsString; +use std::sync::atomic::Ordering; + +pub fn get_utility_is_second_arg() -> bool { + crate::macros::UTILITY_IS_SECOND_ARG.load(Ordering::SeqCst) +} + +pub fn set_utility_is_second_arg() { + crate::macros::UTILITY_IS_SECOND_ARG.store(true, Ordering::SeqCst) +} + +/// Get the executable path (as `OsString`). +fn executable_os() -> OsString { + args_os().next().unwrap() +} + +/// Get the executable path (as `String`). +fn executable() -> String { + executable_os().to_string_lossy().into_owned() +} + +/// Derive the utility name. +pub fn util_name() -> String { + if get_utility_is_second_arg() { + args_os().nth(1).unwrap().to_string_lossy().into_owned() + } else { + executable() + } +} + +/// Derive the complete execution phrase for "usage". +pub fn execution_phrase() -> String { + if get_utility_is_second_arg() { + args_os() + .take(2) + .map(|os_str| os_str.to_string_lossy().into_owned()) + .collect::>() + .join(" ") + } else { + executable() + } +} pub enum InvalidEncodingHandling { Ignore, diff --git a/src/uucore/src/lib/macros.rs b/src/uucore/src/lib/macros.rs index 6e3a2166f..d16f04504 100644 --- a/src/uucore/src/lib/macros.rs +++ b/src/uucore/src/lib/macros.rs @@ -1,3 +1,5 @@ +use std::sync::atomic::AtomicBool; + // This file is part of the uutils coreutils package. // // (c) Alex Lyon @@ -5,31 +7,17 @@ // For the full copyright and license information, please view the LICENSE // file that was distributed with this source code. -/// Deduce the name of the binary from the current source code filename. -/// -/// e.g.: `src/uu/cp/src/cp.rs` -> `cp` -#[macro_export] -macro_rules! executable( - () => ({ - let module = module_path!(); - let module = module.split("::").next().unwrap_or(module); - if &module[0..3] == "uu_" { - &module[3..] - } else { - module - } - }) -); +/// Whether we were called as a multicall binary ("coreutils ") +pub static UTILITY_IS_SECOND_ARG: AtomicBool = AtomicBool::new(false); + +//==== #[macro_export] macro_rules! show( ($err:expr) => ({ let e = $err; - uucore::error::set_exit_code(e.code()); - eprintln!("{}: {}", executable!(), e); - if e.usage() { - eprintln!("Try '{} --help' for more information.", executable!()); - } + $crate::error::set_exit_code(e.code()); + eprintln!("{}: {}", $crate::util_name(), e); }) ); @@ -46,7 +34,7 @@ macro_rules! show_if_err( #[macro_export] macro_rules! show_error( ($($args:tt)+) => ({ - eprint!("{}: ", executable!()); + eprint!("{}: ", $crate::util_name()); eprintln!($($args)+); }) ); @@ -55,7 +43,7 @@ macro_rules! show_error( #[macro_export] macro_rules! show_error_custom_description ( ($err:expr,$($args:tt)+) => ({ - eprint!("{}: {}: ", executable!(), $err); + eprint!("{}: {}: ", $crate::util_name(), $err); eprintln!($($args)+); }) ); @@ -63,7 +51,7 @@ macro_rules! show_error_custom_description ( #[macro_export] macro_rules! show_warning( ($($args:tt)+) => ({ - eprint!("{}: warning: ", executable!()); + eprint!("{}: warning: ", $crate::util_name()); eprintln!($($args)+); }) ); @@ -72,9 +60,19 @@ macro_rules! show_warning( #[macro_export] macro_rules! show_usage_error( ($($args:tt)+) => ({ - eprint!("{}: ", executable!()); + eprint!("{}: ", $crate::util_name()); eprintln!($($args)+); - eprintln!("Try '{} --help' for more information.", executable!()); + eprintln!("Try '{} --help' for more information.", $crate::execution_phrase()); + }) +); + +//==== + +/// Calls `exit()` with the provided exit code. +#[macro_export] +macro_rules! exit( + ($exit_code:expr) => ({ + ::std::process::exit($exit_code) }) ); @@ -82,16 +80,8 @@ macro_rules! show_usage_error( #[macro_export] macro_rules! crash( ($exit_code:expr, $($args:tt)+) => ({ - show_error!($($args)+); - ::std::process::exit($exit_code) - }) -); - -/// Calls `exit()` with the provided exit code. -#[macro_export] -macro_rules! exit( - ($exit_code:expr) => ({ - ::std::process::exit($exit_code) + $crate::show_error!($($args)+); + $crate::exit!($exit_code) }) ); @@ -102,11 +92,13 @@ macro_rules! crash_if_err( ($exit_code:expr, $exp:expr) => ( match $exp { Ok(m) => m, - Err(f) => crash!($exit_code, "{}", f), + Err(f) => $crate::crash!($exit_code, "{}", f), } ) ); +//==== + /// Unwraps the Result. Instead of panicking, it shows the error and then /// returns from the function with the provided exit code. /// Assumes the current function returns an i32 value. @@ -116,13 +108,15 @@ macro_rules! return_if_err( match $exp { Ok(m) => m, Err(f) => { - show_error!("{}", f); + $crate::show_error!("{}", f); return $exit_code; } } ) ); +//==== + #[macro_export] macro_rules! safe_write( ($fd:expr, $($args:tt)+) => ( @@ -150,32 +144,32 @@ macro_rules! safe_unwrap( ($exp:expr) => ( match $exp { Ok(m) => m, - Err(f) => crash!(1, "{}", f.to_string()) + Err(f) => $crate::crash!(1, "{}", f.to_string()) } ) ); //-- message templates -//-- message templates : general +//-- message templates : (join utility sub-macros) #[macro_export] -macro_rules! snippet_list_join_oxford { +macro_rules! snippet_list_join_oxford_comma { ($conjunction:expr, $valOne:expr, $valTwo:expr) => ( format!("{}, {} {}", $valOne, $conjunction, $valTwo) ); ($conjunction:expr, $valOne:expr, $valTwo:expr $(, $remaining_values:expr)*) => ( - format!("{}, {}", $valOne, snippet_list_join_inner!($conjunction, $valTwo $(, $remaining_values)*)) + format!("{}, {}", $valOne, $crate::snippet_list_join_oxford_comma!($conjunction, $valTwo $(, $remaining_values)*)) ); } #[macro_export] -macro_rules! snippet_list_join_or { - ($valOne:expr, $valTwo:expr) => ( - format!("{} or {}", $valOne, $valTwo) +macro_rules! snippet_list_join { + ($conjunction:expr, $valOne:expr, $valTwo:expr) => ( + format!("{} {} {}", $valOne, $conjunction, $valTwo) ); - ($valOne:expr, $valTwo:expr $(, $remaining_values:expr)*) => ( - format!("{}, {}", $valOne, snippet_list_join_oxford!("or", $valTwo $(, $remaining_values)*)) + ($conjunction:expr, $valOne:expr, $valTwo:expr $(, $remaining_values:expr)*) => ( + format!("{}, {}", $valOne, $crate::snippet_list_join_oxford_comma!($conjunction, $valTwo $(, $remaining_values)*)) ); } @@ -193,10 +187,10 @@ macro_rules! msg_invalid_input { #[macro_export] macro_rules! msg_invalid_opt_use { ($about:expr, $flag:expr) => { - msg_invalid_input!(format!("The '{}' option {}", $flag, $about)) + $crate::msg_invalid_input!(format!("The '{}' option {}", $flag, $about)) }; ($about:expr, $long_flag:expr, $short_flag:expr) => { - msg_invalid_input!(format!( + $crate::msg_invalid_input!(format!( "The '{}' ('{}') option {}", $long_flag, $short_flag, $about )) @@ -206,10 +200,10 @@ macro_rules! msg_invalid_opt_use { #[macro_export] macro_rules! msg_opt_only_usable_if { ($clause:expr, $flag:expr) => { - msg_invalid_opt_use!(format!("only usable if {}", $clause), $flag) + $crate::msg_invalid_opt_use!(format!("only usable if {}", $clause), $flag) }; ($clause:expr, $long_flag:expr, $short_flag:expr) => { - msg_invalid_opt_use!( + $crate::msg_invalid_opt_use!( format!("only usable if {}", $clause), $long_flag, $short_flag @@ -220,13 +214,13 @@ macro_rules! msg_opt_only_usable_if { #[macro_export] macro_rules! msg_opt_invalid_should_be { ($expects:expr, $received:expr, $flag:expr) => { - msg_invalid_opt_use!( + $crate::msg_invalid_opt_use!( format!("expects {}, but was provided {}", $expects, $received), $flag ) }; ($expects:expr, $received:expr, $long_flag:expr, $short_flag:expr) => { - msg_invalid_opt_use!( + $crate::msg_invalid_opt_use!( format!("expects {}, but was provided {}", $expects, $received), $long_flag, $short_flag @@ -239,13 +233,13 @@ macro_rules! msg_opt_invalid_should_be { #[macro_export] macro_rules! msg_expects_one_of { ($valOne:expr $(, $remaining_values:expr)*) => ( - msg_invalid_input!(format!("expects one of {}", snippet_list_join_or!($valOne $(, $remaining_values)*))) + $crate::msg_invalid_input!(format!("expects one of {}", $crate::snippet_list_join!("or", $valOne $(, $remaining_values)*))) ); } #[macro_export] macro_rules! msg_expects_no_more_than_one_of { ($valOne:expr $(, $remaining_values:expr)*) => ( - msg_invalid_input!(format!("expects no more than one of {}", snippet_list_join_or!($valOne $(, $remaining_values)*))) ; + $crate::msg_invalid_input!(format!("expects no more than one of {}", $crate::snippet_list_join!("or", $valOne $(, $remaining_values)*))) ; ); } diff --git a/src/uucore/src/lib/mods/coreopts.rs b/src/uucore/src/lib/mods/coreopts.rs index f3fb77335..b534ff902 100644 --- a/src/uucore/src/lib/mods/coreopts.rs +++ b/src/uucore/src/lib/mods/coreopts.rs @@ -120,7 +120,7 @@ impl<'a> CoreOptions<'a> { macro_rules! app { ($syntax: expr, $summary: expr, $long_help: expr) => { uucore::coreopts::CoreOptions::new(uucore::coreopts::HelpText { - name: executable!(), + name: uucore::util_name(), version: env!("CARGO_PKG_VERSION"), syntax: $syntax, summary: $summary, @@ -130,7 +130,7 @@ macro_rules! app { }; ($syntax: expr, $summary: expr, $long_help: expr, $display_usage: expr) => { uucore::coreopts::CoreOptions::new(uucore::coreopts::HelpText { - name: executable!(), + name: uucore::util_name(), version: env!("CARGO_PKG_VERSION"), syntax: $syntax, summary: $summary, diff --git a/src/uucore/src/lib/mods/error.rs b/src/uucore/src/lib/mods/error.rs index 664fc9841..c2b3069c8 100644 --- a/src/uucore/src/lib/mods/error.rs +++ b/src/uucore/src/lib/mods/error.rs @@ -203,8 +203,8 @@ pub trait UError: Error + Send { /// Print usage help to a custom error. /// /// Return true or false to control whether a short usage help is printed - /// below the error message. The usage help is in the format: "Try '{name} - /// --help' for more information." and printed only if `true` is returned. + /// below the error message. The usage help is in the format: "Try `{name} + /// --help` for more information." and printed only if `true` is returned. /// /// # Example /// @@ -519,7 +519,7 @@ macro_rules! uio_error( /// let res: UResult<()> = Err(1.into()); /// ``` /// This type is especially useful for a trivial conversion from utils returning [`i32`] to -/// returning [`UResult`]. +/// returning [`UResult`]. #[derive(Debug)] pub struct ExitCode(pub i32); diff --git a/src/uucore_procs/src/lib.rs b/src/uucore_procs/src/lib.rs index f62e4178e..092a4a66c 100644 --- a/src/uucore_procs/src/lib.rs +++ b/src/uucore_procs/src/lib.rs @@ -104,7 +104,7 @@ pub fn gen_uumain(_args: TokenStream, stream: TokenStream) -> TokenStream { show_error!("{}", s); } if e.usage() { - eprintln!("Try '{} --help' for more information.", executable!()); + eprintln!("Try '{} --help' for more information.", uucore::execution_phrase()); } e.code() } diff --git a/tests/by-util/test_base32.rs b/tests/by-util/test_base32.rs index 178341f44..5c74c5b59 100644 --- a/tests/by-util/test_base32.rs +++ b/tests/by-util/test_base32.rs @@ -85,11 +85,15 @@ fn test_wrap() { #[test] fn test_wrap_no_arg() { for wrap_param in &["-w", "--wrap"] { - let expected_stderr = "error: The argument '--wrap \' requires a value but none was \ - supplied\n\nUSAGE:\n base32 [OPTION]... [FILE]\n\nFor more \ - information try --help" - .to_string(); - new_ucmd!() + let ts = TestScenario::new(util_name!()); + let expected_stderr = &format!( + "error: The argument '--wrap \' requires a value but none was \ + supplied\n\nUSAGE:\n {1} {0} [OPTION]... [FILE]\n\nFor more \ + information try --help", + ts.util_name, + ts.bin_path.to_string_lossy() + ); + ts.ucmd() .arg(wrap_param) .fails() .stderr_only(expected_stderr); diff --git a/tests/by-util/test_basename.rs b/tests/by-util/test_basename.rs index d9632106e..02dfebeda 100644 --- a/tests/by-util/test_basename.rs +++ b/tests/by-util/test_basename.rs @@ -114,9 +114,12 @@ fn test_no_args() { #[test] fn test_no_args_output() { - new_ucmd!() - .fails() - .stderr_is("basename: missing operand\nTry 'basename --help' for more information."); + let ts = TestScenario::new(util_name!()); + ts.ucmd().fails().stderr_is(&format!( + "{0}: missing operand\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[test] @@ -126,10 +129,12 @@ fn test_too_many_args() { #[test] fn test_too_many_args_output() { - new_ucmd!() - .args(&["a", "b", "c"]) - .fails() - .stderr_is("basename: extra operand 'c'\nTry 'basename --help' for more information."); + let ts = TestScenario::new(util_name!()); + ts.ucmd().args(&["a", "b", "c"]).fails().stderr_is(format!( + "{0}: extra operand 'c'\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[cfg(any(unix, target_os = "redox"))] diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 541e6b5d9..b6b4c3311 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -561,14 +561,17 @@ fn test_cp_backup_off() { #[test] fn test_cp_backup_no_clobber_conflicting_options() { - let (_, mut ucmd) = at_and_ucmd!(); - - ucmd.arg("--backup") + let ts = TestScenario::new(util_name!()); + ts.ucmd() + .arg("--backup") .arg("--no-clobber") .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_HOW_ARE_YOU_SOURCE) - .fails() - .stderr_is("cp: options --backup and --no-clobber are mutually exclusive\nTry 'cp --help' for more information."); + .fails().stderr_is(&format!( + "{0}: options --backup and --no-clobber are mutually exclusive\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[test] diff --git a/tests/by-util/test_more.rs b/tests/by-util/test_more.rs index 9b28ee24e..4b2719d8f 100644 --- a/tests/by-util/test_more.rs +++ b/tests/by-util/test_more.rs @@ -15,11 +15,15 @@ fn test_more_dir_arg() { // Maybe we could capture the error, i.e. "Device not found" in that case // but I am leaving this for later if atty::is(atty::Stream::Stdout) { - let result = new_ucmd!().arg(".").run(); + let ts = TestScenario::new(util_name!()); + let result = ts.ucmd().arg(".").run(); result.failure(); - const EXPECTED_ERROR_MESSAGE: &str = - "more: '.' is a directory.\nTry 'more --help' for more information."; - assert_eq!(result.stderr_str().trim(), EXPECTED_ERROR_MESSAGE); + let expected_error_message = &format!( + "{0}: '.' is a directory.\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + ); + assert_eq!(result.stderr_str().trim(), expected_error_message); } else { } } diff --git a/tests/by-util/test_mv.rs b/tests/by-util/test_mv.rs index 02c65f68d..8d9b00664 100644 --- a/tests/by-util/test_mv.rs +++ b/tests/by-util/test_mv.rs @@ -522,14 +522,17 @@ fn test_mv_backup_off() { #[test] fn test_mv_backup_no_clobber_conflicting_options() { - let (_, mut ucmd) = at_and_ucmd!(); + let ts = TestScenario::new(util_name!()); - ucmd.arg("--backup") + ts.ucmd().arg("--backup") .arg("--no-clobber") .arg("file1") .arg("file2") .fails() - .stderr_is("mv: options --backup and --no-clobber are mutually exclusive\nTry 'mv --help' for more information."); + .stderr_is(&format!("{0}: options --backup and --no-clobber are mutually exclusive\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[test] diff --git a/tests/by-util/test_nice.rs b/tests/by-util/test_nice.rs index 25886de78..7a99a333d 100644 --- a/tests/by-util/test_nice.rs +++ b/tests/by-util/test_nice.rs @@ -22,10 +22,15 @@ fn test_negative_adjustment() { #[test] fn test_adjustment_with_no_command_should_error() { - new_ucmd!() + let ts = TestScenario::new(util_name!()); + + ts.ucmd() .args(&["-n", "19"]) .run() - .stderr_is("nice: A command must be given with an adjustment.\nTry \"nice --help\" for more information.\n"); + .stderr_is(&format!("{0}: A command must be given with an adjustment.\nTry '{1} {0} --help' for more information.\n", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[test] diff --git a/tests/by-util/test_rm.rs b/tests/by-util/test_rm.rs index 0592be244..32bc43837 100644 --- a/tests/by-util/test_rm.rs +++ b/tests/by-util/test_rm.rs @@ -255,10 +255,12 @@ fn test_rm_force_no_operand() { #[test] fn test_rm_no_operand() { - let mut ucmd = new_ucmd!(); - - ucmd.fails() - .stderr_is("rm: missing an argument\nrm: for help, try 'rm --help'\n"); + let ts = TestScenario::new(util_name!()); + ts.ucmd().fails().stderr_is(&format!( + "{0}: missing an argument\n{0}: for help, try '{1} {0} --help'\n", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[test] diff --git a/tests/by-util/test_seq.rs b/tests/by-util/test_seq.rs index be04bf1fd..eab7e16ce 100644 --- a/tests/by-util/test_seq.rs +++ b/tests/by-util/test_seq.rs @@ -2,16 +2,24 @@ use crate::common::util::*; #[test] fn test_rejects_nan() { - new_ucmd!().args(&["NaN"]).fails().stderr_only( - "seq: invalid 'not-a-number' argument: 'NaN'\nTry 'seq --help' for more information.", - ); + let ts = TestScenario::new(util_name!()); + + ts.ucmd().args(&["NaN"]).fails().stderr_only(format!( + "{0}: invalid 'not-a-number' argument: 'NaN'\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[test] fn test_rejects_non_floats() { - new_ucmd!().args(&["foo"]).fails().stderr_only( - "seq: invalid floating point argument: 'foo'\nTry 'seq --help' for more information.", - ); + let ts = TestScenario::new(util_name!()); + + ts.ucmd().args(&["foo"]).fails().stderr_only(&format!( + "{0}: invalid floating point argument: 'foo'\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } // ---- Tests for the big integer based path ---- diff --git a/tests/by-util/test_stdbuf.rs b/tests/by-util/test_stdbuf.rs index 66892ea0f..c05b65d70 100644 --- a/tests/by-util/test_stdbuf.rs +++ b/tests/by-util/test_stdbuf.rs @@ -25,15 +25,19 @@ fn test_stdbuf_line_buffered_stdout() { #[cfg(not(target_os = "windows"))] #[test] fn test_stdbuf_no_buffer_option_fails() { - new_ucmd!().args(&["head"]).fails().stderr_is( + let ts = TestScenario::new(util_name!()); + + ts.ucmd().args(&["head"]).fails().stderr_is(&format!( "error: The following required arguments were not provided:\n \ --error \n \ --input \n \ --output \n\n\ USAGE:\n \ - stdbuf OPTION... COMMAND\n\n\ + {1} {0} OPTION... COMMAND\n\n\ For more information try --help", - ); + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[cfg(not(target_os = "windows"))] @@ -49,9 +53,16 @@ fn test_stdbuf_trailing_var_arg() { #[cfg(not(target_os = "windows"))] #[test] fn test_stdbuf_line_buffering_stdin_fails() { - new_ucmd!().args(&["-i", "L", "head"]).fails().stderr_is( - "stdbuf: line buffering stdin is meaningless\nTry 'stdbuf --help' for more information.", - ); + let ts = TestScenario::new(util_name!()); + + ts.ucmd() + .args(&["-i", "L", "head"]) + .fails() + .stderr_is(&format!( + "{0}: line buffering stdin is meaningless\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[cfg(not(target_os = "windows"))] diff --git a/tests/by-util/test_unlink.rs b/tests/by-util/test_unlink.rs index 1999e965c..36c978734 100644 --- a/tests/by-util/test_unlink.rs +++ b/tests/by-util/test_unlink.rs @@ -14,17 +14,20 @@ fn test_unlink_file() { #[test] fn test_unlink_multiple_files() { - let (at, mut ucmd) = at_and_ucmd!(); + let ts = TestScenario::new(util_name!()); + + let (at, mut ucmd) = (ts.fixtures.clone(), ts.ucmd()); let file_a = "test_unlink_multiple_file_a"; let file_b = "test_unlink_multiple_file_b"; at.touch(file_a); at.touch(file_b); - ucmd.arg(file_a).arg(file_b).fails().stderr_is( - "unlink: extra operand: 'test_unlink_multiple_file_b'\nTry 'unlink --help' \ - for more information.\n", - ); + ucmd.arg(file_a).arg(file_b).fails().stderr_is(&format!( + "{0}: extra operand: 'test_unlink_multiple_file_b'\nTry '{1} {0} --help' for more information.", + ts.util_name, + ts.bin_path.to_string_lossy() + )); } #[test] diff --git a/tests/common/util.rs b/tests/common/util.rs index 41389d567..5441b82c2 100644 --- a/tests/common/util.rs +++ b/tests/common/util.rs @@ -713,7 +713,7 @@ impl AtPath { /// /// Fixtures can be found under `tests/fixtures/$util_name/` pub struct TestScenario { - bin_path: PathBuf, + pub bin_path: PathBuf, pub util_name: String, pub fixtures: AtPath, tmpd: Rc, diff --git a/tests/test_util_name.rs b/tests/test_util_name.rs new file mode 100644 index 000000000..b0a78a2e8 --- /dev/null +++ b/tests/test_util_name.rs @@ -0,0 +1,86 @@ +mod common; + +use common::util::TestScenario; + +#[cfg(unix)] +use std::os::unix::fs::symlink as symlink_file; +#[cfg(windows)] +use std::os::windows::fs::symlink_file; + +#[test] +#[cfg(feature = "ls")] +fn execution_phrase_double() { + use std::process::Command; + + let scenario = TestScenario::new("ls"); + let output = Command::new(&scenario.bin_path) + .arg("ls") + .arg("--some-invalid-arg") + .output() + .unwrap(); + assert!(String::from_utf8(output.stderr) + .unwrap() + .contains(&format!("USAGE:\n {} ls", scenario.bin_path.display(),))); +} + +#[test] +#[cfg(feature = "ls")] +fn execution_phrase_single() { + use std::process::Command; + + let scenario = TestScenario::new("ls"); + symlink_file(scenario.bin_path, scenario.fixtures.plus("uu-ls")).unwrap(); + let output = Command::new(scenario.fixtures.plus("uu-ls")) + .arg("--some-invalid-arg") + .output() + .unwrap(); + assert!(String::from_utf8(output.stderr).unwrap().contains(&format!( + "USAGE:\n {}", + scenario.fixtures.plus("uu-ls").display() + ))); +} + +#[test] +#[cfg(feature = "sort")] +fn util_name_double() { + use std::{ + io::Write, + process::{Command, Stdio}, + }; + + let scenario = TestScenario::new("sort"); + let mut child = Command::new(&scenario.bin_path) + .arg("sort") + .stdin(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .unwrap(); + // input invalid utf8 to cause an error + child.stdin.take().unwrap().write_all(&[255]).unwrap(); + let output = child.wait_with_output().unwrap(); + assert!(String::from_utf8(output.stderr).unwrap().contains("sort: ")); +} + +#[test] +#[cfg(feature = "sort")] +fn util_name_single() { + use std::{ + io::Write, + process::{Command, Stdio}, + }; + + let scenario = TestScenario::new("sort"); + symlink_file(scenario.bin_path, scenario.fixtures.plus("uu-sort")).unwrap(); + let mut child = Command::new(scenario.fixtures.plus("uu-sort")) + .stdin(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .unwrap(); + // input invalid utf8 to cause an error + child.stdin.take().unwrap().write_all(&[255]).unwrap(); + let output = child.wait_with_output().unwrap(); + assert!(String::from_utf8(output.stderr).unwrap().contains(&format!( + "{}: ", + scenario.fixtures.plus("uu-sort").display() + ))); +}