@@ -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}
0 commit comments