Skip to content

Commit b2f0f21

Browse files
authored
Convert packages paths to absolute paths in file watcher (#116)
Fix #109, convert packages paths to absolute paths in file watcher
1 parent 077fe69 commit b2f0f21

File tree

4 files changed

+59
-6
lines changed

4 files changed

+59
-6
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## 0.3.0+6
4+
- Convert `packages` paths in the file watcher to their absolute paths. This
5+
fixes [#109](https://github.com/dart-lang/build/issues/109).
6+
37
## 0.3.0+5
48
- Fix duplicate logs issue when running as a BuilderTransformer.
59

lib/src/generate/watch_impl.dart

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -195,17 +195,23 @@ class WatchImpl {
195195
_logger.fine('Setting up watcher at $absolutePackagePath');
196196

197197
// Ignore all subfolders which are other packages.
198-
var pathsToIgnore = absolutePackagePaths.values.where((path) =>
199-
path != absolutePackagePath &&
200-
path.startsWith(absolutePackagePath));
198+
var pathsToIgnore = absolutePackagePaths.values
199+
.where((path) =>
200+
path != absolutePackagePath &&
201+
path.startsWith(absolutePackagePath))
202+
.toList();
201203

202204
var watcher = _directoryWatcherFactory(absolutePackagePath);
203205
watchers.add(watcher);
204206
_allListeners.add(watcher.events.listen((WatchEvent e) {
207+
var changePath = _normalizeChangePath(e.path, absolutePackagePaths);
208+
if (changePath == null) return;
209+
205210
// Check for ignored paths and immediately bail.
206-
if (pathsToIgnore.any((path) => e.path.startsWith(path))) return;
211+
if (pathsToIgnore.any((path) => changePath.startsWith(path))) return;
207212

208-
var relativePath = path.relative(e.path, from: absolutePackagePath);
213+
var relativePath =
214+
path.relative(changePath, from: absolutePackagePath);
209215
_logger.finest(
210216
'Got ${e.type} event for path $relativePath from ${watcher.path}');
211217
var id = new AssetId(package.name, relativePath);
@@ -233,4 +239,30 @@ class WatchImpl {
233239
var node = _assetGraph.get(id);
234240
return node is GeneratedAssetNode && type != ChangeType.REMOVE;
235241
}
242+
243+
// Convert `packages` paths to absolute paths. Returns null if it finds an
244+
// invalid package path.
245+
String _normalizeChangePath(
246+
String changePath, Map<PackageNode, String> absolutePackagePaths) {
247+
var changePathParts = path.split(changePath);
248+
var packagesIndex = changePathParts.indexOf('packages');
249+
if (packagesIndex == -1) return changePath;
250+
251+
if (changePathParts.length < packagesIndex + 2) {
252+
_logger.severe('Invalid change path: $changePath');
253+
return null;
254+
}
255+
256+
var packageName = changePathParts[packagesIndex + 1];
257+
var packageNode = _packageGraph[packageName];
258+
if (packageNode == null) {
259+
_logger.severe('Got update for invalid package: $packageName');
260+
return null;
261+
}
262+
var packagePath = absolutePackagePaths[packageNode];
263+
var libPath = path.joinAll(['lib']
264+
..addAll(
265+
changePathParts.getRange(packagesIndex + 2, changePathParts.length)));
266+
return path.join(packagePath, libPath);
267+
}
236268
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: build
2-
version: 0.3.0+5
2+
version: 0.3.0+6
33
description: A build system for Dart.
44
author: Dart Team <[email protected]>
55
homepage: https://github.com/dart-lang/build

test/generate/watch_test.dart

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,23 @@ void main() {
181181
// matches the input set.
182182
checkOutputs({'a|web/a.txt.copy': 'b',}, result, writer.assets);
183183
});
184+
185+
test('converts packages paths to absolute ones', () async {
186+
var writer = new InMemoryAssetWriter();
187+
var results = <BuildResult>[];
188+
startWatch(copyAPhaseGroup, {'a|lib/a.txt': 'a'}, writer)
189+
.listen(results.add);
190+
191+
var result = await nextResult(results);
192+
checkOutputs({'a|lib/a.txt.copy': 'a',}, result, writer.assets);
193+
194+
await writer.writeAsString(makeAsset('a|lib/a.txt', 'b'));
195+
FakeWatcher.notifyWatchers(new WatchEvent(
196+
ChangeType.MODIFY, path.absolute('a', 'packages', 'a', 'a.txt')));
197+
198+
result = await nextResult(results);
199+
checkOutputs({'a|lib/a.txt.copy': 'b',}, result, writer.assets);
200+
});
184201
});
185202

186203
group('multiple phases', () {

0 commit comments

Comments
 (0)