mirror of
https://github.com/zed-industries/zed.git
synced 2026-05-28 01:24:17 +00:00
The `project_name` worktree setting was added in #36713 to let users override the name shown in the window title. Its description ("The displayed name of this project. If left empty, the root directory name will be displayed.") suggests broader coverage, and #46440 reports the reasonable expectation that it should also apply in the project switcher. In practice the setting has only ever affected `Workspace::update_window_title`, so everywhere else (recent projects, the multi-worktree pane, ...) keeps falling back to the worktree root name. Rather than plumb the setting through each of those surfaces, I'm removing it. Having a project-level setting control how your editor displays the project has downsides. For example it means a checkout can dictate UI in someone else's Zed. The natural home for a custom display name is the workspace DB, set from the UI, which is what we should do if we want this feature back. If you want this back, the path forward is to store the display name in `WorkspaceDb`, expose a UI affordance to edit it, and read it from `update_window_title`, `recent_projects::get_recent_projects` / `get_open_folders`, and any other places that currently derive a display name from the worktree root. Closes #46440 Release Notes: - Removed the `project_name` project setting. It only ever affected the OS window title, and the expectation that it would show up in the project switcher and elsewhere is better served by a future UI-driven, per-workspace setting stored locally.
120 lines
3.9 KiB
Rust
120 lines
3.9 KiB
Rust
use std::path::Path;
|
|
use util::{
|
|
paths::{PathMatcher, PathStyle},
|
|
rel_path::RelPath,
|
|
};
|
|
use worktree::*;
|
|
|
|
fn make_settings_with_read_only(patterns: &[&str]) -> WorktreeSettings {
|
|
WorktreeSettings {
|
|
prevent_sharing_in_public_channels: false,
|
|
file_scan_exclusions: PathMatcher::default(),
|
|
file_scan_inclusions: PathMatcher::default(),
|
|
parent_dir_scan_inclusions: PathMatcher::default(),
|
|
private_files: PathMatcher::default(),
|
|
hidden_files: PathMatcher::default(),
|
|
read_only_files: PathMatcher::new(
|
|
patterns.iter().map(|s| s.to_string()),
|
|
PathStyle::local(),
|
|
)
|
|
.unwrap(),
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_is_path_read_only_with_glob_patterns() {
|
|
let settings = make_settings_with_read_only(&["**/generated/**", "**/*.gen.rs"]);
|
|
|
|
let generated_file =
|
|
RelPath::new(Path::new("src/generated/schema.rs"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
settings.is_path_read_only(&generated_file),
|
|
"Files in generated directory should be read-only"
|
|
);
|
|
|
|
let gen_rs_file = RelPath::new(Path::new("src/types.gen.rs"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
settings.is_path_read_only(&gen_rs_file),
|
|
"Files with .gen.rs extension should be read-only"
|
|
);
|
|
|
|
let regular_file = RelPath::new(Path::new("src/main.rs"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
!settings.is_path_read_only(®ular_file),
|
|
"Regular files should not be read-only"
|
|
);
|
|
|
|
let similar_name = RelPath::new(Path::new("src/generator.rs"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
!settings.is_path_read_only(&similar_name),
|
|
"Files with 'generator' in name but not in generated dir should not be read-only"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_is_path_read_only_with_specific_paths() {
|
|
let settings = make_settings_with_read_only(&["vendor/**", "node_modules/**"]);
|
|
|
|
let vendor_file = RelPath::new(Path::new("vendor/lib/package.js"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
settings.is_path_read_only(&vendor_file),
|
|
"Files in vendor directory should be read-only"
|
|
);
|
|
|
|
let node_modules_file = RelPath::new(
|
|
Path::new("node_modules/lodash/index.js"),
|
|
PathStyle::local(),
|
|
)
|
|
.unwrap();
|
|
assert!(
|
|
settings.is_path_read_only(&node_modules_file),
|
|
"Files in node_modules should be read-only"
|
|
);
|
|
|
|
let src_file = RelPath::new(Path::new("src/app.js"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
!settings.is_path_read_only(&src_file),
|
|
"Files in src should not be read-only"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_is_path_read_only_empty_patterns() {
|
|
let settings = make_settings_with_read_only(&[]);
|
|
|
|
let any_file = RelPath::new(Path::new("src/main.rs"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
!settings.is_path_read_only(&any_file),
|
|
"No files should be read-only when patterns are empty"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_is_path_read_only_with_extension_pattern() {
|
|
let settings = make_settings_with_read_only(&["**/*.lock", "**/*.min.js"]);
|
|
|
|
let lock_file = RelPath::new(Path::new("Cargo.lock"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
settings.is_path_read_only(&lock_file),
|
|
"Lock files should be read-only"
|
|
);
|
|
|
|
let nested_lock =
|
|
RelPath::new(Path::new("packages/app/yarn.lock"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
settings.is_path_read_only(&nested_lock),
|
|
"Nested lock files should be read-only"
|
|
);
|
|
|
|
let minified_js = RelPath::new(Path::new("dist/bundle.min.js"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
settings.is_path_read_only(&minified_js),
|
|
"Minified JS files should be read-only"
|
|
);
|
|
|
|
let regular_js = RelPath::new(Path::new("src/app.js"), PathStyle::local()).unwrap();
|
|
assert!(
|
|
!settings.is_path_read_only(®ular_js),
|
|
"Regular JS files should not be read-only"
|
|
);
|
|
}
|