Skip to content
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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 0.3.0+6
- Convert `packages` paths in the file watcher to their absolute paths. This
fixes [#109](https://github.com/dart-lang/build/issues/109).

## 0.3.0+5
- Fix duplicate logs issue when running as a BuilderTransformer.

Expand Down
42 changes: 37 additions & 5 deletions lib/src/generate/watch_impl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -195,17 +195,23 @@ class WatchImpl {
_logger.fine('Setting up watcher at $absolutePackagePath');

// Ignore all subfolders which are other packages.
var pathsToIgnore = absolutePackagePaths.values.where((path) =>
path != absolutePackagePath &&
path.startsWith(absolutePackagePath));
var pathsToIgnore = absolutePackagePaths.values
.where((path) =>
path != absolutePackagePath &&
path.startsWith(absolutePackagePath))
.toList();

var watcher = _directoryWatcherFactory(absolutePackagePath);
watchers.add(watcher);
_allListeners.add(watcher.events.listen((WatchEvent e) {
var changePath = _normalizeChangePath(e.path, absolutePackagePaths);
if (changePath == null) return;

// Check for ignored paths and immediately bail.
if (pathsToIgnore.any((path) => e.path.startsWith(path))) return;
if (pathsToIgnore.any((path) => changePath.startsWith(path))) return;

var relativePath = path.relative(e.path, from: absolutePackagePath);
var relativePath =
path.relative(changePath, from: absolutePackagePath);
_logger.finest(
'Got ${e.type} event for path $relativePath from ${watcher.path}');
var id = new AssetId(package.name, relativePath);
Expand Down Expand Up @@ -233,4 +239,30 @@ class WatchImpl {
var node = _assetGraph.get(id);
return node is GeneratedAssetNode && type != ChangeType.REMOVE;
}

// Convert `packages` paths to absolute paths. Returns null if it finds an
// invalid package path.
String _normalizeChangePath(
String changePath, Map<PackageNode, String> absolutePackagePaths) {
var changePathParts = path.split(changePath);
var packagesIndex = changePathParts.indexOf('packages');
if (packagesIndex == -1) return changePath;

if (changePathParts.length < packagesIndex + 2) {
_logger.severe('Invalid change path: $changePath');
return null;
}

var packageName = changePathParts[packagesIndex + 1];
var packageNode = _packageGraph[packageName];
if (packageNode == null) {
_logger.severe('Got update for invalid package: $packageName');
return null;
}
var packagePath = absolutePackagePaths[packageNode];
var libPath = path.joinAll(['lib']
..addAll(
changePathParts.getRange(packagesIndex + 2, changePathParts.length)));
return path.join(packagePath, libPath);
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: build
version: 0.3.0+5
version: 0.3.0+6
description: A build system for Dart.
author: Dart Team <misc@dartlang.org>
homepage: https://github.com/dart-lang/build
Expand Down
17 changes: 17 additions & 0 deletions test/generate/watch_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,23 @@ void main() {
// matches the input set.
checkOutputs({'a|web/a.txt.copy': 'b',}, result, writer.assets);
});

test('converts packages paths to absolute ones', () async {
var writer = new InMemoryAssetWriter();
var results = <BuildResult>[];
startWatch(copyAPhaseGroup, {'a|lib/a.txt': 'a'}, writer)
.listen(results.add);

var result = await nextResult(results);
checkOutputs({'a|lib/a.txt.copy': 'a',}, result, writer.assets);

await writer.writeAsString(makeAsset('a|lib/a.txt', 'b'));
FakeWatcher.notifyWatchers(new WatchEvent(
ChangeType.MODIFY, path.absolute('a', 'packages', 'a', 'a.txt')));

result = await nextResult(results);
checkOutputs({'a|lib/a.txt.copy': 'b',}, result, writer.assets);
});
});

group('multiple phases', () {
Expand Down