Add edit JSON button (#39732)

Closes #ISSUE

Release Notes:

- N/A *or* Added/Fixed/Improved ...
This commit is contained in:
Mikayla Maki
2025-10-08 06:23:43 +00:00
committed by GitHub
parent 1265b229a9
commit 989d172cfc
7 changed files with 332 additions and 225 deletions
+36 -35
View File
@@ -162,8 +162,8 @@ pub enum SettingsFile {
User,
Server,
Default,
/// Local also represents project settings in ssh projects as well as local projects
Local((WorktreeId, Arc<RelPath>)),
/// Represents project settings in ssh projects as well as local projects
Project((WorktreeId, Arc<RelPath>)),
}
#[derive(Clone)]
@@ -469,7 +469,7 @@ impl SettingsStore {
// rev because these are sorted by path, so highest precedence is last
.rev()
.cloned()
.map(SettingsFile::Local),
.map(SettingsFile::Project),
);
if self.server_settings.is_some() {
@@ -496,7 +496,7 @@ impl SettingsStore {
.map(|settings| settings.content.as_ref()),
SettingsFile::Default => Some(self.default_settings.as_ref()),
SettingsFile::Server => self.server_settings.as_deref(),
SettingsFile::Local(ref key) => self.local_settings.get(key),
SettingsFile::Project(ref key) => self.local_settings.get(key),
}
}
@@ -515,8 +515,8 @@ impl SettingsStore {
continue;
}
if let SettingsFile::Local((wt_id, ref path)) = file
&& let SettingsFile::Local((target_wt_id, ref target_path)) = target_file
if let SettingsFile::Project((wt_id, ref path)) = file
&& let SettingsFile::Project((target_wt_id, ref target_path)) = target_file
&& (wt_id != target_wt_id || !target_path.starts_with(path))
{
// if requesting value from a local file, don't return values from local files in different worktrees
@@ -543,7 +543,7 @@ impl SettingsStore {
target_file: SettingsFile,
pick: fn(&SettingsContent) -> &Option<T>,
) -> (SettingsFile, Option<&T>) {
// TODO: Add a metadata field for overriding the "overrides" tag, for contextually different settings
// todo(settings_ui): Add a metadata field for overriding the "overrides" tag, for contextually different settings
// e.g. disable AI isn't overridden, or a vec that gets extended instead or some such
// todo(settings_ui) cache all files
@@ -556,9 +556,9 @@ impl SettingsStore {
}
found_file = true;
if let SettingsFile::Local((wt_id, ref path)) = file
&& let SettingsFile::Local((target_wt_id, ref target_path)) = target_file
&& (wt_id != target_wt_id || !target_path.starts_with(&path))
if let SettingsFile::Project((worktree_id, ref path)) = file
&& let SettingsFile::Project((target_worktree_id, ref target_path)) = target_file
&& (worktree_id != target_worktree_id || !target_path.starts_with(&path))
{
// if requesting value from a local file, don't return values from local files in different worktrees
continue;
@@ -1718,7 +1718,7 @@ mod tests {
let default_value = get(&store.default_settings).unwrap();
assert_eq!(
store.get_value_from_file(SettingsFile::Local(local.clone()), get),
store.get_value_from_file(SettingsFile::Project(local.clone()), get),
(SettingsFile::User, Some(&0))
);
assert_eq!(
@@ -1727,7 +1727,7 @@ mod tests {
);
store.set_user_settings(r#"{}"#, cx).unwrap();
assert_eq!(
store.get_value_from_file(SettingsFile::Local(local.clone()), get),
store.get_value_from_file(SettingsFile::Project(local.clone()), get),
(SettingsFile::Default, Some(&default_value))
);
store
@@ -1740,8 +1740,8 @@ mod tests {
)
.unwrap();
assert_eq!(
store.get_value_from_file(SettingsFile::Local(local.clone()), get),
(SettingsFile::Local(local), Some(&80))
store.get_value_from_file(SettingsFile::Project(local.clone()), get),
(SettingsFile::Project(local), Some(&80))
);
assert_eq!(
store.get_value_from_file(SettingsFile::User, get),
@@ -1821,12 +1821,12 @@ mod tests {
// each local child should only inherit from it's parent
assert_eq!(
store.get_value_from_file(SettingsFile::Local(local_2_child), get),
(SettingsFile::Local(local_2), Some(&2))
store.get_value_from_file(SettingsFile::Project(local_2_child), get),
(SettingsFile::Project(local_2), Some(&2))
);
assert_eq!(
store.get_value_from_file(SettingsFile::Local(local_1_child.clone()), get),
(SettingsFile::Local(local_1.clone()), Some(&1))
store.get_value_from_file(SettingsFile::Project(local_1_child.clone()), get),
(SettingsFile::Project(local_1.clone()), Some(&1))
);
// adjacent children should be treated as siblings not inherit from each other
@@ -1851,8 +1851,8 @@ mod tests {
.unwrap();
assert_eq!(
store.get_value_from_file(SettingsFile::Local(local_1_adjacent_child.clone()), get),
(SettingsFile::Local(local_1.clone()), Some(&1))
store.get_value_from_file(SettingsFile::Project(local_1_adjacent_child.clone()), get),
(SettingsFile::Project(local_1.clone()), Some(&1))
);
store
.set_local_settings(
@@ -1873,8 +1873,8 @@ mod tests {
)
.unwrap();
assert_eq!(
store.get_value_from_file(SettingsFile::Local(local_1_child), get),
(SettingsFile::Local(local_1), Some(&1))
store.get_value_from_file(SettingsFile::Project(local_1_child), get),
(SettingsFile::Project(local_1), Some(&1))
);
}
@@ -1950,9 +1950,9 @@ mod tests {
overrides,
vec![
SettingsFile::User,
SettingsFile::Local(wt0_root.clone()),
SettingsFile::Local(wt0_child1.clone()),
SettingsFile::Local(wt1_root.clone()),
SettingsFile::Project(wt0_root.clone()),
SettingsFile::Project(wt0_child1.clone()),
SettingsFile::Project(wt1_root.clone()),
]
);
@@ -1960,25 +1960,26 @@ mod tests {
assert_eq!(
overrides,
vec![
SettingsFile::Local(wt0_root.clone()),
SettingsFile::Local(wt0_child1.clone()),
SettingsFile::Local(wt1_root.clone()),
SettingsFile::Project(wt0_root.clone()),
SettingsFile::Project(wt0_child1.clone()),
SettingsFile::Project(wt1_root.clone()),
]
);
let overrides = store.get_overrides_for_field(SettingsFile::Local(wt0_root), get);
let overrides = store.get_overrides_for_field(SettingsFile::Project(wt0_root), get);
assert_eq!(overrides, vec![]);
let overrides = store.get_overrides_for_field(SettingsFile::Local(wt0_child1.clone()), get);
let overrides =
store.get_overrides_for_field(SettingsFile::Project(wt0_child1.clone()), get);
assert_eq!(overrides, vec![]);
let overrides = store.get_overrides_for_field(SettingsFile::Local(wt0_child2), get);
let overrides = store.get_overrides_for_field(SettingsFile::Project(wt0_child2), get);
assert_eq!(overrides, vec![]);
let overrides = store.get_overrides_for_field(SettingsFile::Local(wt1_root), get);
let overrides = store.get_overrides_for_field(SettingsFile::Project(wt1_root), get);
assert_eq!(overrides, vec![]);
let overrides = store.get_overrides_for_field(SettingsFile::Local(wt1_subdir), get);
let overrides = store.get_overrides_for_field(SettingsFile::Project(wt1_subdir), get);
assert_eq!(overrides, vec![]);
let wt0_deep_child = (
@@ -1995,10 +1996,10 @@ mod tests {
)
.unwrap();
let overrides = store.get_overrides_for_field(SettingsFile::Local(wt0_deep_child), get);
let overrides = store.get_overrides_for_field(SettingsFile::Project(wt0_deep_child), get);
assert_eq!(overrides, vec![]);
let overrides = store.get_overrides_for_field(SettingsFile::Local(wt0_child1), get);
let overrides = store.get_overrides_for_field(SettingsFile::Project(wt0_child1), get);
assert_eq!(overrides, vec![]);
}
}