forked from mirrors/jj
cli: allow overwriting non-scalar with jj config set
Before this patch, it was an error to run `jj config set --user foo '[1]'` twice. But it's only been broken since the previous commit because '[1]' was interpreted as a string before then.
This commit is contained in:
parent
f654801c20
commit
ebec82ee0c
2 changed files with 25 additions and 7 deletions
|
@ -2199,13 +2199,13 @@ pub fn write_config_value_to_file(
|
||||||
))
|
))
|
||||||
})?;
|
})?;
|
||||||
}
|
}
|
||||||
// Error out if overwriting non-scalar value for key (table or array).
|
// Error out if overwriting non-scalar value for key (table or array) with
|
||||||
|
// scalar.
|
||||||
match target_table.get(last_key_part) {
|
match target_table.get(last_key_part) {
|
||||||
None | Some(toml_edit::Item::None) => {}
|
None | Some(toml_edit::Item::None | toml_edit::Item::Value(_)) => {}
|
||||||
Some(toml_edit::Item::Value(val)) if !val.is_array() && !val.is_inline_table() => {}
|
Some(toml_edit::Item::Table(_) | toml_edit::Item::ArrayOfTables(_)) => {
|
||||||
_ => {
|
|
||||||
return Err(user_error(format!(
|
return Err(user_error(format!(
|
||||||
"Failed to set {key}: would overwrite entire non-scalar value with scalar"
|
"Failed to set {key}: would overwrite entire table"
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -340,7 +340,7 @@ fn test_config_set_for_repo() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_config_set_toml_types() {
|
fn test_config_set_toml_types() {
|
||||||
let mut test_env = TestEnvironment::default();
|
let mut test_env = TestEnvironment::default();
|
||||||
test_env.jj_cmd_success(test_env.env_root(), &["init", "repo", "--git"]);
|
test_env.jj_cmd_ok(test_env.env_root(), &["init", "repo", "--git"]);
|
||||||
let user_config_path = test_env.config_path().join("config.toml");
|
let user_config_path = test_env.config_path().join("config.toml");
|
||||||
test_env.set_config_path(user_config_path.clone());
|
test_env.set_config_path(user_config_path.clone());
|
||||||
let repo_path = test_env.env_root().join("repo");
|
let repo_path = test_env.env_root().join("repo");
|
||||||
|
@ -382,8 +382,26 @@ fn test_config_set_type_mismatch() {
|
||||||
&["config", "set", "--user", "test-table", "not-a-table"],
|
&["config", "set", "--user", "test-table", "not-a-table"],
|
||||||
);
|
);
|
||||||
insta::assert_snapshot!(stderr, @r###"
|
insta::assert_snapshot!(stderr, @r###"
|
||||||
Error: Failed to set test-table: would overwrite entire non-scalar value with scalar
|
Error: Failed to set test-table: would overwrite entire table
|
||||||
"###);
|
"###);
|
||||||
|
|
||||||
|
// But it's fine to overwrite arrays and inline tables
|
||||||
|
test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&["config", "set", "--user", "test-table.array", "[1,2,3]"],
|
||||||
|
);
|
||||||
|
test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&["config", "set", "--user", "test-table.array", "[4,5,6]"],
|
||||||
|
);
|
||||||
|
test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&["config", "set", "--user", "test-table.inline", "{ x = 42}"],
|
||||||
|
);
|
||||||
|
test_env.jj_cmd_success(
|
||||||
|
&repo_path,
|
||||||
|
&["config", "set", "--user", "test-table.inline", "42"],
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in a new issue