Skip to content

Commit

Permalink
Convert packages paths to absolute paths in file watcher (#116)
Browse files Browse the repository at this point in the history
Fix #109, convert packages paths to absolute paths in file watcher
  • Loading branch information
jakemac53 committed Jun 21, 2016
1 parent 077fe69 commit b2f0f21
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 6 deletions.
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

0 comments on commit b2f0f21

Please sign in to comment.