1049 lines · 29.9 KB · Rust
RawDownload
// Copyright 2024 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;use crate::common::TestWorkDir; #[test]fn test_bookmark_names() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");     test_env.run_jj_in(".", ["git", "init", "origin"]).success();    let origin_dir = test_env.work_dir("origin");    let origin_git_repo_path = origin_dir        .root()        .join(".jj")        .join("repo")        .join("store")        .join("git");     work_dir        .run_jj(["bookmark", "create", "-r@", "aaa-local"])        .success();    work_dir        .run_jj(["bookmark", "create", "-r@", "bbb-local"])        .success();     // add various remote branches    work_dir        .run_jj([            "git",            "remote",            "add",            "origin",            origin_git_repo_path.to_str().unwrap(),        ])        .success();    work_dir        .run_jj(["bookmark", "create", "-r@", "aaa-tracked"])        .success();    work_dir        .run_jj(["desc", "-r", "aaa-tracked", "-m", "x"])        .success();    work_dir        .run_jj(["bookmark", "create", "-r@", "bbb-tracked"])        .success();    work_dir        .run_jj(["desc", "-r", "bbb-tracked", "-m", "x"])        .success();    work_dir        .run_jj(["git", "push", "--allow-new", "--bookmark", "glob:*-tracked"])        .success();     origin_dir        .run_jj(["bookmark", "create", "-r@", "aaa-untracked"])        .success();    origin_dir        .run_jj(["desc", "-r", "aaa-untracked", "-m", "x"])        .success();    origin_dir        .run_jj(["bookmark", "create", "-r@", "bbb-untracked"])        .success();    origin_dir        .run_jj(["desc", "-r", "bbb-untracked", "-m", "x"])        .success();    origin_dir.run_jj(["git", "export"]).success();    work_dir.run_jj(["git", "fetch"]).success();     let mut test_env = test_env;    // Every shell hook is a little different, e.g. the zsh hooks add some    // additional environment variables. But this is irrelevant for the purpose    // of testing our own logic, so it's fine to test a single shell only.    test_env.add_env_var("COMPLETE", "fish");    let test_env = test_env;    let work_dir = test_env.work_dir("repo");     let output = work_dir.run_jj(["--", "jj", "bookmark", "rename", ""]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    bbb-local	x    bbb-tracked	x    --repository	Path to repository to operate on    --ignore-working-copy	Don't snapshot the working copy, and don't update it    --ignore-immutable	Allow rewriting immutable commits    --at-operation	Operation to load the repo at    --debug	Enable debug logging    --color	When to colorize output    --quiet	Silence non-primary command output    --no-pager	Disable the pager    --config	Additional configuration options (can be repeated)    --config-file	Additional configuration files (can be repeated)    --help	Print help (see more with '--help')    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "bookmark", "rename", "a"]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "bookmark", "delete", "a"]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "bookmark", "forget", "a"]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    aaa-untracked    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "bookmark", "list", "--bookmark", "a"]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    aaa-untracked    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "bookmark", "move", "a"]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "bookmark", "set", "a"]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "bookmark", "track", "a"]);    insta::assert_snapshot!(output, @r"    aaa-untracked@origin	x    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "bookmark", "untrack", "a"]);    insta::assert_snapshot!(output, @r"    aaa-tracked@origin	x    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "git", "push", "-b", "a"]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "git", "fetch", "-b", "a"]);    insta::assert_snapshot!(output, @r"    aaa-local	x    aaa-tracked	x    aaa-untracked    [EOF]    ");} #[test]fn test_global_arg_repository_is_respected() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");     work_dir        .run_jj(["bookmark", "create", "-r@", "aaa"])        .success();     let mut test_env = test_env;    test_env.add_env_var("COMPLETE", "fish");    let test_env = test_env;     let output = test_env.run_jj_in(        ".",        [            "--",            "jj",            "--repository",            "repo",            "bookmark",            "rename",            "a",        ],    );    insta::assert_snapshot!(output, @r"    aaa	(no description set)    [EOF]    ");} #[test]fn test_aliases_are_resolved() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");     work_dir        .run_jj(["bookmark", "create", "-r@", "aaa"])        .success();     // user config alias    test_env.add_config(r#"aliases.b = ["bookmark"]"#);    // repo config alias    work_dir        .run_jj(["config", "set", "--repo", "aliases.b2", "['bookmark']"])        .success();     let mut test_env = test_env;    test_env.add_env_var("COMPLETE", "fish");    let test_env = test_env;    let work_dir = test_env.work_dir("repo");     let output = work_dir.run_jj(["--", "jj", "b", "rename", "a"]);    insta::assert_snapshot!(output, @r"    aaa	(no description set)    [EOF]    ");     let output = work_dir.run_jj(["--", "jj", "b2", "rename", "a"]);    insta::assert_snapshot!(output, @r"    aaa	(no description set)    [EOF]    ");} #[test]fn test_completions_are_generated() {    let mut test_env = TestEnvironment::default();    test_env.add_env_var("COMPLETE", "fish");    let mut insta_settings = insta::Settings::clone_current();    insta_settings.add_filter(r"(--arguments) .*", "$1 .."); // omit path to jj binary    let _guard = insta_settings.bind_to_scope();     let output = test_env.run_jj_in(".", [""; 0]);    insta::assert_snapshot!(output, @r"    complete --keep-order --exclusive --command jj --arguments ..    [EOF]    ");    let output = test_env.run_jj_in(".", ["--"]);    insta::assert_snapshot!(output, @r"    complete --keep-order --exclusive --command jj --arguments ..    [EOF]    ");} #[test]fn test_zsh_completion() {    let mut test_env = TestEnvironment::default();    test_env.add_env_var("COMPLETE", "zsh");     // ["--", "jj"]    //        ^^^^ index = 0    let complete_at = |index: usize, args: &[&str]| {        test_env.run_jj_with(|cmd| {            cmd.args(args)                .env("_CLAP_COMPLETE_INDEX", index.to_string())        })    };     // Command names should be suggested. If the default command were expanded,    // only "log" would be listed.    let output = complete_at(1, &["--", "jj"]);    insta::assert_snapshot!(        output.normalize_stdout_with(|s| s.split_inclusive('\n').take(2).collect()), @r"    abandon:Abandon a revision    absorb:Move changes from a revision into the stack of mutable revisions    [EOF]    ");    let output = complete_at(2, &["--", "jj", "--no-pager"]);    insta::assert_snapshot!(        output.normalize_stdout_with(|s| s.split_inclusive('\n').take(2).collect()), @r"    abandon:Abandon a revision    absorb:Move changes from a revision into the stack of mutable revisions    [EOF]    ");     let output = complete_at(1, &["--", "jj", "b"]);    insta::assert_snapshot!(output, @"bookmark:Manage bookmarks [default alias: b][EOF]");} #[test]fn test_remote_names() {    let mut test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init"]).success();     test_env        .run_jj_in(            ".",            ["git", "remote", "add", "origin", "git@git.local:user/repo"],        )        .success();     test_env.add_env_var("COMPLETE", "fish");     let output = test_env.run_jj_in(".", ["--", "jj", "git", "remote", "remove", "o"]);    insta::assert_snapshot!(output, @r"    origin    [EOF]    ");     let output = test_env.run_jj_in(".", ["--", "jj", "git", "remote", "rename", "o"]);    insta::assert_snapshot!(output, @r"    origin    [EOF]    ");     let output = test_env.run_jj_in(".", ["--", "jj", "git", "remote", "set-url", "o"]);    insta::assert_snapshot!(output, @r"    origin    [EOF]    ");     let output = test_env.run_jj_in(".", ["--", "jj", "git", "push", "--remote", "o"]);    insta::assert_snapshot!(output, @r"    origin    [EOF]    ");     let output = test_env.run_jj_in(".", ["--", "jj", "git", "fetch", "--remote", "o"]);    insta::assert_snapshot!(output, @r"    origin    [EOF]    ");     let output = test_env.run_jj_in(".", ["--", "jj", "bookmark", "list", "--remote", "o"]);    insta::assert_snapshot!(output, @r"    origin    [EOF]    ");} #[test]fn test_aliases_are_completed() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");     // user config alias    test_env.add_config(r#"aliases.user-alias = ["bookmark"]"#);    // repo config alias    work_dir        .run_jj([            "config",            "set",            "--repo",            "aliases.repo-alias",            "['bookmark']",        ])        .success();     let mut test_env = test_env;    test_env.add_env_var("COMPLETE", "fish");    let test_env = test_env;    let work_dir = test_env.work_dir("repo");     let output = work_dir.run_jj(["--", "jj", "user-al"]);    insta::assert_snapshot!(output, @r"    user-alias    [EOF]    ");     // make sure --repository flag is respected    let output = test_env.run_jj_in(        ".",        [            "--",            "jj",            "--repository",            work_dir.root().to_str().unwrap(),            "repo-al",        ],    );    insta::assert_snapshot!(output, @r"    repo-alias    [EOF]    ");     // cannot load aliases from --config flag    let output = test_env.run_jj_in(        ".",        [            "--",            "jj",            "--config=aliases.cli-alias=['bookmark']",            "cli-al",        ],    );    insta::assert_snapshot!(output, @"");} #[test]fn test_revisions() {    let test_env = TestEnvironment::default();    test_env.run_jj_in(".", ["git", "init", "repo"]).success();    let work_dir = test_env.work_dir("repo");     // create remote to test remote branches    test_env.run_jj_in(".", ["git", "init", "origin"]).success();    let origin_dir = test_env.work_dir("origin");    let origin_git_repo_path = origin_dir        .root()        .join(".jj")        .join("repo")        .join("store")        .join("git");    work_dir        .run_jj([            "git",            "remote",            "add",            "origin",            origin_git_repo_path.to_str().unwrap(),        ])        .success();    origin_dir        .run_jj(["b", "c", "-r@", "remote_bookmark"])        .success();    origin_dir        .run_jj(["commit", "-m", "remote_commit"])        .success();    origin_dir.run_jj(["git", "export"]).success();    work_dir.run_jj(["git", "fetch"]).success();     work_dir        .run_jj(["b", "c", "-r@", "immutable_bookmark"])        .success();    work_dir.run_jj(["commit", "-m", "immutable"]).success();    test_env.add_config(r#"revset-aliases."immutable_heads()" = "immutable_bookmark""#);    test_env.add_config(r#"revset-aliases."siblings" = "@-+ ~@""#);    test_env.add_config(        r#"revset-aliases."alias_with_newline" = '''    roots(        conflicts()    )    '''"#,    );     work_dir        .run_jj(["b", "c", "-r@", "mutable_bookmark"])        .success();    work_dir.run_jj(["commit", "-m", "mutable"]).success();     work_dir        .run_jj(["describe", "-m", "working_copy"])        .success();     let mut test_env = test_env;    test_env.add_env_var("COMPLETE", "fish");    let test_env = test_env;    let work_dir = test_env.work_dir("repo");     // There are _a lot_ of commands and arguments accepting revisions.    // Let's not test all of them. Having at least one test per variation of    // completion function should be sufficient.     // complete all revisions    let output = work_dir.run_jj(["--", "jj", "diff", "--from", ""]);    insta::assert_snapshot!(output, @r"    immutable_bookmark	immutable    mutable_bookmark	mutable    k	working_copy    y	mutable    q	immutable    zq	remote_commit    zz	(no description set)    remote_bookmark@origin	remote_commit    alias_with_newline	    roots(    siblings	@-+ ~@    [EOF]    ");     // complete only mutable revisions    let output = work_dir.run_jj(["--", "jj", "squash", "--into", ""]);    insta::assert_snapshot!(output, @r"    mutable_bookmark	mutable    k	working_copy    y	mutable    zq	remote_commit

Lines 1–500 of 1049.