diff --git a/src/bin/cargo/commands/help.rs b/src/bin/cargo/commands/help.rs index d17152a47962..2839b931e247 100644 --- a/src/bin/cargo/commands/help.rs +++ b/src/bin/cargo/commands/help.rs @@ -1,6 +1,5 @@ use crate::aliased_command; use crate::command_prelude::*; -use anyhow::bail; use cargo::util::errors::CargoResult; use cargo::{drop_println, Config}; use cargo_util::paths::resolve_executable; @@ -23,11 +22,21 @@ pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult { let subcommand = args.get_one::("COMMAND"); if let Some(subcommand) = subcommand { if !try_help(config, subcommand)? { - crate::execute_external_subcommand( - config, - subcommand, - &[OsStr::new(subcommand), OsStr::new("--help")], - )?; + match check_builtin(&subcommand) { + Some(s) => { + crate::execute_internal_subcommand( + config, + &[OsStr::new(s), OsStr::new("--help")], + )?; + } + None => { + crate::execute_external_subcommand( + config, + subcommand, + &[OsStr::new(subcommand), OsStr::new("--help")], + )?; + } + } } } else { let mut cmd = crate::cli::cli(); @@ -61,13 +70,13 @@ fn try_help(config: &Config, subcommand: &str) -> CargoResult { if resolve_executable(Path::new("man")).is_ok() { let man = match extract_man(subcommand, "1") { Some(man) => man, - None => bail!("no man page for `{}`", subcommand), + None => return Ok(false), }; write_and_spawn(subcommand, &man, "man")?; } else { let txt = match extract_man(subcommand, "txt") { Some(txt) => txt, - None => bail!("no man page for `{}`", subcommand), + None => return Ok(false), }; if resolve_executable(Path::new("less")).is_ok() { write_and_spawn(subcommand, &txt, "less")?; diff --git a/src/bin/cargo/main.rs b/src/bin/cargo/main.rs index aaac0d126101..ff6910951879 100644 --- a/src/bin/cargo/main.rs +++ b/src/bin/cargo/main.rs @@ -189,9 +189,22 @@ fn execute_external_subcommand(config: &Config, cmd: &str, args: &[&OsStr]) -> C return Err(CliError::new(err, 101)); } }; + execute_subcommand(config, Some(&command), args) +} + +fn execute_internal_subcommand(config: &Config, args: &[&OsStr]) -> CliResult { + execute_subcommand(config, None, args) +} +// This function is used to execute a subcommand. It is used to execute both +// internal and external subcommands. +// If `cmd_path` is `None`, then the subcommand is an internal subcommand. +fn execute_subcommand(config: &Config, cmd_path: Option<&PathBuf>, args: &[&OsStr]) -> CliResult { let cargo_exe = config.cargo_exe()?; - let mut cmd = ProcessBuilder::new(&command); + let mut cmd = match cmd_path { + Some(cmd_path) => ProcessBuilder::new(cmd_path), + None => ProcessBuilder::new(&cargo_exe), + }; cmd.env(cargo::CARGO_ENV, cargo_exe).args(args); if let Some(client) = config.jobserver_from_env() { cmd.inherit_jobserver(client);