diff --git a/src/cargo/util/lev_distance.rs b/src/cargo/util/lev_distance.rs index cf0dddc8e9c..8dcef4a895b 100644 --- a/src/cargo/util/lev_distance.rs +++ b/src/cargo/util/lev_distance.rs @@ -1,6 +1,14 @@ use std::cmp; pub fn lev_distance(me: &str, t: &str) -> usize { + // Comparing the strings lowercased will result in a difference in capitalization being less distance away + // than being a completely different letter. Otherwise `CHECK` is as far away from `check` as it + // is from `build` (both with a distance of 5). For a single letter shortcut (e.g. `b` or `c`), they will + // all be as far away from any capital single letter entry (all with a distance of 1). + // By first lowercasing the strings, `C` and `c` are closer than `C` and `b`, for example. + let me = me.to_lowercase(); + let t = t.to_lowercase(); + let t_len = t.chars().count(); if me.is_empty() { return t_len; diff --git a/tests/testsuite/cargo_command.rs b/tests/testsuite/cargo_command.rs index b814713f1d2..3fd4badcc62 100644 --- a/tests/testsuite/cargo_command.rs +++ b/tests/testsuite/cargo_command.rs @@ -147,6 +147,34 @@ fn list_command_resolves_symlinks() { ); } +#[cargo_test] +fn find_closest_capital_c_to_c() { + cargo_process("C") + .with_status(101) + .with_stderr_contains( + "\ +error: no such subcommand: `C` + +Did you mean `c`? +", + ) + .run(); +} + +#[cargo_test] +fn find_closest_captial_b_to_b() { + cargo_process("B") + .with_status(101) + .with_stderr_contains( + "\ +error: no such subcommand: `B` + +Did you mean `b`? +", + ) + .run(); +} + #[cargo_test] fn find_closest_biuld_to_build() { cargo_process("biuld")