Remove python-like string multiplication (#10293)

# Description
Currently we support "multiplication" of strings, resulting in a terse
way to repeat a particular string.
This can have unintended side effects when dealing with mixed data (e.g.
after parsing data that is not all numbers).
Furthermore as we frequently fall-back to strings while parsing source
code, this introduced a runaway edge case in const evaluation (#10212)

Work for #10233

## Details
- Remove python-like string multiplication.
- Workaround for indentation
  - This should probably be addressed with a purpose built command
- Remove special const-eval error test

# User-Facing Changes
**Major breaking change!**
`"string" * 42` will stop working. (This was used for example in the
stdlib)

We should bless a good alternative before landing this

---------

Co-authored-by: JT <547158+jntrnr@users.noreply.github.com>
This commit is contained in:
Stefan Holderbach
2023-09-13 09:52:04 +02:00
committed by GitHub
parent a14e9e0a2e
commit 7f39609d9a
7 changed files with 10 additions and 43 deletions

View File

@ -498,11 +498,3 @@ fn append_binary_values() {
));
assert_eq!(actual.out, "0x[01020304]");
}
#[test]
fn int_multiple_string() {
let actual = nu!(pipeline(r#"3 * "ab""#));
assert_eq!(actual.out, "ababab");
let actual = nu!(pipeline(r#""ab" * 3"#));
assert_eq!(actual.out, "ababab");
}

View File

@ -214,14 +214,16 @@ mod regex {
#[test]
fn parse_handles_external_stream_chunking() {
Playground::setup("parse_test_streaming_1", |dirs, _sandbox| {
Playground::setup("parse_test_streaming_1", |dirs, sandbox| {
let data: String = std::iter::repeat("abcdefghijklmnopqrstuvwxyz")
.take(1000)
.collect();
sandbox.with_files(vec![Stub::FileWithContent("data.txt", &data)]);
let actual = nu!(
cwd: dirs.test(), pipeline(
r#"
"abcdefghijklmnopqrstuvwxyz" * 1000 | save --force data.txt;
open data.txt | parse --regex "(abcdefghijklmnopqrstuvwxyz)" | length
"#
));
cwd: dirs.test(),
r#"open data.txt | parse --regex "(abcdefghijklmnopqrstuvwxyz)" | length"#
);
assert_eq!(actual.out, "1000");
})