From 8c98c827290a3fa5da86550226133afde745f119 Mon Sep 17 00:00:00 2001
From: Dhruv Manilawala <dhruvmanila@gmail.com>
Date: Wed, 17 Jul 2024 17:41:10 +0530
Subject: [PATCH 1/2] Use fallback settings when indexing the project

---
 .../src/session/index/ruff_settings.rs        | 46 ++++++++++---------
 1 file changed, 25 insertions(+), 21 deletions(-)

diff --git a/crates/ruff_server/src/session/index/ruff_settings.rs b/crates/ruff_server/src/session/index/ruff_settings.rs
index efde1e4d4ac3e..6745ea4c60523 100644
--- a/crates/ruff_server/src/session/index/ruff_settings.rs
+++ b/crates/ruff_server/src/session/index/ruff_settings.rs
@@ -100,7 +100,7 @@ impl RuffSettings {
 impl RuffSettingsIndex {
     pub(super) fn new(root: &Path, editor_settings: &ResolvedEditorSettings) -> Self {
         let mut index = BTreeMap::default();
-        let mut respect_gitignore = true;
+        let mut respect_gitignore = None;
 
         // Add any settings from above the workspace root.
         for directory in root.ancestors() {
@@ -113,7 +113,8 @@ impl RuffSettingsIndex {
                     continue;
                 };
 
-                respect_gitignore = settings.file_resolver.respect_gitignore;
+                respect_gitignore = Some(settings.file_resolver.respect_gitignore);
+
                 index.insert(
                     directory.to_path_buf(),
                     Arc::new(RuffSettings {
@@ -127,9 +128,13 @@ impl RuffSettingsIndex {
             }
         }
 
+        let fallback = Arc::new(RuffSettings::fallback(editor_settings, root));
+
         // Add any settings within the workspace itself
         let mut builder = WalkBuilder::new(root);
-        builder.standard_filters(respect_gitignore);
+        builder.standard_filters(
+            respect_gitignore.unwrap_or_else(|| fallback.file_resolver().respect_gitignore),
+        );
         builder.hidden(false);
         builder.threads(
             std::thread::available_parallelism()
@@ -157,26 +162,27 @@ impl RuffSettingsIndex {
 
                 // If the directory is excluded from the workspace, skip it.
                 if let Some(file_name) = directory.file_name() {
-                    if let Some((_, settings)) = index
+                    let settings = index
                         .read()
                         .unwrap()
                         .range(..directory.clone())
                         .rfind(|(path, _)| directory.starts_with(path))
-                    {
-                        if match_exclusion(&directory, file_name, &settings.file_resolver.exclude) {
-                            tracing::debug!("Ignored path via `exclude`: {}", directory.display());
-                            return WalkState::Continue;
-                        } else if match_exclusion(
-                            &directory,
-                            file_name,
-                            &settings.file_resolver.extend_exclude,
-                        ) {
-                            tracing::debug!(
-                                "Ignored path via `extend-exclude`: {}",
-                                directory.display()
-                            );
-                            return WalkState::Continue;
-                        }
+                        .map(|(_, settings)| settings.clone())
+                        .unwrap_or_else(|| fallback.clone());
+
+                    if match_exclusion(&directory, file_name, &settings.file_resolver.exclude) {
+                        tracing::debug!("Ignored path via `exclude`: {}", directory.display());
+                        return WalkState::Continue;
+                    } else if match_exclusion(
+                        &directory,
+                        file_name,
+                        &settings.file_resolver.extend_exclude,
+                    ) {
+                        tracing::debug!(
+                            "Ignored path via `extend-exclude`: {}",
+                            directory.display()
+                        );
+                        return WalkState::Continue;
                     }
                 }
 
@@ -203,8 +209,6 @@ impl RuffSettingsIndex {
             })
         });
 
-        let fallback = Arc::new(RuffSettings::fallback(editor_settings, root));
-
         Self {
             index: index.into_inner().unwrap(),
             fallback,

From b1f01e3e16e3cc2249c28e40ac3014eaee6a9754 Mon Sep 17 00:00:00 2001
From: Dhruv Manilawala <dhruvmanila@gmail.com>
Date: Wed, 17 Jul 2024 22:15:32 +0530
Subject: [PATCH 2/2] Use `Skip` instead of `Continue` for excluded path

---
 crates/ruff_server/src/session/index/ruff_settings.rs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/crates/ruff_server/src/session/index/ruff_settings.rs b/crates/ruff_server/src/session/index/ruff_settings.rs
index 6745ea4c60523..5fa65b245347f 100644
--- a/crates/ruff_server/src/session/index/ruff_settings.rs
+++ b/crates/ruff_server/src/session/index/ruff_settings.rs
@@ -172,7 +172,7 @@ impl RuffSettingsIndex {
 
                     if match_exclusion(&directory, file_name, &settings.file_resolver.exclude) {
                         tracing::debug!("Ignored path via `exclude`: {}", directory.display());
-                        return WalkState::Continue;
+                        return WalkState::Skip;
                     } else if match_exclusion(
                         &directory,
                         file_name,
@@ -182,7 +182,7 @@ impl RuffSettingsIndex {
                             "Ignored path via `extend-exclude`: {}",
                             directory.display()
                         );
-                        return WalkState::Continue;
+                        return WalkState::Skip;
                     }
                 }