Skip to content

Commit 971e278

Browse files
authored
Delete via AssetWriter in AssetGraphLoader so it's testable. (#3950)
1 parent c3b13bd commit 971e278

File tree

7 files changed

+52
-20
lines changed

7 files changed

+52
-20
lines changed

_test_common/lib/runner_asset_writer_spy.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ class RunnerAssetWriterSpy extends AssetWriterSpy implements RunnerAssetWriter {
1616
RunnerAssetWriterSpy(this._delegate) : super(_delegate);
1717

1818
@override
19-
Future delete(AssetId id) {
19+
Future<void> delete(AssetId id) {
2020
_assetsDeleted.add(id);
2121
return _delegate.delete(id);
2222
}
2323

24+
@override
25+
Future<void> deleteDirectory(AssetId id) => _delegate.deleteDirectory(id);
26+
2427
@override
2528
Future<void> completeBuild() async {}
2629
}

build/lib/src/state/filesystem.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ abstract interface class Filesystem {
4141
/// If the file does not exist, does nothing.
4242
void deleteSync(String path);
4343

44+
/// Deletes a directory recursively.
45+
///
46+
/// If the directory does not exist, does nothing.
47+
Future<void> deleteDirectory(String path);
48+
4449
/// Writes a file.
4550
///
4651
/// Creates enclosing directories as needed if they don't exist.
@@ -110,6 +115,14 @@ class IoFilesystem implements Filesystem {
110115
});
111116
}
112117

118+
@override
119+
Future<void> deleteDirectory(String path) {
120+
return _pool.withResource(() async {
121+
final directory = Directory(path);
122+
if (await directory.exists()) await directory.delete(recursive: true);
123+
});
124+
}
125+
113126
@override
114127
void writeAsBytesSync(
115128
String path,
@@ -191,6 +204,13 @@ class InMemoryFilesystem implements Filesystem {
191204
@override
192205
void deleteSync(String path) => _files.remove(path);
193206

207+
@override
208+
Future<void> deleteDirectory(String path) {
209+
final prefix = '$path/';
210+
_files.removeWhere((filePath, _) => filePath.startsWith(prefix));
211+
return Future.value();
212+
}
213+
194214
@override
195215
void writeAsBytesSync(String path, List<int> contents) {
196216
_files[path] = Uint8List.fromList(contents);

build_runner_core/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
- Breaking: refactor `OverridableEnvironment` and `IOEnvironment` into
44
`BuildEnvironment`
5+
- Breaking: add `deleteDirectory` to `RunnerAssetWriter`, make `delete`
6+
return `Future<void>`, remove deprecated `OnDelete`.
57
- Bump the min SDK to 3.7.0.
68
- Fix crash when running on assets ending in a dot.
79
- Start using `package:build/src/internal.dart'.

build_runner_core/lib/src/asset/batch.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,7 @@ final class BatchWriter extends RunnerAssetWriter {
154154
Future<void> completeBuild() async {
155155
await _batch.completeWrites(_inner);
156156
}
157+
158+
@override
159+
Future<void> deleteDirectory(AssetId id) => _inner.deleteDirectory(id);
157160
}

build_runner_core/lib/src/asset/reader_writer.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ class ReaderWriter extends AssetReader
163163
await filesystem.delete(path);
164164
}
165165

166+
@override
167+
Future<void> deleteDirectory(AssetId id) async {
168+
final path = _pathFor(id);
169+
await filesystem.deleteDirectory(path);
170+
}
171+
166172
@override
167173
Future<void> completeBuild() async {
168174
// TODO(davidmorgan): add back write caching, "batching".

build_runner_core/lib/src/asset/writer.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,17 @@ import 'dart:async';
66

77
import 'package:build/build.dart';
88

9-
@Deprecated('No longer used')
10-
typedef OnDelete = void Function(AssetId id);
11-
129
abstract class RunnerAssetWriter implements AssetWriter {
13-
Future delete(AssetId id);
10+
/// Delete [id].
11+
Future<void> delete(AssetId id);
12+
13+
/// Delete the directory [id] recursively.
14+
///
15+
/// Usually an `AssetId` points to a file, but here its `path` is a directory.
16+
///
17+
/// Delete unconditionally and recursively: if the directory does not exist,
18+
/// do nothing.
19+
Future<void> deleteDirectory(AssetId id);
1420

1521
/// Called after each completed build.
1622
///

build_runner_core/lib/src/asset_graph/graph_loader.dart

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'package:build/experiments.dart';
1010
import 'package:built_collection/built_collection.dart';
1111
// ignore: implementation_imports
1212
import 'package:logging/logging.dart';
13-
import 'package:path/path.dart' as p;
1413

1514
import '../asset/writer.dart';
1615
import '../asset_graph/exceptions.dart';
@@ -66,7 +65,7 @@ class AssetGraphLoader {
6665
'version mismatch or corrupted asset graph.',
6766
);
6867
await Future.wait([
69-
_deleteGeneratedDir(),
68+
writer.deleteDirectory(_generatedOutputDirectoryId),
7069
FailureReporter.cleanErrorCache(),
7170
]);
7271
return null;
@@ -109,9 +108,9 @@ class AssetGraphLoader {
109108
);
110109
}
111110
await Future.wait([
112-
_deleteAssetGraph(packageGraph),
111+
writer.delete(assetGraphId),
113112
cachedGraph.deleteOutputs(packageGraph, writer),
114-
_deleteGeneratedDir(),
113+
writer.deleteDirectory(_generatedOutputDirectoryId),
115114
FailureReporter.cleanErrorCache(),
116115
]);
117116
if (_runningFromSnapshot) {
@@ -124,9 +123,9 @@ class AssetGraphLoader {
124123
'Throwing away cached asset graph due to Dart SDK update.',
125124
);
126125
await Future.wait([
127-
_deleteAssetGraph(packageGraph),
126+
writer.delete(assetGraphId),
128127
cachedGraph.deleteOutputs(packageGraph, writer),
129-
_deleteGeneratedDir(),
128+
writer.deleteDirectory(_generatedOutputDirectoryId),
130129
FailureReporter.cleanErrorCache(),
131130
]);
132131
if (_runningFromSnapshot) {
@@ -136,16 +135,9 @@ class AssetGraphLoader {
136135
}
137136
return cachedGraph;
138137
}
139-
}
140-
141-
Future<void> _deleteAssetGraph(PackageGraph packageGraph) =>
142-
File(p.join(packageGraph.root.path, assetGraphPath)).delete();
143138

144-
Future<void> _deleteGeneratedDir() async {
145-
var generatedDir = Directory(generatedOutputDirectory);
146-
if (await generatedDir.exists()) {
147-
await generatedDir.delete(recursive: true);
148-
}
139+
AssetId get _generatedOutputDirectoryId =>
140+
AssetId(packageGraph.root.name, generatedOutputDirectory);
149141
}
150142

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

0 commit comments

Comments
 (0)