use crate::aliased_command;
+use crate::command_prelude::*;
use cargo::util::errors::CargoResult;
use cargo::{drop_println, Config};
use cargo_util::paths::resolve_executable;
const COMPRESSED_MAN: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/man.tgz"));
-/// Checks if the `help` command is being issued.
-///
-/// This runs before clap processing, because it needs to intercept the `help`
-/// command if a man page is available.
-///
-/// Returns `true` if help information was successfully displayed to the user.
-/// In this case, Cargo should exit.
-pub fn handle_embedded_help(config: &Config) -> bool {
- match try_help(config) {
- Ok(true) => true,
- Ok(false) => false,
- Err(e) => {
- log::warn!("help failed: {:?}", e);
- false
- }
- }
+pub fn cli() -> App {
+ subcommand("help")
+ .about("Displays help for a cargo subcommand")
+ .arg(Arg::new("SUBCOMMAND"))
}
-fn try_help(config: &Config) -> CargoResult<bool> {
- let mut args = std::env::args_os()
- .skip(1)
- .skip_while(|arg| arg.to_str().map_or(false, |s| s.starts_with('-')));
- if !args
- .next()
- .map_or(false, |arg| arg.to_str() == Some("help"))
- {
- return Ok(false);
+pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult {
+ let subcommand = args.get_one::<String>("SUBCOMMAND");
+ if let Some(subcommand) = subcommand {
+ if !try_help(config, subcommand)? {
+ crate::execute_external_subcommand(config, subcommand, &[subcommand, "--help"])?;
+ }
+ } else {
+ let mut cmd = crate::cli::cli();
+ let _ = cmd.print_help();
}
- let subcommand = match args.next() {
- Some(arg) => arg,
- None => return Ok(false),
- };
- let subcommand = match subcommand.to_str() {
- Some(s) => s,
- None => return Ok(false),
- };
+ Ok(())
+}
+fn try_help(config: &Config, subcommand: &str) -> CargoResult<bool> {
let subcommand = match check_alias(config, subcommand) {
// If this alias is more than a simple subcommand pass-through, show the alias.
Some(argv) if argv.len() > 1 => {