forked from mirrors/jj
cli: load all aliases to map first to suppress cryptic error
Otherwise 'jj foo.' would fail with 'Config error: Char'.
This commit is contained in:
parent
a45e00179c
commit
283231b1e4
2 changed files with 35 additions and 24 deletions
|
@ -1402,6 +1402,10 @@ fn resolve_aliases(
|
||||||
app: &clap::Command,
|
app: &clap::Command,
|
||||||
string_args: &[String],
|
string_args: &[String],
|
||||||
) -> Result<Vec<String>, CommandError> {
|
) -> Result<Vec<String>, CommandError> {
|
||||||
|
let mut aliases_map = user_settings
|
||||||
|
.config()
|
||||||
|
.get_table("alias")
|
||||||
|
.unwrap_or_default();
|
||||||
let mut resolved_aliases = HashSet::new();
|
let mut resolved_aliases = HashSet::new();
|
||||||
let mut string_args = string_args.to_vec();
|
let mut string_args = string_args.to_vec();
|
||||||
let mut real_commands = HashSet::new();
|
let mut real_commands = HashSet::new();
|
||||||
|
@ -1427,11 +1431,7 @@ fn resolve_aliases(
|
||||||
r#"Recursive alias definition involving "{alias_name}""#
|
r#"Recursive alias definition involving "{alias_name}""#
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
match user_settings
|
if let Some(value) = aliases_map.remove(&alias_name) {
|
||||||
.config()
|
|
||||||
.get::<config::Value>(&format!("alias.{}", alias_name))
|
|
||||||
{
|
|
||||||
Ok(value) => {
|
|
||||||
if let Some(alias_definition) = string_list_from_config(value) {
|
if let Some(alias_definition) = string_list_from_config(value) {
|
||||||
assert!(string_args.ends_with(&alias_args));
|
assert!(string_args.ends_with(&alias_args));
|
||||||
string_args.truncate(string_args.len() - 1 - alias_args.len());
|
string_args.truncate(string_args.len() - 1 - alias_args.len());
|
||||||
|
@ -1444,15 +1444,10 @@ fn resolve_aliases(
|
||||||
r#"Alias definition for "{alias_name}" must be a string list"#
|
r#"Alias definition for "{alias_name}" must be a string list"#
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
Err(config::ConfigError::NotFound(_)) => {
|
|
||||||
// Not a real command and not an alias, so return what we've resolved so far
|
// Not a real command and not an alias, so return what we've resolved so far
|
||||||
return Ok(string_args);
|
return Ok(string_args);
|
||||||
}
|
}
|
||||||
Err(err) => {
|
|
||||||
return Err(CommandError::from(err));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Ok(string_args);
|
return Ok(string_args);
|
||||||
|
|
|
@ -35,6 +35,22 @@ fn test_alias_basic() {
|
||||||
"###);
|
"###);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_alias_bad_name() {
|
||||||
|
let test_env = TestEnvironment::default();
|
||||||
|
test_env.jj_cmd_success(test_env.env_root(), &["init", "repo", "--git"]);
|
||||||
|
let repo_path = test_env.env_root().join("repo");
|
||||||
|
|
||||||
|
let stderr = test_env.jj_cmd_cli_error(&repo_path, &["foo."]);
|
||||||
|
insta::assert_snapshot!(stderr, @r###"
|
||||||
|
error: The subcommand 'foo.' wasn't recognized
|
||||||
|
|
||||||
|
Usage: jj [OPTIONS] <COMMAND>
|
||||||
|
|
||||||
|
For more information try '--help'
|
||||||
|
"###);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_alias_calls_unknown_command() {
|
fn test_alias_calls_unknown_command() {
|
||||||
let test_env = TestEnvironment::default();
|
let test_env = TestEnvironment::default();
|
||||||
|
|
Loading…
Reference in a new issue