1017 lines · 28.3 KB · Rust
RawDownload
// Copyright 2022 The Jujutsu Authors//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at//// https://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License. use crate::common::TestEnvironment; #[test]fn test_syntax_error() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");     let output = work_dir.run_jj(["log", "-r", ":x"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: `:` is not a prefix operator    Caused by:  --> 1:1      |    1 | :x      | ^      |      = `:` is not a prefix operator    Hint: Did you mean `::` for ancestors?    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "x &"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Syntax error    Caused by:  --> 1:4      |    1 | x &      |    ^---      |      = expected `::`, `..`, `~`, or <primary>    Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols.    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "x - y"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: `-` is not an infix operator    Caused by:  --> 1:3      |    1 | x - y      |   ^      |      = `-` is not an infix operator    Hint: Did you mean `~` for difference?    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "HEAD^"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: `^` is not a postfix operator    Caused by:  --> 1:5      |    1 | HEAD^      |     ^      |      = `^` is not a postfix operator    Hint: Did you mean `-` for parents?    [EOF]    [exit status: 1]    ");} #[test]fn test_bad_function_call() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");     let output = work_dir.run_jj(["log", "-r", "all(or::nothing)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Function `all`: Expected 0 arguments    Caused by:  --> 1:5      |    1 | all(or::nothing)      |     ^---------^      |      = Function `all`: Expected 0 arguments    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "parents()"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Function `parents`: Expected 1 to 2 arguments    Caused by:  --> 1:9      |    1 | parents()      |         ^      |      = Function `parents`: Expected 1 to 2 arguments    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "parents(foo, bar, baz)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Function `parents`: Expected 1 to 2 arguments    Caused by:  --> 1:9      |    1 | parents(foo, bar, baz)      |         ^-----------^      |      = Function `parents`: Expected 1 to 2 arguments    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "heads(foo, bar)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Function `heads`: Expected 1 arguments    Caused by:  --> 1:7      |    1 | heads(foo, bar)      |       ^------^      |      = Function `heads`: Expected 1 arguments    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "latest(a, not_an_integer)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Expected integer    Caused by:  --> 1:11      |    1 | latest(a, not_an_integer)      |           ^------------^      |      = Expected integer    [EOF]    [exit status: 1]    ");     // "N to M arguments"    let output = work_dir.run_jj(["log", "-r", "ancestors()"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Function `ancestors`: Expected 1 to 2 arguments    Caused by:  --> 1:11      |    1 | ancestors()      |           ^      |      = Function `ancestors`: Expected 1 to 2 arguments    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "change_id(glob:a)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Expected change ID prefix    Caused by:  --> 1:11      |    1 | change_id(glob:a)      |           ^----^      |      = Expected change ID prefix    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "commit_id(xyzzy)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Invalid commit ID prefix    Caused by:  --> 1:11      |    1 | commit_id(xyzzy)      |           ^---^      |      = Invalid commit ID prefix    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "files(not::a-fileset)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: In fileset expression    Caused by:    1:  --> 1:7      |    1 | files(not::a-fileset)      |       ^------------^      |      = In fileset expression    2:  --> 1:5      |    1 | not::a-fileset      |     ^---      |      = expected <identifier>, <string_literal>, or <raw_string_literal>    Hint: See https://jj-vcs.github.io/jj/latest/filesets/ or use `jj help -k filesets` for filesets syntax and how to match file paths.    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", r#"files(foo:"bar")"#]);    insta::assert_snapshot!(output, @r#"    ------- stderr -------    Error: Failed to parse revset: In fileset expression    Caused by:    1:  --> 1:7      |    1 | files(foo:"bar")      |       ^-------^      |      = In fileset expression    2:  --> 1:1      |    1 | foo:"bar"      | ^-------^      |      = Invalid file pattern    3: Invalid file pattern kind `foo:`    Hint: See https://jj-vcs.github.io/jj/latest/filesets/#file-patterns or `jj help -k filesets` for valid prefixes.    [EOF]    [exit status: 1]    "#);     let output = work_dir.run_jj(["log", "-r", r#"files("../out")"#]);    insta::assert_snapshot!(output.normalize_backslash(), @r#"    ------- stderr -------    Error: Failed to parse revset: In fileset expression    Caused by:    1:  --> 1:7      |    1 | files("../out")      |       ^------^      |      = In fileset expression    2:  --> 1:1      |    1 | "../out"      | ^------^      |      = Invalid file pattern    3: Path "../out" is not in the repo "."    4: Invalid component ".." in repo-relative path "../out"    [EOF]    [exit status: 1]    "#);     let output = work_dir.run_jj(["log", "-r", "bookmarks(bad:pattern)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Invalid string pattern    Caused by:    1:  --> 1:11      |    1 | bookmarks(bad:pattern)      |           ^---------^      |      = Invalid string pattern    2: Invalid string pattern kind `bad:`    Hint: Try prefixing with one of `exact:`, `glob:`, `regex:`, `substring:`, or one of these with `-i` suffix added (e.g. `glob-i:`) for case-insensitive matching    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "bookmarks(regex:'(')"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Invalid string pattern    Caused by:    1:  --> 1:11      |    1 | bookmarks(regex:'(')      |           ^-------^      |      = Invalid string pattern    2: regex parse error:        (        ^    error: unclosed group    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "root()::whatever()"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Function `whatever` doesn't exist    Caused by:  --> 1:9      |    1 | root()::whatever()      |         ^------^      |      = Function `whatever` doesn't exist    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(a, b, remote=c)"]);    insta::assert_snapshot!(output, @r#"    ------- stderr -------    Error: Failed to parse revset: Function `remote_bookmarks`: Got multiple values for keyword "remote"    Caused by:  --> 1:24      |    1 | remote_bookmarks(a, b, remote=c)      |                        ^------^      |      = Function `remote_bookmarks`: Got multiple values for keyword "remote"    [EOF]    [exit status: 1]    "#);     let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(remote=a, b)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Function `remote_bookmarks`: Positional argument follows keyword argument    Caused by:  --> 1:28      |    1 | remote_bookmarks(remote=a, b)      |                            ^      |      = Function `remote_bookmarks`: Positional argument follows keyword argument    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(=foo)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Syntax error    Caused by:  --> 1:18      |    1 | remote_bookmarks(=foo)      |                  ^---      |      = expected <strict_identifier> or <expression>    Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols.    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "remote_bookmarks(remote=)"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Syntax error    Caused by:  --> 1:25      |    1 | remote_bookmarks(remote=)      |                         ^---      |      = expected <expression>    Hint: See https://jj-vcs.github.io/jj/latest/revsets/ or use `jj help -k revsets` for revsets syntax and how to quote symbols.    [EOF]    [exit status: 1]    ");} #[test]fn test_function_name_hint() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");    let evaluate = |expr| work_dir.run_jj(["log", "-r", expr]);     test_env.add_config(        r###"    [revset-aliases]    'bookmarks(x)' = 'x' # override builtin function    'my_author(x)' = 'author(x)' # similar name to builtin function    'author_sym' = 'x' # not a function alias    'my_bookmarks' = 'bookmark()' # typo in alias    "###,    );     // The suggestion "bookmarks" shouldn't be duplicated    insta::assert_snapshot!(evaluate("bookmark()"), @r"    ------- stderr -------    Error: Failed to parse revset: Function `bookmark` doesn't exist    Caused by:  --> 1:1      |    1 | bookmark()      | ^------^      |      = Function `bookmark` doesn't exist    Hint: Did you mean `bookmarks`, `remote_bookmarks`?    [EOF]    [exit status: 1]    ");     // Both builtin function and function alias should be suggested    insta::assert_snapshot!(evaluate("author_()"), @r"    ------- stderr -------    Error: Failed to parse revset: Function `author_` doesn't exist    Caused by:  --> 1:1      |    1 | author_()      | ^-----^      |      = Function `author_` doesn't exist    Hint: Did you mean `author`, `author_date`, `author_email`, `author_name`, `my_author`?    [EOF]    [exit status: 1]    ");     insta::assert_snapshot!(evaluate("my_bookmarks"), @r"    ------- stderr -------    Error: Failed to parse revset: In alias `my_bookmarks`    Caused by:    1:  --> 1:1      |    1 | my_bookmarks      | ^----------^      |      = In alias `my_bookmarks`    2:  --> 1:1      |    1 | bookmark()      | ^------^      |      = Function `bookmark` doesn't exist    Hint: Did you mean `bookmarks`, `remote_bookmarks`?    [EOF]    [exit status: 1]    ");} #[test]fn test_bad_symbol_or_argument_should_not_be_optimized_out() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");     let output = work_dir.run_jj(["log", "-r", "unknown & none()"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Revision `unknown` doesn't exist    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "all() | unknown"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Revision `unknown` doesn't exist    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "description(regex:'(') & none()"]);    insta::assert_snapshot!(output, @r"    ------- stderr -------    Error: Failed to parse revset: Invalid string pattern    Caused by:    1:  --> 1:13      |    1 | description(regex:'(') & none()      |             ^-------^      |      = Invalid string pattern    2: regex parse error:        (        ^    error: unclosed group    [EOF]    [exit status: 1]    ");     let output = work_dir.run_jj(["log", "-r", "files('..') & none()"]);    insta::assert_snapshot!(output.normalize_backslash(), @r#"    ------- stderr -------    Error: Failed to parse revset: In fileset expression    Caused by:    1:  --> 1:7      |    1 | files('..') & none()      |       ^--^      |      = In fileset expression

Lines 1–500 of 1017.