// 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_commitLines 1–500 of 1049. Load more
// 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