mirror of
https://github.com/zed-industries/zed.git
synced 2026-05-30 03:34:30 +00:00
Building project tests takes 6.5s instead of 18s that way. Release Notes: - N/A --------- Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
114 lines
3.4 KiB
Rust
114 lines
3.4 KiB
Rust
use std::{path::Path, sync::Arc};
|
|
|
|
use crate::init_test;
|
|
use fs::FakeFs;
|
|
use project::{Project, ProjectEntryId, project_search::PathInclusionMatcher, search::SearchQuery};
|
|
use serde_json::json;
|
|
use settings::Settings;
|
|
use util::{
|
|
path,
|
|
paths::{PathMatcher, PathStyle},
|
|
rel_path::RelPath,
|
|
};
|
|
use worktree::{Entry, EntryKind, WorktreeSettings};
|
|
|
|
#[gpui::test]
|
|
async fn test_path_inclusion_matcher(cx: &mut gpui::TestAppContext) {
|
|
init_test(cx);
|
|
|
|
let fs = FakeFs::new(cx.background_executor.clone());
|
|
fs.insert_tree(
|
|
"/root",
|
|
json!({
|
|
".gitignore": "src/data/\n",
|
|
"src": {
|
|
"data": {
|
|
"main.csv": "field_1,field_2,field_3",
|
|
},
|
|
"lib": {
|
|
"main.txt": "Are you familiar with fields?",
|
|
},
|
|
},
|
|
}),
|
|
)
|
|
.await;
|
|
|
|
let project = Project::test(fs.clone(), [path!("/root").as_ref()], cx).await;
|
|
let worktree = project.update(cx, |project, cx| project.worktrees(cx).next().unwrap());
|
|
let (worktree_settings, worktree_snapshot) = worktree.update(cx, |worktree, cx| {
|
|
let settings_location = worktree.settings_location(cx);
|
|
return (
|
|
WorktreeSettings::get(Some(settings_location), cx).clone(),
|
|
worktree.snapshot(),
|
|
);
|
|
});
|
|
|
|
// Manually create a test entry for the gitignored directory since it won't
|
|
// be loaded by the worktree
|
|
let entry = Entry {
|
|
id: ProjectEntryId::from_proto(1),
|
|
kind: EntryKind::UnloadedDir,
|
|
path: Arc::from(RelPath::unix(Path::new("src/data")).unwrap()),
|
|
inode: 0,
|
|
mtime: None,
|
|
canonical_path: None,
|
|
is_ignored: true,
|
|
is_hidden: false,
|
|
is_always_included: false,
|
|
is_external: false,
|
|
is_private: false,
|
|
size: 0,
|
|
char_bag: Default::default(),
|
|
is_fifo: false,
|
|
};
|
|
|
|
// 1. Test searching for `field`, including ignored files without any
|
|
// inclusion and exclusion filters.
|
|
let include_ignored = true;
|
|
let files_to_include = PathMatcher::default();
|
|
let files_to_exclude = PathMatcher::default();
|
|
let match_full_paths = false;
|
|
let search_query = SearchQuery::text(
|
|
"field",
|
|
false,
|
|
false,
|
|
include_ignored,
|
|
files_to_include,
|
|
files_to_exclude,
|
|
match_full_paths,
|
|
None,
|
|
)
|
|
.unwrap();
|
|
|
|
let path_matcher = PathInclusionMatcher::new(Arc::new(search_query));
|
|
assert!(path_matcher.should_scan_gitignored_dir(
|
|
&entry,
|
|
&worktree_snapshot,
|
|
&worktree_settings
|
|
));
|
|
|
|
// 2. Test searching for `field`, including ignored files but updating
|
|
// `files_to_include` to only include files under `src/lib`.
|
|
let include_ignored = true;
|
|
let files_to_include = PathMatcher::new(vec!["src/lib"], PathStyle::Posix).unwrap();
|
|
let files_to_exclude = PathMatcher::default();
|
|
let match_full_paths = false;
|
|
let search_query = SearchQuery::text(
|
|
"field",
|
|
false,
|
|
false,
|
|
include_ignored,
|
|
files_to_include,
|
|
files_to_exclude,
|
|
match_full_paths,
|
|
None,
|
|
)
|
|
.unwrap();
|
|
|
|
let path_matcher = PathInclusionMatcher::new(Arc::new(search_query));
|
|
assert!(!path_matcher.should_scan_gitignored_dir(
|
|
&entry,
|
|
&worktree_snapshot,
|
|
&worktree_settings
|
|
));
|
|
}
|