Skip to content

Delete via AssetWriter in AssetGraphLoader so it's testable. #3950

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion _test_common/lib/runner_asset_writer_spy.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,14 @@ class RunnerAssetWriterSpy extends AssetWriterSpy implements RunnerAssetWriter {
RunnerAssetWriterSpy(this._delegate) : super(_delegate);

@override
Future delete(AssetId id) {
Future<void> delete(AssetId id) {
_assetsDeleted.add(id);
return _delegate.delete(id);
}

@override
Future<void> deleteDirectory(AssetId id) => _delegate.deleteDirectory(id);

@override
Future<void> completeBuild() async {}
}
20 changes: 20 additions & 0 deletions build/lib/src/state/filesystem.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ abstract interface class Filesystem {
/// If the file does not exist, does nothing.
void deleteSync(String path);

/// Deletes a directory recursively.
///
/// If the directory does not exist, does nothing.
Future<void> deleteDirectory(String path);

/// Writes a file.
///
/// Creates enclosing directories as needed if they don't exist.
Expand Down Expand Up @@ -110,6 +115,14 @@ class IoFilesystem implements Filesystem {
});
}

@override
Future<void> deleteDirectory(String path) {
return _pool.withResource(() async {
final directory = Directory(path);
if (await directory.exists()) await directory.delete(recursive: true);
});
}

@override
void writeAsBytesSync(
String path,
Expand Down Expand Up @@ -191,6 +204,13 @@ class InMemoryFilesystem implements Filesystem {
@override
void deleteSync(String path) => _files.remove(path);

@override
Future<void> deleteDirectory(String path) {
final prefix = '$path/';
_files.removeWhere((filePath, _) => filePath.startsWith(prefix));
return Future.value();
}

@override
void writeAsBytesSync(String path, List<int> contents) {
_files[path] = Uint8List.fromList(contents);
Expand Down
2 changes: 2 additions & 0 deletions build_runner_core/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

- Breaking: refactor `OverridableEnvironment` and `IOEnvironment` into
`BuildEnvironment`
- Breaking: add `deleteDirectory` to `RunnerAssetWriter`, make `delete`
return `Future<void>`, remove deprecated `OnDelete`.
- Bump the min SDK to 3.7.0.
- Fix crash when running on assets ending in a dot.
- Start using `package:build/src/internal.dart'.
Expand Down
3 changes: 3 additions & 0 deletions build_runner_core/lib/src/asset/batch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -154,4 +154,7 @@ final class BatchWriter extends RunnerAssetWriter {
Future<void> completeBuild() async {
await _batch.completeWrites(_inner);
}

@override
Future<void> deleteDirectory(AssetId id) => _inner.deleteDirectory(id);
}
6 changes: 6 additions & 0 deletions build_runner_core/lib/src/asset/reader_writer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,12 @@ class ReaderWriter extends AssetReader
await filesystem.delete(path);
}

@override
Future<void> deleteDirectory(AssetId id) async {
final path = _pathFor(id);
await filesystem.deleteDirectory(path);
}

@override
Future<void> completeBuild() async {
// TODO(davidmorgan): add back write caching, "batching".
Expand Down
14 changes: 10 additions & 4 deletions build_runner_core/lib/src/asset/writer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,17 @@ import 'dart:async';

import 'package:build/build.dart';

@Deprecated('No longer used')
typedef OnDelete = void Function(AssetId id);

abstract class RunnerAssetWriter implements AssetWriter {
Future delete(AssetId id);
/// Delete [id].
Future<void> delete(AssetId id);

/// Delete the directory [id] recursively.
///
/// Usually an `AssetId` points to a file, but here its `path` is a directory.
///
/// Delete unconditionally and recursively: if the directory does not exist,
/// do nothing.
Future<void> deleteDirectory(AssetId id);

/// Called after each completed build.
///
Expand Down
22 changes: 7 additions & 15 deletions build_runner_core/lib/src/asset_graph/graph_loader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import 'package:build/experiments.dart';
import 'package:built_collection/built_collection.dart';
// ignore: implementation_imports
import 'package:logging/logging.dart';
import 'package:path/path.dart' as p;

import '../asset/writer.dart';
import '../asset_graph/exceptions.dart';
Expand Down Expand Up @@ -66,7 +65,7 @@ class AssetGraphLoader {
'version mismatch or corrupted asset graph.',
);
await Future.wait([
_deleteGeneratedDir(),
writer.deleteDirectory(_generatedOutputDirectoryId),
FailureReporter.cleanErrorCache(),
]);
return null;
Expand Down Expand Up @@ -109,9 +108,9 @@ class AssetGraphLoader {
);
}
await Future.wait([
_deleteAssetGraph(packageGraph),
writer.delete(assetGraphId),
cachedGraph.deleteOutputs(packageGraph, writer),
_deleteGeneratedDir(),
writer.deleteDirectory(_generatedOutputDirectoryId),
FailureReporter.cleanErrorCache(),
]);
if (_runningFromSnapshot) {
Expand All @@ -124,9 +123,9 @@ class AssetGraphLoader {
'Throwing away cached asset graph due to Dart SDK update.',
);
await Future.wait([
_deleteAssetGraph(packageGraph),
writer.delete(assetGraphId),
cachedGraph.deleteOutputs(packageGraph, writer),
_deleteGeneratedDir(),
writer.deleteDirectory(_generatedOutputDirectoryId),
FailureReporter.cleanErrorCache(),
]);
if (_runningFromSnapshot) {
Expand All @@ -136,16 +135,9 @@ class AssetGraphLoader {
}
return cachedGraph;
}
}

Future<void> _deleteAssetGraph(PackageGraph packageGraph) =>
File(p.join(packageGraph.root.path, assetGraphPath)).delete();

Future<void> _deleteGeneratedDir() async {
var generatedDir = Directory(generatedOutputDirectory);
if (await generatedDir.exists()) {
await generatedDir.delete(recursive: true);
}
AssetId get _generatedOutputDirectoryId =>
AssetId(packageGraph.root.name, generatedOutputDirectory);
}

bool get _runningFromSnapshot => !Platform.script.path.endsWith('.dart');
Loading