Skip to content

Commit

Permalink
Collect errors while building up the settings index
Browse files Browse the repository at this point in the history
  • Loading branch information
dhruvmanila committed Aug 12, 2024
1 parent 2abfab0 commit 2004c6a
Showing 1 changed file with 81 additions and 39 deletions.
120 changes: 81 additions & 39 deletions crates/ruff_server/src/session/index/ruff_settings.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use std::collections::BTreeMap;
use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;

use ignore::{WalkBuilder, WalkState};
Expand Down Expand Up @@ -99,32 +100,49 @@ impl RuffSettings {

impl RuffSettingsIndex {
pub(super) fn new(root: &Path, editor_settings: &ResolvedEditorSettings) -> Self {
let mut error = false;
let mut index = BTreeMap::default();
let mut respect_gitignore = None;

// Add any settings from above the workspace root.
for directory in root.ancestors() {
if let Some(pyproject) = settings_toml(directory).ok().flatten() {
let Ok(settings) = ruff_workspace::resolver::resolve_root_settings(
&pyproject,
Relativity::Parent,
&EditorConfigurationTransformer(editor_settings, root),
) else {
// Add any settings from above the workspace root, excluding the workspace root itself.
for directory in root.ancestors().skip(1) {
match settings_toml(directory) {
Ok(Some(pyproject)) => {
match ruff_workspace::resolver::resolve_root_settings(
&pyproject,
Relativity::Parent,
&EditorConfigurationTransformer(editor_settings, root),
) {
Ok(settings) => {
respect_gitignore = Some(settings.file_resolver.respect_gitignore);

index.insert(
directory.to_path_buf(),
Arc::new(RuffSettings {
path: Some(pyproject),
file_resolver: settings.file_resolver,
linter: settings.linter,
formatter: settings.formatter,
}),
);
break;
}
Err(err) => {
tracing::error!(
"Error while resolving settings from {}: {err}",
pyproject.display()
);
error = true;
continue;
}
}
}
Ok(None) => continue,
Err(err) => {
tracing::error!("{err}");
error = true;
continue;
};

respect_gitignore = Some(settings.file_resolver.respect_gitignore);

index.insert(
directory.to_path_buf(),
Arc::new(RuffSettings {
path: Some(pyproject),
file_resolver: settings.file_resolver,
linter: settings.linter,
formatter: settings.formatter,
}),
);
break;
}
}
}

Expand All @@ -144,6 +162,8 @@ impl RuffSettingsIndex {
let walker = builder.build_parallel();

let index = std::sync::RwLock::new(index);
let error = AtomicBool::new(error);

walker.run(|| {
Box::new(|result| {
let Ok(entry) = result else {
Expand Down Expand Up @@ -186,29 +206,51 @@ impl RuffSettingsIndex {
}
}

if let Some(pyproject) = settings_toml(&directory).ok().flatten() {
let Ok(settings) = ruff_workspace::resolver::resolve_root_settings(
&pyproject,
Relativity::Parent,
&EditorConfigurationTransformer(editor_settings, root),
) else {
return WalkState::Continue;
};
index.write().unwrap().insert(
directory,
Arc::new(RuffSettings {
path: Some(pyproject),
file_resolver: settings.file_resolver,
linter: settings.linter,
formatter: settings.formatter,
}),
);
match settings_toml(&directory) {
Ok(Some(pyproject)) => {
match ruff_workspace::resolver::resolve_root_settings(
&pyproject,
Relativity::Parent,
&EditorConfigurationTransformer(editor_settings, root),
) {
Ok(settings) => {
index.write().unwrap().insert(
directory,
Arc::new(RuffSettings {
path: Some(pyproject),
file_resolver: settings.file_resolver,
linter: settings.linter,
formatter: settings.formatter,
}),
);
}
Err(err) => {
tracing::error!(
"Error while resolving settings from {}: {err}",
pyproject.display()
);
error.store(true, Ordering::Relaxed);
}
}
}
Ok(None) => {}
Err(err) => {
tracing::error!("{err}");
error.store(true, Ordering::Relaxed);
}
}

WalkState::Continue
})
});

if error.load(Ordering::Relaxed) {
let root = root.display();
show_err_msg!(
"Error while resolving settings from workspace {root}. Please refer to the logs for more details.",
);
}

Self {
index: index.into_inner().unwrap(),
fallback,
Expand Down

0 comments on commit 2004c6a

Please sign in to comment.