diff --git a/src/bin/cargo/cli.rs b/src/bin/cargo/cli.rs index cfa0a3a66..85990c8f0 100644 --- a/src/bin/cargo/cli.rs +++ b/src/bin/cargo/cli.rs @@ -69,14 +69,17 @@ Run with 'cargo -Z [FLAG] [SUBCOMMAND]'" if args.is_present("list") { println!("Installed Commands:"); for command in list_commands(config) { - let (command, path) = command; - if is_verbose { - match path { - Some(p) => println!(" {:<20} {}", command, p), - None => println!(" {:<20}", command), + match command { + CommandInfo::BuiltIn { name } => { + println!(" {:<20} {}", name) + } + CommandInfo::External { name, path } => { + if is_verbose { + println!(" {:<20} {}", name, path.display()) + } else { + println!(" {:<20}", name) + } } - } else { - println!(" {}", command); } } return Ok(()); diff --git a/src/bin/cargo/command_prelude.rs b/src/bin/cargo/command_prelude.rs index fa49bea86..59aef526d 100644 --- a/src/bin/cargo/command_prelude.rs +++ b/src/bin/cargo/command_prelude.rs @@ -411,3 +411,18 @@ pub fn values(args: &ArgMatches, name: &str) -> Vec { .map(|s| s.to_string()) .collect() } + +#[derive(PartialEq, PartialOrd, Eq, Ord)] +pub enum CommandInfo { + BuiltIn { name: String }, + External { name: String, path: PathBuf }, +} + +impl CommandInfo { + pub fn name(&self) -> String { + match self { + CommandInfo::BuiltIn { name, .. } => name.to_string(), + CommandInfo::External { name, .. } => name.to_string(), + } + } +} diff --git a/src/bin/cargo/main.rs b/src/bin/cargo/main.rs index 76efc0909..f2bf93bc9 100644 --- a/src/bin/cargo/main.rs +++ b/src/bin/cargo/main.rs @@ -26,6 +26,8 @@ mod cli; mod command_prelude; mod commands; +use command_prelude::*; + fn main() { env_logger::init(); cargo::core::maybe_allow_nightly_features(); @@ -81,7 +83,7 @@ fn aliased_command(config: &Config, command: &str) -> CargoResult BTreeSet<(String, Option)> { +fn list_commands(config: &Config) -> BTreeSet { let prefix = "cargo-"; let suffix = env::consts::EXE_SUFFIX; let mut commands = BTreeSet::new(); @@ -101,16 +103,18 @@ fn list_commands(config: &Config) -> BTreeSet<(String, Option)> { } if is_executable(entry.path()) { let end = filename.len() - suffix.len(); - commands.insert(( - filename[prefix.len()..end].to_string(), - Some(path.display().to_string()), - )); + commands.insert(CommandInfo::External { + name: filename[prefix.len()..end].to_string(), + path: path.clone(), + }); } } } for cmd in commands::builtin() { - commands.insert((cmd.get_name().to_string(), None)); + commands.insert(CommandInfo::BuiltIn { + name: cmd.get_name().to_string(), + }); } commands @@ -121,7 +125,8 @@ fn find_closest(config: &Config, cmd: &str) -> Option { // Only consider candidates with a lev_distance of 3 or less so we don't // suggest out-of-the-blue options. cmds.into_iter() - .map(|(c, _)| (lev_distance(&c, cmd), c)) + .map(|c| c.name()) + .map(|c| (lev_distance(&c, cmd), c)) .filter(|&(d, _)| d < 4) .min_by_key(|a| a.0) .map(|slot| slot.1)