forked from extern/nushell
prevent alias name from being filesize or number (#6595)
* prevent alias name from being filesize or number * add test * fmt
This commit is contained in:
parent
32fbcf39cc
commit
1a3762b905
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -2801,6 +2801,7 @@ dependencies = [
|
|||||||
name = "nu-parser"
|
name = "nu-parser"
|
||||||
version = "0.69.2"
|
version = "0.69.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"bytesize",
|
||||||
"chrono",
|
"chrono",
|
||||||
"itertools",
|
"itertools",
|
||||||
"log",
|
"log",
|
||||||
|
@ -40,3 +40,25 @@ fn alias_hiding_2() {
|
|||||||
|
|
||||||
assert_eq!(actual.out, "0");
|
assert_eq!(actual.out, "0");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn alias_fails_with_invalid_name() {
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: "tests/fixtures/formats", pipeline(
|
||||||
|
r#"
|
||||||
|
alias 1234 = echo "test"
|
||||||
|
"#
|
||||||
|
));
|
||||||
|
assert!(actual
|
||||||
|
.err
|
||||||
|
.contains("alias name can't be a number or a filesize"));
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: "tests/fixtures/formats", pipeline(
|
||||||
|
r#"
|
||||||
|
alias 5gib = echo "test"
|
||||||
|
"#
|
||||||
|
));
|
||||||
|
assert!(actual
|
||||||
|
.err
|
||||||
|
.contains("alias name can't be a number or a filesize"));
|
||||||
|
}
|
||||||
|
@ -8,6 +8,7 @@ name = "nu-parser"
|
|||||||
version = "0.69.2"
|
version = "0.69.2"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
bytesize = "1.1.0"
|
||||||
chrono = "0.4.21"
|
chrono = "0.4.21"
|
||||||
itertools = "0.10"
|
itertools = "0.10"
|
||||||
miette = "5.1.0"
|
miette = "5.1.0"
|
||||||
|
@ -112,6 +112,10 @@ pub enum ParseError {
|
|||||||
#[diagnostic(code(nu::parser::variable_not_valid), url(docsrs))]
|
#[diagnostic(code(nu::parser::variable_not_valid), url(docsrs))]
|
||||||
VariableNotValid(#[label = "variable name can't contain spaces or quotes"] Span),
|
VariableNotValid(#[label = "variable name can't contain spaces or quotes"] Span),
|
||||||
|
|
||||||
|
#[error("Alias name not supported.")]
|
||||||
|
#[diagnostic(code(nu::parser::variable_not_valid), url(docsrs))]
|
||||||
|
AliasNotValid(#[label = "alias name can't be a number or a filesize"] Span),
|
||||||
|
|
||||||
#[error("Module not found.")]
|
#[error("Module not found.")]
|
||||||
#[diagnostic(
|
#[diagnostic(
|
||||||
code(nu::parser::module_not_found),
|
code(nu::parser::module_not_found),
|
||||||
@ -344,6 +348,7 @@ impl ParseError {
|
|||||||
ParseError::MultipleRestParams(s) => *s,
|
ParseError::MultipleRestParams(s) => *s,
|
||||||
ParseError::VariableNotFound(s) => *s,
|
ParseError::VariableNotFound(s) => *s,
|
||||||
ParseError::VariableNotValid(s) => *s,
|
ParseError::VariableNotValid(s) => *s,
|
||||||
|
ParseError::AliasNotValid(s) => *s,
|
||||||
ParseError::ModuleNotFound(s) => *s,
|
ParseError::ModuleNotFound(s) => *s,
|
||||||
ParseError::CyclicalModuleImport(_, s) => *s,
|
ParseError::CyclicalModuleImport(_, s) => *s,
|
||||||
ParseError::ModuleOrOverlayNotFound(s) => *s,
|
ParseError::ModuleOrOverlayNotFound(s) => *s,
|
||||||
|
@ -544,16 +544,27 @@ pub fn parse_alias(
|
|||||||
spans: &[Span],
|
spans: &[Span],
|
||||||
expand_aliases_denylist: &[usize],
|
expand_aliases_denylist: &[usize],
|
||||||
) -> (Pipeline, Option<ParseError>) {
|
) -> (Pipeline, Option<ParseError>) {
|
||||||
let (name_span, split_id) =
|
let (name_span, alias_name, split_id) =
|
||||||
if spans.len() > 1 && working_set.get_span_contents(spans[0]) == b"export" {
|
if spans.len() > 1 && working_set.get_span_contents(spans[0]) == b"export" {
|
||||||
(spans[1], 2)
|
(spans[1], spans.get(2), 2)
|
||||||
} else {
|
} else {
|
||||||
(spans[0], 1)
|
(spans[0], spans.get(1), 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
let name = working_set.get_span_contents(name_span);
|
let name = working_set.get_span_contents(name_span);
|
||||||
|
|
||||||
if name == b"alias" {
|
if name == b"alias" {
|
||||||
|
if let Some(alias_name) = alias_name {
|
||||||
|
let alias_name = String::from_utf8_lossy(working_set.get_span_contents(*alias_name));
|
||||||
|
if alias_name.parse::<bytesize::ByteSize>().is_ok() || alias_name.parse::<f64>().is_ok()
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
Pipeline::from_vec(vec![garbage(name_span)]),
|
||||||
|
Some(ParseError::AliasNotValid(name_span)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some((span, err)) = check_name(working_set, spans) {
|
if let Some((span, err)) = check_name(working_set, spans) {
|
||||||
return (Pipeline::from_vec(vec![garbage(*span)]), Some(err));
|
return (Pipeline::from_vec(vec![garbage(*span)]), Some(err));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user