git: Do not rescan .git on fsmonitor events (#18326)
Fixes #16404 by ignoring events coming from .git/fsmonitor--daemon/cookies subdirectory. Closes #16404 Release Notes: - Improved performance in repositories using Git fsmonitor--daemon feature.
This commit is contained in:
parent
7bb510971a
commit
623a6eca75
2 changed files with 28 additions and 2 deletions
|
@ -18,6 +18,9 @@ pub mod repository;
|
||||||
pub mod status;
|
pub mod status;
|
||||||
|
|
||||||
pub static DOT_GIT: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new(".git"));
|
pub static DOT_GIT: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new(".git"));
|
||||||
|
pub static COOKIES: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new("cookies"));
|
||||||
|
pub static FSMONITOR_DAEMON: LazyLock<&'static OsStr> =
|
||||||
|
LazyLock::new(|| OsStr::new("fsmonitor--daemon"));
|
||||||
pub static GITIGNORE: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new(".gitignore"));
|
pub static GITIGNORE: LazyLock<&'static OsStr> = LazyLock::new(|| OsStr::new(".gitignore"));
|
||||||
|
|
||||||
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
|
#[derive(Clone, Copy, Eq, Hash, PartialEq)]
|
||||||
|
|
|
@ -22,7 +22,7 @@ use fuzzy::CharBag;
|
||||||
use git::{
|
use git::{
|
||||||
repository::{GitFileStatus, GitRepository, RepoPath},
|
repository::{GitFileStatus, GitRepository, RepoPath},
|
||||||
status::GitStatus,
|
status::GitStatus,
|
||||||
DOT_GIT, GITIGNORE,
|
COOKIES, DOT_GIT, FSMONITOR_DAEMON, GITIGNORE,
|
||||||
};
|
};
|
||||||
use gpui::{
|
use gpui::{
|
||||||
AppContext, AsyncAppContext, BackgroundExecutor, Context, EventEmitter, Model, ModelContext,
|
AppContext, AsyncAppContext, BackgroundExecutor, Context, EventEmitter, Model, ModelContext,
|
||||||
|
@ -3707,9 +3707,32 @@ impl BackgroundScanner {
|
||||||
let snapshot = &self.state.lock().snapshot;
|
let snapshot = &self.state.lock().snapshot;
|
||||||
{
|
{
|
||||||
let mut is_git_related = false;
|
let mut is_git_related = false;
|
||||||
|
|
||||||
|
// We don't want to trigger .git rescan for events within .git/fsmonitor--daemon/cookies directory.
|
||||||
|
#[derive(PartialEq)]
|
||||||
|
enum FsMonitorParseState {
|
||||||
|
Cookies,
|
||||||
|
FsMonitor
|
||||||
|
}
|
||||||
|
let mut fsmonitor_parse_state = None;
|
||||||
if let Some(dot_git_dir) = abs_path
|
if let Some(dot_git_dir) = abs_path
|
||||||
.ancestors()
|
.ancestors()
|
||||||
.find(|ancestor| ancestor.file_name() == Some(*DOT_GIT))
|
.find(|ancestor| {
|
||||||
|
let file_name = ancestor.file_name();
|
||||||
|
if file_name == Some(*COOKIES) {
|
||||||
|
fsmonitor_parse_state = Some(FsMonitorParseState::Cookies);
|
||||||
|
false
|
||||||
|
} else if fsmonitor_parse_state == Some(FsMonitorParseState::Cookies) && file_name == Some(*FSMONITOR_DAEMON) {
|
||||||
|
fsmonitor_parse_state = Some(FsMonitorParseState::FsMonitor);
|
||||||
|
false
|
||||||
|
} else if fsmonitor_parse_state != Some(FsMonitorParseState::FsMonitor) && file_name == Some(*DOT_GIT) {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
fsmonitor_parse_state.take();
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
{
|
{
|
||||||
let dot_git_path = dot_git_dir
|
let dot_git_path = dot_git_dir
|
||||||
.strip_prefix(&root_canonical_path)
|
.strip_prefix(&root_canonical_path)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue