diff --git a/build_runner/lib/src/daemon/daemon_builder.dart b/build_runner/lib/src/daemon/daemon_builder.dart index 1c9be5913..c1e39144c 100644 --- a/build_runner/lib/src/daemon/daemon_builder.dart +++ b/build_runner/lib/src/daemon/daemon_builder.dart @@ -77,11 +77,8 @@ class BuildRunnerDaemonBuilder implements DaemonBuilder { (change) => AssetChange(AssetId.parse(change.path), change.type), ) .toList(); - - if (!_buildOptions.skipBuildScriptCheck && - _buildSeries.buildScriptUpdates!.hasBeenUpdated( - changes.map((change) => change.id).toSet(), - )) { + // ignore_for_file: dead_code + if (!_buildOptions.skipBuildScriptCheck && false) { if (!_buildScriptUpdateCompleter.isCompleted) { _buildScriptUpdateCompleter.complete(); } diff --git a/build_runner/lib/src/generate/watch_impl.dart b/build_runner/lib/src/generate/watch_impl.dart index 00440715a..5899522f6 100644 --- a/build_runner/lib/src/generate/watch_impl.dart +++ b/build_runner/lib/src/generate/watch_impl.dart @@ -257,9 +257,8 @@ class WatchImpl implements BuildState { _expectedDeletes.clear(); if (!options.skipBuildScriptCheck) { - if (build.buildScriptUpdates!.hasBeenUpdated( - mergedChanges.keys.toSet(), - )) { + // ignore_for_file: dead_code + if (false) { _terminateCompleter.complete(); buildLog.error('Terminating builds due to build script update.'); return BuildResult( diff --git a/build_runner_core/lib/src/changes/build_script_updates.dart b/build_runner_core/lib/src/changes/build_script_updates.dart deleted file mode 100644 index b68039476..000000000 --- a/build_runner_core/lib/src/changes/build_script_updates.dart +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'dart:async'; -import 'dart:mirrors'; - -import 'package:build/build.dart'; -import 'package:collection/collection.dart'; -import 'package:meta/meta.dart'; -import 'package:path/path.dart' as p; - -import '../asset_graph/graph.dart'; -import '../logging/build_log.dart'; -import '../package_graph/package_graph.dart'; - -/// Functionality for detecting if the build script itself or any of its -/// transitive imports have changed. -abstract class BuildScriptUpdates { - /// Checks if the current running program has been updated, based on - /// [updatedIds]. - bool hasBeenUpdated(Set updatedIds); - - /// Creates a [BuildScriptUpdates] object, using [reader] to ensure that - /// the [assetGraph] is tracking digests for all transitive sources. - /// - /// If [disabled] is `true` then all checks are skipped and - /// [hasBeenUpdated] will always return `false`. - static Future create( - AssetReader reader, - PackageGraph packageGraph, - AssetGraph assetGraph, { - bool disabled = false, - }) async { - if (disabled) return _NoopBuildScriptUpdates(); - return _MirrorBuildScriptUpdates.create(reader, packageGraph, assetGraph); - } -} - -/// Uses mirrors to find all transitive imports of the current script. -class _MirrorBuildScriptUpdates implements BuildScriptUpdates { - final Set _allSources; - final bool _supportsIncrementalRebuilds; - - _MirrorBuildScriptUpdates._( - this._supportsIncrementalRebuilds, - this._allSources, - ); - - static Future create( - AssetReader reader, - PackageGraph packageGraph, - AssetGraph graph, - ) async { - var supportsIncrementalRebuilds = true; - Set allSources; - try { - allSources = - _urisForThisScript - .map((id) => idForUri(id, packageGraph)) - .nonNulls - .toSet(); - var missing = allSources.firstWhereOrNull((id) => !graph.contains(id)); - if (missing != null) { - supportsIncrementalRebuilds = false; - buildLog.warning( - '$missing was not found in the asset graph, ' - 'incremental builds will not work. This probably means you ' - 'don\'t have your dependencies specified fully in your ' - 'pubspec.yaml.', - ); - } else { - // Make sure we are tracking changes for all ids in [allSources]. - for (var id in allSources) { - final node = graph.get(id)!; - if (node.digest == null) { - final digest = await reader.digest(id); - graph.updateNode(id, (nodeBuilder) { - nodeBuilder.digest = digest; - }); - } - } - } - } on ArgumentError // ignore: avoid_catching_errors - catch (_) { - supportsIncrementalRebuilds = false; - allSources = {}; - } - return _MirrorBuildScriptUpdates._(supportsIncrementalRebuilds, allSources); - } - - static Iterable get _urisForThisScript => - currentMirrorSystem().libraries.keys; - - /// Checks if the current running program has been updated, based on - /// [updatedIds]. - @override - bool hasBeenUpdated(Set updatedIds) { - if (!_supportsIncrementalRebuilds) return true; - return updatedIds.intersection(_allSources).isNotEmpty; - } -} - -/// Always returns false for [hasBeenUpdated], used when we want to skip -/// the build script checks. -class _NoopBuildScriptUpdates implements BuildScriptUpdates { - @override - bool hasBeenUpdated(void _) => false; -} - -/// Attempts to return an [AssetId] for [uri]. -/// -/// Returns `null` if the uri should be ignored, or throws an [ArgumentError] -/// if the [uri] is not recognized. -@visibleForTesting -AssetId? idForUri(Uri uri, PackageGraph packageGraph) { - switch (uri.scheme) { - case 'dart': - // TODO: check for sdk updates! - break; - case 'package': - var parts = uri.pathSegments; - return AssetId( - parts[0], - p.url.joinAll(['lib', ...parts.getRange(1, parts.length)]), - ); - case 'file': - final package = packageGraph.asPackageConfig.packageOf( - Uri.file(p.canonicalize(uri.toFilePath())), - ); - if (package == null) { - throw ArgumentError( - 'The uri $uri could not be resolved to a package in the current ' - 'package graph. Do you have a dependency on the package ' - 'containing this uri?', - ); - } - // The `AssetId` constructor normalizes this path to a URI style. - var relativePath = p.relative( - uri.toFilePath(), - from: package.root.toFilePath(), - ); - return AssetId(package.name, relativePath); - case 'data': - // Test runner uses a `data` scheme, don't invalidate for those. - if (uri.path.contains('package:test')) break; - continue unsupported; - case 'http': - continue unsupported; - unsupported: - default: - throw ArgumentError( - 'Unsupported uri scheme `${uri.scheme}` found for ' - 'library in build script.\n' - 'This probably means you are running in an unsupported ' - 'context, such as in an isolate or via `dart run`.\n' - 'Full uri was: $uri.', - ); - } - return null; -} diff --git a/build_runner_core/lib/src/generate/build_definition.dart b/build_runner_core/lib/src/generate/build_definition.dart index 021c22904..5a02ee3d1 100644 --- a/build_runner_core/lib/src/generate/build_definition.dart +++ b/build_runner_core/lib/src/generate/build_definition.dart @@ -14,7 +14,6 @@ import '../asset/writer.dart'; import '../asset_graph/exceptions.dart'; import '../asset_graph/graph.dart'; import '../asset_graph/graph_loader.dart'; -import '../changes/build_script_updates.dart'; import '../environment/build_environment.dart'; import '../logging/build_log.dart'; import '../util/constants.dart'; @@ -27,7 +26,6 @@ import 'options.dart'; // not a build definition. class BuildDefinition { final AssetGraph assetGraph; - final BuildScriptUpdates? buildScriptUpdates; /// Whether this is a build starting from no previous state or outputs. final bool cleanBuild; @@ -39,12 +37,7 @@ class BuildDefinition { /// the current build having an incompatible change. final Map? updates; - BuildDefinition._( - this.assetGraph, - this.buildScriptUpdates, - this.cleanBuild, - this.updates, - ); + BuildDefinition._(this.assetGraph, this.cleanBuild, this.updates); static Future prepareWorkspace( BuildEnvironment environment, @@ -77,7 +70,6 @@ class _Loader { var cacheDirSources = await assetTracker.findCacheDirSources(); var internalSources = await assetTracker.findInternalSources(); - BuildScriptUpdates? buildScriptUpdates; Map? updates; var cleanBuild = true; if (assetGraph != null) { @@ -90,17 +82,8 @@ class _Loader { cacheDirSources, internalSources, ); - buildScriptUpdates = await BuildScriptUpdates.create( - _environment.reader, - _options.packageGraph, - assetGraph, - disabled: _options.skipBuildScriptCheck, - ); - - var buildScriptUpdated = - !_options.skipBuildScriptCheck && - buildScriptUpdates.hasBeenUpdated(updates.keys.toSet()); - if (buildScriptUpdated) { + // ignore_for_file: dead_code + if (false) { buildLog.fullBuildBecause(FullBuildReason.incompatibleScript); var deletedSourceOutputs = await assetGraph.deleteOutputs( _options.packageGraph, @@ -115,7 +98,6 @@ class _Loader { inputSources.removeAll(deletedSourceOutputs); assetGraph = null; - buildScriptUpdates = null; updates = null; cleanBuild = true; } @@ -137,13 +119,6 @@ class _Loader { buildLog.error(e.toString()); throw const CannotBuildException(); } - buildScriptUpdates = await BuildScriptUpdates.create( - _environment.reader, - _options.packageGraph, - assetGraph, - disabled: _options.skipBuildScriptCheck, - ); - conflictingOutputs = assetGraph.outputs .where((n) => n.package == _options.packageGraph.root.name) @@ -171,12 +146,7 @@ class _Loader { await _initialBuildCleanup(conflictingOutputs, _environment.writer); } - return BuildDefinition._( - assetGraph, - buildScriptUpdates, - cleanBuild, - updates, - ); + return BuildDefinition._(assetGraph, cleanBuild, updates); } /// Deletes the generated output directory. diff --git a/build_runner_core/lib/src/generate/build_series.dart b/build_runner_core/lib/src/generate/build_series.dart index 169240893..b63e31f7b 100644 --- a/build_runner_core/lib/src/generate/build_series.dart +++ b/build_runner_core/lib/src/generate/build_series.dart @@ -12,7 +12,6 @@ import 'package:watcher/watcher.dart'; import '../asset/finalized_reader.dart'; import '../asset/writer.dart'; import '../asset_graph/graph.dart'; -import '../changes/build_script_updates.dart'; import '../environment/build_environment.dart'; import '../logging/build_log.dart'; import '../package_graph/apply_builders.dart'; @@ -39,7 +38,6 @@ import 'options.dart'; class BuildSeries { final BuildEnvironment environment; final AssetGraph assetGraph; - final BuildScriptUpdates? buildScriptUpdates; final BuildOptions options; final BuildPhases buildPhases; @@ -66,7 +64,6 @@ class BuildSeries { BuildSeries._( this.environment, this.assetGraph, - this.buildScriptUpdates, this.options, this.buildPhases, this.finalizedReader, @@ -173,7 +170,6 @@ class BuildSeries { var build = BuildSeries._( environment, buildDefinition.assetGraph, - buildDefinition.buildScriptUpdates, options, buildPhases, finalizedReader, diff --git a/build_runner_core/test/changes/build_script_updates_test.dart b/build_runner_core/test/changes/build_script_updates_test.dart deleted file mode 100644 index ecac172e0..000000000 --- a/build_runner_core/test/changes/build_script_updates_test.dart +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -import 'package:build/build.dart'; -import 'package:build_runner_core/src/changes/build_script_updates.dart'; -import 'package:build_runner_core/src/package_graph/package_graph.dart'; -import 'package:package_config/package_config_types.dart'; -import 'package:test/test.dart'; - -void main() { - group('idForUri', () { - late final PackageGraph packageGraph; - setUpAll(() async { - final rootPackage = PackageNode( - 'a', - '/a/', - DependencyType.path, - LanguageVersion(3, 0), - isRoot: true, - ); - final dependency = PackageNode( - 'b', - '/b/', - DependencyType.path, - LanguageVersion(3, 0), - ); - rootPackage.dependencies.add(dependency); - packageGraph = PackageGraph.fromRoot(rootPackage); - }); - - test('dart: uris return null', () { - expect(idForUri(Uri.parse('dart:io'), packageGraph), isNull); - }); - - test('package: uris can be converted', () { - expect( - idForUri(Uri.parse('package:a/a.dart'), packageGraph), - AssetId('a', 'lib/a.dart'), - ); - }); - - test('file: uris can be looked up', () { - expect( - idForUri(Uri.file('/a/lib/a.dart'), packageGraph), - AssetId('a', 'lib/a.dart'), - ); - expect( - idForUri(Uri.file('/b/b.dart'), packageGraph), - AssetId('b', 'b.dart'), - ); - }); - test('data: arent supported unless they are from the test runner', () { - expect( - () => idForUri( - Uri.parse('data:text/plain;charset=UTF-8,foo'), - packageGraph, - ), - throwsA(isA()), - ); - expect( - idForUri( - Uri.parse('data:text/plain;charset=UTF-8,package:test'), - packageGraph, - ), - null, - ); - }); - - test('http: uris are not supported', () { - expect( - () => idForUri(Uri.parse('http://google.com'), packageGraph), - throwsA(isA()), - ); - }); - }); -}