mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-14 16:37:42 +00:00
cli: check invalid declaration of immutable_heads() alias earlier
I just wanted to remove CommandError from parse_immutable_expression(), which will be called from the templater, but the new error message looks also better.
This commit is contained in:
parent
8235e458ed
commit
7dfe04134d
2 changed files with 24 additions and 18 deletions
|
@ -30,6 +30,8 @@ use crate::command_error::{user_error, CommandError};
|
||||||
use crate::config::LayeredConfigs;
|
use crate::config::LayeredConfigs;
|
||||||
use crate::ui::Ui;
|
use crate::ui::Ui;
|
||||||
|
|
||||||
|
const BUILTIN_IMMUTABLE_HEADS: &str = "immutable_heads";
|
||||||
|
|
||||||
pub fn load_revset_aliases(
|
pub fn load_revset_aliases(
|
||||||
ui: &Ui,
|
ui: &Ui,
|
||||||
layered_configs: &LayeredConfigs,
|
layered_configs: &LayeredConfigs,
|
||||||
|
@ -54,6 +56,17 @@ pub fn load_revset_aliases(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: If we add support for function overloading (#2966), this check can
|
||||||
|
// be removed.
|
||||||
|
let (params, _) = aliases_map.get_function(BUILTIN_IMMUTABLE_HEADS).unwrap();
|
||||||
|
if !params.is_empty() {
|
||||||
|
return Err(user_error(format!(
|
||||||
|
"The `revset-aliases.{name}()` function must be declared without arguments",
|
||||||
|
name = BUILTIN_IMMUTABLE_HEADS
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
Ok(aliases_map)
|
Ok(aliases_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,14 +106,15 @@ pub fn default_symbol_resolver<'a>(
|
||||||
pub fn parse_immutable_expression(
|
pub fn parse_immutable_expression(
|
||||||
repo: &dyn Repo,
|
repo: &dyn Repo,
|
||||||
context: &RevsetParseContext,
|
context: &RevsetParseContext,
|
||||||
) -> Result<Rc<RevsetExpression>, CommandError> {
|
) -> Result<Rc<RevsetExpression>, RevsetParseError> {
|
||||||
let (params, immutable_heads_str) =
|
let (params, immutable_heads_str) = context
|
||||||
context.aliases_map.get_function("immutable_heads").unwrap();
|
.aliases_map
|
||||||
if !params.is_empty() {
|
.get_function(BUILTIN_IMMUTABLE_HEADS)
|
||||||
return Err(user_error(
|
.unwrap();
|
||||||
r#"The `revset-aliases.immutable_heads()` function must be declared without arguments."#,
|
assert!(
|
||||||
));
|
params.is_empty(),
|
||||||
}
|
"invalid declaration should have been rejected by load_revset_aliases()"
|
||||||
|
);
|
||||||
let immutable_heads_revset = parse(immutable_heads_str, context)?;
|
let immutable_heads_revset = parse(immutable_heads_str, context)?;
|
||||||
Ok(immutable_heads_revset
|
Ok(immutable_heads_revset
|
||||||
.ancestors()
|
.ancestors()
|
||||||
|
|
|
@ -57,24 +57,16 @@ fn test_rewrite_immutable_generic() {
|
||||||
Error: The root commit 000000000000 is immutable
|
Error: The root commit 000000000000 is immutable
|
||||||
"###);
|
"###);
|
||||||
// Error if we redefine immutable_heads() with an argument
|
// Error if we redefine immutable_heads() with an argument
|
||||||
// TODO: This error comes from the built-in definition of
|
|
||||||
// `revsets.short-prefixes`. That's not clear to the user.
|
|
||||||
test_env.add_config(r#"revset-aliases."immutable_heads(foo)" = "none()""#);
|
test_env.add_config(r#"revset-aliases."immutable_heads(foo)" = "none()""#);
|
||||||
let stderr = test_env.jj_cmd_failure(&repo_path, &["edit", "root()"]);
|
let stderr = test_env.jj_cmd_failure(&repo_path, &["edit", "root()"]);
|
||||||
insta::assert_snapshot!(stderr, @r###"
|
insta::assert_snapshot!(stderr, @r###"
|
||||||
Config error: Invalid `revsets.short-prefixes`: --> 1:31
|
Error: The `revset-aliases.immutable_heads()` function must be declared without arguments
|
||||||
|
|
|
||||||
1 | @ | ancestors(immutable_heads().., 2) | trunk()
|
|
||||||
| ^
|
|
||||||
|
|
|
||||||
= Invalid arguments to revset function "immutable_heads": Expected 1 arguments
|
|
||||||
For help, see https://github.com/martinvonz/jj/blob/main/docs/config.md.
|
|
||||||
"###);
|
"###);
|
||||||
// ... even if we also update the built-in call sites
|
// ... even if we also update the built-in call sites
|
||||||
test_env.add_config(r#"revsets.short-prefixes = "immutable_heads(root())""#);
|
test_env.add_config(r#"revsets.short-prefixes = "immutable_heads(root())""#);
|
||||||
let stderr = test_env.jj_cmd_failure(&repo_path, &["edit", "root()"]);
|
let stderr = test_env.jj_cmd_failure(&repo_path, &["edit", "root()"]);
|
||||||
insta::assert_snapshot!(stderr, @r###"
|
insta::assert_snapshot!(stderr, @r###"
|
||||||
Error: The `revset-aliases.immutable_heads()` function must be declared without arguments.
|
Error: The `revset-aliases.immutable_heads()` function must be declared without arguments
|
||||||
"###);
|
"###);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue