From cd0bae103301b41f0d4d0ae171b3da443946a979 Mon Sep 17 00:00:00 2001 From: Emanuele Stoppa Date: Thu, 21 Mar 2024 15:28:16 +0000 Subject: [PATCH] fix(project): correctly ignore folders (#2147) --- CHANGELOG.md | 4 ++ crates/biome_cli/src/execute/mod.rs | 14 +++-- crates/biome_cli/src/execute/process_file.rs | 8 +-- crates/biome_cli/src/execute/std_in.rs | 4 +- crates/biome_cli/src/execute/traverse.rs | 10 +-- crates/biome_cli/tests/commands/check.rs | 49 +++++++++++++++ crates/biome_cli/tests/commands/format.rs | 56 +++++++++++++++++ ...agnostics_for_files_ignored_by_linter.snap | 61 +++++++++++++++++++ ...at_files_in_folders_ignored_by_linter.snap | 34 +++++++++++ crates/biome_formatter_test/src/spec.rs | 2 +- crates/biome_lsp/src/handlers/analysis.rs | 4 +- crates/biome_lsp/src/handlers/formatting.rs | 6 +- crates/biome_lsp/src/session.rs | 2 +- crates/biome_service/src/workspace.rs | 4 +- crates/biome_service/src/workspace/server.rs | 16 +++-- .../@biomejs/backend-jsonrpc/src/workspace.ts | 2 +- .../src/content/docs/internals/changelog.md | 4 ++ 17 files changed, 247 insertions(+), 33 deletions(-) create mode 100644 crates/biome_cli/tests/snapshots/main_commands_check/should_show_formatter_diagnostics_for_files_ignored_by_linter.snap create mode 100644 crates/biome_cli/tests/snapshots/main_commands_format/should_format_files_in_folders_ignored_by_linter.snap diff --git a/CHANGELOG.md b/CHANGELOG.md index 8391c236c584..e4888f9f07c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,10 @@ our [guidelines for writing a good changelog entry](https://github.com/biomejs/b ### CLI +#### Bug fixes + +- Fixes [#2131](https://github.com/biomejs/biome/issues/2131), where folders were incorrectly ignored when running the command `check`. Now folders are correctly ignored based on their command. Contributed by @ematipico + ### Configuration #### Bug fixes diff --git a/crates/biome_cli/src/execute/mod.rs b/crates/biome_cli/src/execute/mod.rs index 16cccdeb67a0..dc799b787337 100644 --- a/crates/biome_cli/src/execute/mod.rs +++ b/crates/biome_cli/src/execute/mod.rs @@ -10,7 +10,7 @@ use crate::execute::traverse::traverse; use crate::{CliDiagnostic, CliSession}; use biome_diagnostics::{category, Category}; use biome_fs::BiomePath; -use biome_service::workspace::{FeatureName, FixFileMode}; +use biome_service::workspace::{FeatureName, FeaturesBuilder, FixFileMode}; use std::ffi::OsString; use std::fmt::{Display, Formatter}; use std::path::{Path, PathBuf}; @@ -28,10 +28,16 @@ pub(crate) struct Execution { } impl Execution { - pub(crate) fn as_feature_name(&self) -> FeatureName { + pub(crate) fn to_features(&self) -> Vec { match self.traversal_mode { - TraversalMode::Format { .. } => FeatureName::Format, - _ => FeatureName::Lint, + TraversalMode::Format { .. } => FeaturesBuilder::new().with_formatter().build(), + TraversalMode::Lint { .. } => FeaturesBuilder::new().with_linter().build(), + TraversalMode::Check { .. } | TraversalMode::CI { .. } => FeaturesBuilder::new() + .with_organize_imports() + .with_formatter() + .with_linter() + .build(), + TraversalMode::Migrate { .. } => vec![], } } } diff --git a/crates/biome_cli/src/execute/process_file.rs b/crates/biome_cli/src/execute/process_file.rs index 3ca932c126fc..016553593417 100644 --- a/crates/biome_cli/src/execute/process_file.rs +++ b/crates/biome_cli/src/execute/process_file.rs @@ -12,7 +12,7 @@ use crate::execute::traverse::TraversalOptions; use crate::execute::TraversalMode; use biome_diagnostics::{category, DiagnosticExt, DiagnosticTags, Error}; use biome_fs::BiomePath; -use biome_service::workspace::{FeatureName, FeaturesBuilder, SupportKind, SupportsFeatureParams}; +use biome_service::workspace::{FeatureName, SupportKind, SupportsFeatureParams}; use std::marker::PhantomData; use std::ops::Deref; use std::path::Path; @@ -132,11 +132,7 @@ pub(crate) fn process_file(ctx: &TraversalOptions, path: &Path) -> FileResult { .workspace .file_features(SupportsFeatureParams { path: biome_path, - feature: FeaturesBuilder::new() - .with_formatter() - .with_linter() - .with_organize_imports() - .build(), + features: ctx.execution.to_features(), }) .with_file_path_and_code_and_tags( path.display().to_string(), diff --git a/crates/biome_cli/src/execute/std_in.rs b/crates/biome_cli/src/execute/std_in.rs index 84635a263d10..cde99cf3f624 100644 --- a/crates/biome_cli/src/execute/std_in.rs +++ b/crates/biome_cli/src/execute/std_in.rs @@ -28,7 +28,7 @@ pub(crate) fn run<'a>( if mode.is_format() { let file_features = workspace.file_features(SupportsFeatureParams { path: biome_path.clone(), - feature: FeaturesBuilder::new().with_formatter().build(), + features: FeaturesBuilder::new().with_formatter().build(), })?; if file_features.is_protected() { let protected_diagnostic = @@ -76,7 +76,7 @@ pub(crate) fn run<'a>( // apply fix file of the linter let file_features = workspace.file_features(SupportsFeatureParams { path: biome_path.clone(), - feature: FeaturesBuilder::new() + features: FeaturesBuilder::new() .with_linter() .with_organize_imports() .with_formatter() diff --git a/crates/biome_cli/src/execute/traverse.rs b/crates/biome_cli/src/execute/traverse.rs index 002207d08641..8b6cfc30b212 100644 --- a/crates/biome_cli/src/execute/traverse.rs +++ b/crates/biome_cli/src/execute/traverse.rs @@ -13,7 +13,7 @@ use biome_diagnostics::PrintGitHubDiagnostic; use biome_diagnostics::{category, DiagnosticExt, Error, PrintDiagnostic, Resource, Severity}; use biome_fs::{BiomePath, FileSystem, PathInterner}; use biome_fs::{TraversalContext, TraversalScope}; -use biome_service::workspace::{FeaturesBuilder, IsPathIgnoredParams}; +use biome_service::workspace::IsPathIgnoredParams; use biome_service::{extension_error, workspace::SupportsFeatureParams, Workspace, WorkspaceError}; use crossbeam::channel::{unbounded, Receiver, Sender}; use rustc_hash::FxHashSet; @@ -702,7 +702,7 @@ impl<'ctx, 'app> TraversalContext for TraversalOptions<'ctx, 'app> { .workspace .is_path_ignored(IsPathIgnoredParams { biome_path: biome_path.clone(), - feature: self.execution.as_feature_name(), + features: self.execution.to_features(), }) .unwrap_or_else(|err| { self.push_diagnostic(err.into()); @@ -713,11 +713,7 @@ impl<'ctx, 'app> TraversalContext for TraversalOptions<'ctx, 'app> { let file_features = self.workspace.file_features(SupportsFeatureParams { path: biome_path.clone(), - feature: FeaturesBuilder::new() - .with_linter() - .with_formatter() - .with_organize_imports() - .build(), + features: self.execution.to_features(), }); let file_features = match file_features { diff --git a/crates/biome_cli/tests/commands/check.rs b/crates/biome_cli/tests/commands/check.rs index 9c0a2cd0911c..6faff19c43e8 100644 --- a/crates/biome_cli/tests/commands/check.rs +++ b/crates/biome_cli/tests/commands/check.rs @@ -2797,3 +2797,52 @@ fn use_literal_keys_should_emit_correct_ast_issue_266() { result, )); } + +#[test] +fn should_show_formatter_diagnostics_for_files_ignored_by_linter() { + let mut fs = MemoryFileSystem::default(); + let mut console = BufferConsole::default(); + + let file_path = Path::new("build/file.js"); + fs.insert( + file_path.into(), + r#" + value['optimizelyService'] = optimizelyService; + "#, + ); + + let biome_json = Path::new("biome.json"); + fs.insert( + biome_json.into(), + r#"{ + "$schema": "https://biomejs.dev/schemas/1.6.1/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "ignore": ["build/**"], + "enabled": true, + "rules": { + "recommended": true + } + } +} + "#, + ); + + let result = run_cli( + DynRef::Borrowed(&mut fs), + &mut console, + Args::from([("check"), file_path.as_os_str().to_str().unwrap()].as_slice()), + ); + + assert!(result.is_err(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "should_show_formatter_diagnostics_for_files_ignored_by_linter", + fs, + console, + result, + )); +} diff --git a/crates/biome_cli/tests/commands/format.rs b/crates/biome_cli/tests/commands/format.rs index 62a7720ce412..abdc79ba6ed0 100644 --- a/crates/biome_cli/tests/commands/format.rs +++ b/crates/biome_cli/tests/commands/format.rs @@ -3461,3 +3461,59 @@ fn format_empty_svelte_ts_files_write() { result, )); } + +#[test] +fn should_format_files_in_folders_ignored_by_linter() { + let mut fs = MemoryFileSystem::default(); + let mut console = BufferConsole::default(); + + let file_path = Path::new("build/file.js"); + fs.insert( + file_path.into(), + r#" + value['optimizelyService'] = optimizelyService; + "#, + ); + + let biome_json = Path::new("biome.json"); + fs.insert( + biome_json.into(), + r#"{ + "$schema": "https://biomejs.dev/schemas/1.6.1/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "ignore": ["**/build"], + "enabled": true, + "rules": { + "recommended": true + } + } +} + "#, + ); + + let result = run_cli( + DynRef::Borrowed(&mut fs), + &mut console, + Args::from( + [ + ("format"), + "--write", + file_path.as_os_str().to_str().unwrap(), + ] + .as_slice(), + ), + ); + + assert!(result.is_ok(), "run_cli returned {result:?}"); + + assert_cli_snapshot(SnapshotPayload::new( + module_path!(), + "should_format_files_in_folders_ignored_by_linter", + fs, + console, + result, + )); +} diff --git a/crates/biome_cli/tests/snapshots/main_commands_check/should_show_formatter_diagnostics_for_files_ignored_by_linter.snap b/crates/biome_cli/tests/snapshots/main_commands_check/should_show_formatter_diagnostics_for_files_ignored_by_linter.snap new file mode 100644 index 000000000000..943f4150015a --- /dev/null +++ b/crates/biome_cli/tests/snapshots/main_commands_check/should_show_formatter_diagnostics_for_files_ignored_by_linter.snap @@ -0,0 +1,61 @@ +--- +source: crates/biome_cli/tests/snap_test.rs +expression: content +--- +## `biome.json` + +```json +{ + "$schema": "https://biomejs.dev/schemas/1.6.1/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "ignore": ["build/**"], + "enabled": true, + "rules": { + "recommended": true + } + } +} +``` + +## `build/file.js` + +```js + + value['optimizelyService'] = optimizelyService; + +``` + +# Termination Message + +```block +check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Some errors were emitted while running checks. + + + +``` + +# Emitted Messages + +```block +build/file.js format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + i Formatter would have printed the following content: + + 1 │ - + 2 │ - → value['optimizelyService']·=·optimizelyService; + 3 │ - → → + 1 │ + value["optimizelyService"]·=·optimizelyService; + 2 │ + + + +``` + +```block +Checked 1 file in