From 2f0abfad2dee2f5dba2df4999cbd04b72de6b711 Mon Sep 17 00:00:00 2001 From: Rexios Date: Mon, 23 Jun 2025 14:26:24 -0400 Subject: [PATCH 1/2] Fixes CLI issues to support workspaces --- packages/custom_lint/lib/src/workspace.dart | 8 ++--- .../lib/src/package_utils.dart | 30 ++++++++++--------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/custom_lint/lib/src/workspace.dart b/packages/custom_lint/lib/src/workspace.dart index 2d5bfd82..28e300a0 100644 --- a/packages/custom_lint/lib/src/workspace.dart +++ b/packages/custom_lint/lib/src/workspace.dart @@ -330,11 +330,9 @@ Stream visitAnalysisOptionAndIncludes( File analysisOptionsFile, ) async* { final visited = {}; - late final packageConfigFuture = loadPackageConfig( - File( - join(analysisOptionsFile.parent.path, '.dart_tool/package_config.json'), - ), - ).then( + late final packageConfigFuture = + loadPackageConfig(analysisOptionsFile.parent.packageConfig) + .then( (value) => value, // On error, return null to not throw. The function later handles the null onError: (e, s) => null, diff --git a/packages/custom_lint_core/lib/src/package_utils.dart b/packages/custom_lint_core/lib/src/package_utils.dart index d7372de9..664ca2c3 100644 --- a/packages/custom_lint_core/lib/src/package_utils.dart +++ b/packages/custom_lint_core/lib/src/package_utils.dart @@ -40,10 +40,22 @@ extension PackageIOUtils on Directory { File get pubspecOverrides => file('pubspec_overrides.yaml'); /// The `.dart_tool/package_config.json` file. - File get packageConfig => file('.dart_tool', 'package_config.json'); + File get _packageConfig => file('.dart_tool', 'package_config.json'); - /// The `.dart_tool/pub/workspace_ref.json` file. - File get workspaceRef => file('.dart_tool', 'pub', 'workspace_ref.json'); + /// The `.dart_tool/package_config.json` file. Either from the current + /// directory or the workspace root. + File get packageConfig { + if (_packageConfig.existsSync()) return _packageConfig; + + final workspaceRefFile = file('.dart_tool', 'pub', 'workspace_ref.json'); + final content = workspaceRefFile.readAsStringSync(); + final json = jsonDecode(content) as Map; + final workspaceRoot = json['workspaceRoot'] as String; + final workspacePath = + normalize(join(workspaceRefFile.parent.path, workspaceRoot)); + final workspaceDir = Directory(workspacePath); + return workspaceDir._packageConfig; + } /// Returns a path relative to the given [other]. String relativeTo(FileSystemEntity other) { @@ -136,17 +148,7 @@ Future tryParsePackageConfig(Directory directory) async { /// Throws if the parsing fails, such as if the file is badly formatted or /// does not exists. Future parsePackageConfig(Directory directory) async { - var packageConfigFile = directory.packageConfig; - if (!packageConfigFile.existsSync()) { - final workspaceRefFile = directory.workspaceRef; - final content = workspaceRefFile.readAsStringSync(); - final json = jsonDecode(content) as Map; - final workspaceRoot = json['workspaceRoot'] as String; - final workspacePath = - normalize(join(workspaceRefFile.parent.path, workspaceRoot)); - final workspaceDir = Directory(workspacePath); - packageConfigFile = workspaceDir.packageConfig; - } + final packageConfigFile = directory.packageConfig; return PackageConfig.parseBytes( await packageConfigFile.readAsBytes(), From 19c8b4bc415ec3ccbaf32bacb19cacb8936aacaa Mon Sep 17 00:00:00 2001 From: Rexios Date: Mon, 23 Jun 2025 17:45:25 -0400 Subject: [PATCH 2/2] Fixing issues --- packages/custom_lint/lib/src/workspace.dart | 9 ++++++++- packages/custom_lint_core/lib/src/package_utils.dart | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/custom_lint/lib/src/workspace.dart b/packages/custom_lint/lib/src/workspace.dart index 28e300a0..3d8539cc 100644 --- a/packages/custom_lint/lib/src/workspace.dart +++ b/packages/custom_lint/lib/src/workspace.dart @@ -416,7 +416,14 @@ String? _findOptionsForPubspec(String pubspecPath) { Iterable _findRoots(String path) sync* { final directory = Directory(path); - yield* directory.listSync(recursive: true).whereType().where((file) { + yield* directory + .listSync( + recursive: true, + // Do not follow symbolic links (can be problematic in flutter platform folders) + followLinks: false, + ) + .whereType() + .where((file) { final fileName = basename(file.path); if (fileName != 'pubspec.yaml' && fileName != 'analysis_options.yaml') { return false; diff --git a/packages/custom_lint_core/lib/src/package_utils.dart b/packages/custom_lint_core/lib/src/package_utils.dart index 664ca2c3..b0b5eedf 100644 --- a/packages/custom_lint_core/lib/src/package_utils.dart +++ b/packages/custom_lint_core/lib/src/package_utils.dart @@ -48,6 +48,8 @@ extension PackageIOUtils on Directory { if (_packageConfig.existsSync()) return _packageConfig; final workspaceRefFile = file('.dart_tool', 'pub', 'workspace_ref.json'); + if (!workspaceRefFile.existsSync()) return _packageConfig; + final content = workspaceRefFile.readAsStringSync(); final json = jsonDecode(content) as Map; final workspaceRoot = json['workspaceRoot'] as String;