// 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 std::path::PathBuf; use insta::assert_snapshot;use itertools::Itertools;use regex::Regex; use crate::common::TestEnvironment; #[test]fn test_config_list_single() { let test_env = TestEnvironment::default(); test_env.add_config( r#" [test-table] somekey = "some value" "#, ); let stdout = test_env.jj_cmd_success( test_env.env_root(), &["config", "list", "test-table.somekey"], ); insta::assert_snapshot!(stdout, @r###" test-table.somekey = "some value" "###); let stdout = test_env.jj_cmd_success( test_env.env_root(), &["config", "list", r#"-Tname ++ "\n""#, "test-table.somekey"], ); insta::assert_snapshot!(stdout, @r###" test-table.somekey "###);} #[test]fn test_config_list_nonexistent() { let test_env = TestEnvironment::default(); let (stdout, stderr) = test_env.jj_cmd_ok( test_env.env_root(), &["config", "list", "nonexistent-test-key"], ); insta::assert_snapshot!(stdout, @""); insta::assert_snapshot!(stderr, @r###" Warning: No matching config key for nonexistent-test-key "###);} #[test]fn test_config_list_table() { let test_env = TestEnvironment::default(); test_env.add_config( r#" [test-table] x = true y.foo = "abc" y.bar = 123 "z"."with space"."function()" = 5 "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list", "test-table"]); insta::assert_snapshot!( stdout, @r###" test-table.x = true test-table.y.bar = 123 test-table.y.foo = "abc" test-table.z."with space"."function()" = 5 "###);} #[test]fn test_config_list_array() { let test_env = TestEnvironment::default(); test_env.add_config( r#" test-array = [1, "b", 3.4] "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list", "test-array"]); insta::assert_snapshot!(stdout, @r###" test-array = [1, "b", 3.4] "###);} #[test]fn test_config_list_inline_table() { let test_env = TestEnvironment::default(); test_env.add_config( r#" [[test-table]] x = 1 [[test-table]] y = ["z"] z."key=with whitespace" = [] "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list", "test-table"]); insta::assert_snapshot!(stdout, @r###" test-table = [{ x = 1 }, { y = ["z"], z = { "key=with whitespace" = [] } }] "###);} #[test]fn test_config_list_all() { let test_env = TestEnvironment::default(); test_env.add_config( r#" test-val = [1, 2, 3] [test-table] x = true y.foo = "abc" y.bar = 123 "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list"]); insta::assert_snapshot!( find_stdout_lines(r"(test-val|test-table\b[^=]*)", &stdout), @r###" test-table.x = true test-table.y.bar = 123 test-table.y.foo = "abc" test-val = [1, 2, 3] "###);} #[test]fn test_config_list_multiline_string() { let test_env = TestEnvironment::default(); test_env.add_config( r#" multiline = '''foobar''' "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list", "multiline"]); insta::assert_snapshot!(stdout, @r###" multiline = """ foo bar """ "###); let stdout = test_env.jj_cmd_success( test_env.env_root(), &[ "config", "list", "multiline", "--include-overridden", "--config-toml=multiline='single'", ], ); insta::assert_snapshot!(stdout, @r###" # multiline = """ # foo # bar # """ multiline = "single" "###);} #[test]fn test_config_list_layer() { let mut test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); let user_config_path = test_env.config_path().join("config.toml"); test_env.set_config_path(user_config_path.clone()); let repo_path = test_env.env_root().join("repo"); // User test_env.jj_cmd_ok( &repo_path, &["config", "set", "--user", "test-key", "test-val"], ); test_env.jj_cmd_ok( &repo_path, &[ "config", "set", "--user", "test-layered-key", "test-original-val", ], ); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", "--user"]); insta::assert_snapshot!(stdout, @r###" test-key = "test-val" test-layered-key = "test-original-val" "###); // Repo test_env.jj_cmd_ok( &repo_path, &[ "config", "set", "--repo", "test-layered-key", "test-layered-val", ], ); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", "--user"]); insta::assert_snapshot!(stdout, @r###" test-key = "test-val" "###); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", "--repo"]); insta::assert_snapshot!(stdout, @r###" test-layered-key = "test-layered-val" "###);} #[test]fn test_config_layer_override_default() { let test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); let repo_path = test_env.env_root().join("repo"); let config_key = "merge-tools.vimdiff.program"; // Default let stdout = test_env.jj_cmd_success( &repo_path, &["config", "list", config_key, "--include-defaults"], ); insta::assert_snapshot!(stdout, @r###" merge-tools.vimdiff.program = "vim" "###); // User test_env.add_config(&format!("{config_key} = {value:?}\n", value = "user")); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" merge-tools.vimdiff.program = "user" "###); // Repo std::fs::write( repo_path.join(".jj/repo/config.toml"), format!("{config_key} = {value:?}\n", value = "repo"), ) .unwrap(); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" merge-tools.vimdiff.program = "repo" "###); // Command argument let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", config_key, "--config-toml", &format!("{config_key}={value:?}", value = "command-arg"), ], ); insta::assert_snapshot!(stdout, @r###" merge-tools.vimdiff.program = "command-arg" "###); // Allow printing overridden values let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", config_key, "--include-overridden", "--config-toml", &format!("{config_key}={value:?}", value = "command-arg"), ], ); insta::assert_snapshot!(stdout, @r###" # merge-tools.vimdiff.program = "user" # merge-tools.vimdiff.program = "repo" merge-tools.vimdiff.program = "command-arg" "###); let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", "--color=always", config_key, "--include-overridden", ], ); insta::assert_snapshot!(stdout, @r###" [38;5;8m# merge-tools.vimdiff.program = "user"[39m [38;5;2mmerge-tools.vimdiff.program[39m = [38;5;3m"repo"[39m "###);} #[test]fn test_config_layer_override_env() { let mut test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); let repo_path = test_env.env_root().join("repo"); let config_key = "ui.editor"; // Environment base test_env.add_env_var("EDITOR", "env-base"); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "env-base" "###); // User test_env.add_config(&format!("{config_key} = {value:?}\n", value = "user")); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "user" "###); // Repo std::fs::write( repo_path.join(".jj/repo/config.toml"), format!("{config_key} = {value:?}\n", value = "repo"), ) .unwrap(); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "repo" "###); // Environment override test_env.add_env_var("JJ_EDITOR", "env-override"); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "env-override" "###); // Command argument let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", config_key, "--config-toml", &format!("{config_key}={value:?}", value = "command-arg"), ], ); insta::assert_snapshot!(stdout, @r###" ui.editor = "command-arg" "###); // Allow printing overridden values let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", config_key, "--include-overridden", "--config-toml", &format!("{config_key}={value:?}", value = "command-arg"), ], ); insta::assert_snapshot!(stdout, @r###" # ui.editor = "env-base" # ui.editor = "user" # ui.editor = "repo" # ui.editor = "env-override" ui.editor = "command-arg" "###);} #[test]fn test_config_layer_workspace() { let test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "main"]); let main_path = test_env.env_root().join("main"); let secondary_path = test_env.env_root().join("secondary"); let config_key = "ui.editor"; std::fs::write(main_path.join("file"), "contents").unwrap(); test_env.jj_cmd_ok(&main_path, &["new"]); test_env.jj_cmd_ok( &main_path, &["workspace", "add", "--name", "second", "../secondary"], ); // Repo std::fs::write( main_path.join(".jj/repo/config.toml"), format!("{config_key} = {value:?}\n", value = "main-repo"), ) .unwrap(); let stdout = test_env.jj_cmd_success(&main_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "main-repo" "###); let stdout = test_env.jj_cmd_success(&secondary_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "main-repo" "###);} #[test]fn test_config_set_bad_opts() { let test_env = TestEnvironment::default(); let stderr = test_env.jj_cmd_cli_error(test_env.env_root(), &["config", "set"]); insta::assert_snapshot!(stderr, @r###" error: the following required arguments were not provided: <--user|--repo> <NAME> <VALUE> Usage: jj config set <--user|--repo> <NAME> <VALUE> For more information, try '--help'. "###); let stderr = test_env.jj_cmd_cli_error(test_env.env_root(), &["config", "set", "--user", "", "x"]); insta::assert_snapshot!(stderr, @r###" error: invalid value '' for '<NAME>': TOML parse error at line 1, column 1 | 1 | | ^ invalid key For more information, try '--help'. "###);} #[test]fn test_config_set_for_user() { let mut test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); // Point to a config file since `config set` can't handle directories. let user_config_path = test_env.config_path().join("config.toml"); test_env.set_config_path(user_config_path.clone()); let repo_path = test_env.env_root().join("repo"); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--user", "test-key", "test-val"], ); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--user", "test-table.foo", "true"], ); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--user", "test-table.'bar()'", "0"], ); // Ensure test-key successfully written to user config. let user_config_toml = std::fs::read_to_string(&user_config_path) .unwrap_or_else(|_| panic!("Failed to read file {}", user_config_path.display())); insta::assert_snapshot!(user_config_toml, @r###" test-key = "test-val" [test-table] foo = true "bar()" = 0 "###);} #[test]fn test_config_set_for_repo() { let test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); let repo_path = test_env.env_root().join("repo"); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--repo", "test-key", "test-val"], ); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--repo", "test-table.foo", "true"], ); // Ensure test-key successfully written to user config.Lines 1–500 of 991. Load more
// 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 std::path::PathBuf; use insta::assert_snapshot; use itertools::Itertools; use regex::Regex; use crate::common::TestEnvironment; #[test] fn test_config_list_single() { let test_env = TestEnvironment::default(); test_env.add_config( r#" [test-table] somekey = "some value" "#, ); let stdout = test_env.jj_cmd_success( test_env.env_root(), &["config", "list", "test-table.somekey"], ); insta::assert_snapshot!(stdout, @r###" test-table.somekey = "some value" "###); let stdout = test_env.jj_cmd_success( test_env.env_root(), &["config", "list", r#"-Tname ++ "\n""#, "test-table.somekey"], ); insta::assert_snapshot!(stdout, @r###" test-table.somekey "###); } #[test] fn test_config_list_nonexistent() { let test_env = TestEnvironment::default(); let (stdout, stderr) = test_env.jj_cmd_ok( test_env.env_root(), &["config", "list", "nonexistent-test-key"], ); insta::assert_snapshot!(stdout, @""); insta::assert_snapshot!(stderr, @r###" Warning: No matching config key for nonexistent-test-key "###); } #[test] fn test_config_list_table() { let test_env = TestEnvironment::default(); test_env.add_config( r#" [test-table] x = true y.foo = "abc" y.bar = 123 "z"."with space"."function()" = 5 "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list", "test-table"]); insta::assert_snapshot!( stdout, @r###" test-table.x = true test-table.y.bar = 123 test-table.y.foo = "abc" test-table.z."with space"."function()" = 5 "###); } #[test] fn test_config_list_array() { let test_env = TestEnvironment::default(); test_env.add_config( r#" test-array = [1, "b", 3.4] "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list", "test-array"]); insta::assert_snapshot!(stdout, @r###" test-array = [1, "b", 3.4] "###); } #[test] fn test_config_list_inline_table() { let test_env = TestEnvironment::default(); test_env.add_config( r#" [[test-table]] x = 1 [[test-table]] y = ["z"] z."key=with whitespace" = [] "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list", "test-table"]); insta::assert_snapshot!(stdout, @r###" test-table = [{ x = 1 }, { y = ["z"], z = { "key=with whitespace" = [] } }] "###); } #[test] fn test_config_list_all() { let test_env = TestEnvironment::default(); test_env.add_config( r#" test-val = [1, 2, 3] [test-table] x = true y.foo = "abc" y.bar = 123 "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list"]); insta::assert_snapshot!( find_stdout_lines(r"(test-val|test-table\b[^=]*)", &stdout), @r###" test-table.x = true test-table.y.bar = 123 test-table.y.foo = "abc" test-val = [1, 2, 3] "###); } #[test] fn test_config_list_multiline_string() { let test_env = TestEnvironment::default(); test_env.add_config( r#" multiline = ''' foo bar ''' "#, ); let stdout = test_env.jj_cmd_success(test_env.env_root(), &["config", "list", "multiline"]); insta::assert_snapshot!(stdout, @r###" multiline = """ foo bar """ "###); let stdout = test_env.jj_cmd_success( test_env.env_root(), &[ "config", "list", "multiline", "--include-overridden", "--config-toml=multiline='single'", ], ); insta::assert_snapshot!(stdout, @r###" # multiline = """ # foo # bar # """ multiline = "single" "###); } #[test] fn test_config_list_layer() { let mut test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); let user_config_path = test_env.config_path().join("config.toml"); test_env.set_config_path(user_config_path.clone()); let repo_path = test_env.env_root().join("repo"); // User test_env.jj_cmd_ok( &repo_path, &["config", "set", "--user", "test-key", "test-val"], ); test_env.jj_cmd_ok( &repo_path, &[ "config", "set", "--user", "test-layered-key", "test-original-val", ], ); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", "--user"]); insta::assert_snapshot!(stdout, @r###" test-key = "test-val" test-layered-key = "test-original-val" "###); // Repo test_env.jj_cmd_ok( &repo_path, &[ "config", "set", "--repo", "test-layered-key", "test-layered-val", ], ); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", "--user"]); insta::assert_snapshot!(stdout, @r###" test-key = "test-val" "###); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", "--repo"]); insta::assert_snapshot!(stdout, @r###" test-layered-key = "test-layered-val" "###); } #[test] fn test_config_layer_override_default() { let test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); let repo_path = test_env.env_root().join("repo"); let config_key = "merge-tools.vimdiff.program"; // Default let stdout = test_env.jj_cmd_success( &repo_path, &["config", "list", config_key, "--include-defaults"], ); insta::assert_snapshot!(stdout, @r###" merge-tools.vimdiff.program = "vim" "###); // User test_env.add_config(&format!("{config_key} = {value:?}\n", value = "user")); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" merge-tools.vimdiff.program = "user" "###); // Repo std::fs::write( repo_path.join(".jj/repo/config.toml"), format!("{config_key} = {value:?}\n", value = "repo"), ) .unwrap(); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" merge-tools.vimdiff.program = "repo" "###); // Command argument let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", config_key, "--config-toml", &format!("{config_key}={value:?}", value = "command-arg"), ], ); insta::assert_snapshot!(stdout, @r###" merge-tools.vimdiff.program = "command-arg" "###); // Allow printing overridden values let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", config_key, "--include-overridden", "--config-toml", &format!("{config_key}={value:?}", value = "command-arg"), ], ); insta::assert_snapshot!(stdout, @r###" # merge-tools.vimdiff.program = "user" # merge-tools.vimdiff.program = "repo" merge-tools.vimdiff.program = "command-arg" "###); let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", "--color=always", config_key, "--include-overridden", ], ); insta::assert_snapshot!(stdout, @r###" [38;5;8m# merge-tools.vimdiff.program = "user"[39m [38;5;2mmerge-tools.vimdiff.program[39m = [38;5;3m"repo"[39m "###); } #[test] fn test_config_layer_override_env() { let mut test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); let repo_path = test_env.env_root().join("repo"); let config_key = "ui.editor"; // Environment base test_env.add_env_var("EDITOR", "env-base"); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "env-base" "###); // User test_env.add_config(&format!("{config_key} = {value:?}\n", value = "user")); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "user" "###); // Repo std::fs::write( repo_path.join(".jj/repo/config.toml"), format!("{config_key} = {value:?}\n", value = "repo"), ) .unwrap(); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "repo" "###); // Environment override test_env.add_env_var("JJ_EDITOR", "env-override"); let stdout = test_env.jj_cmd_success(&repo_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "env-override" "###); // Command argument let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", config_key, "--config-toml", &format!("{config_key}={value:?}", value = "command-arg"), ], ); insta::assert_snapshot!(stdout, @r###" ui.editor = "command-arg" "###); // Allow printing overridden values let stdout = test_env.jj_cmd_success( &repo_path, &[ "config", "list", config_key, "--include-overridden", "--config-toml", &format!("{config_key}={value:?}", value = "command-arg"), ], ); insta::assert_snapshot!(stdout, @r###" # ui.editor = "env-base" # ui.editor = "user" # ui.editor = "repo" # ui.editor = "env-override" ui.editor = "command-arg" "###); } #[test] fn test_config_layer_workspace() { let test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "main"]); let main_path = test_env.env_root().join("main"); let secondary_path = test_env.env_root().join("secondary"); let config_key = "ui.editor"; std::fs::write(main_path.join("file"), "contents").unwrap(); test_env.jj_cmd_ok(&main_path, &["new"]); test_env.jj_cmd_ok( &main_path, &["workspace", "add", "--name", "second", "../secondary"], ); // Repo std::fs::write( main_path.join(".jj/repo/config.toml"), format!("{config_key} = {value:?}\n", value = "main-repo"), ) .unwrap(); let stdout = test_env.jj_cmd_success(&main_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "main-repo" "###); let stdout = test_env.jj_cmd_success(&secondary_path, &["config", "list", config_key]); insta::assert_snapshot!(stdout, @r###" ui.editor = "main-repo" "###); } #[test] fn test_config_set_bad_opts() { let test_env = TestEnvironment::default(); let stderr = test_env.jj_cmd_cli_error(test_env.env_root(), &["config", "set"]); insta::assert_snapshot!(stderr, @r###" error: the following required arguments were not provided: <--user|--repo> <NAME> <VALUE> Usage: jj config set <--user|--repo> <NAME> <VALUE> For more information, try '--help'. "###); let stderr = test_env.jj_cmd_cli_error(test_env.env_root(), &["config", "set", "--user", "", "x"]); insta::assert_snapshot!(stderr, @r###" error: invalid value '' for '<NAME>': TOML parse error at line 1, column 1 | 1 | | ^ invalid key For more information, try '--help'. "###); } #[test] fn test_config_set_for_user() { let mut test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); // Point to a config file since `config set` can't handle directories. let user_config_path = test_env.config_path().join("config.toml"); test_env.set_config_path(user_config_path.clone()); let repo_path = test_env.env_root().join("repo"); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--user", "test-key", "test-val"], ); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--user", "test-table.foo", "true"], ); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--user", "test-table.'bar()'", "0"], ); // Ensure test-key successfully written to user config. let user_config_toml = std::fs::read_to_string(&user_config_path) .unwrap_or_else(|_| panic!("Failed to read file {}", user_config_path.display())); insta::assert_snapshot!(user_config_toml, @r###" test-key = "test-val" [test-table] foo = true "bar()" = 0 "###); } #[test] fn test_config_set_for_repo() { let test_env = TestEnvironment::default(); test_env.jj_cmd_ok(test_env.env_root(), &["git", "init", "repo"]); let repo_path = test_env.env_root().join("repo"); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--repo", "test-key", "test-val"], ); test_env.jj_cmd_ok( &repo_path, &["config", "set", "--repo", "test-table.foo", "true"], ); // Ensure test-key successfully written to user config.