Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(545)

Side by Side Diff: pkg/watcher/lib/src/directory_watcher/mac_os.dart

Issue 94093007: Add stack chain support to pkg/watcher and pkg/http. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library watcher.directory_watcher.mac_os; 5 library watcher.directory_watcher.mac_os;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:io'; 8 import 'dart:io';
9 9
10 import '../constructable_file_system_event.dart'; 10 import '../constructable_file_system_event.dart';
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 /// 66 ///
67 /// These are gathered together so that they may all be canceled when the 67 /// These are gathered together so that they may all be canceled when the
68 /// watcher is closed. This does not include [_watchSubscription]. 68 /// watcher is closed. This does not include [_watchSubscription].
69 final _subscriptions = new Set<StreamSubscription>(); 69 final _subscriptions = new Set<StreamSubscription>();
70 70
71 _MacOSDirectoryWatcher(String directory) 71 _MacOSDirectoryWatcher(String directory)
72 : directory = directory, 72 : directory = directory,
73 _files = new PathSet(directory) { 73 _files = new PathSet(directory) {
74 _startWatch(); 74 _startWatch();
75 75
76 _listen(new Directory(directory).list(recursive: true), 76 _listen(Chain.track(new Directory(directory).list(recursive: true)),
77 (entity) { 77 (entity) {
78 if (entity is! Directory) _files.add(entity.path); 78 if (entity is! Directory) _files.add(entity.path);
79 }, 79 },
80 onError: _emitError, 80 onError: _emitError,
81 onDone: _readyCompleter.complete, 81 onDone: _readyCompleter.complete,
82 cancelOnError: true); 82 cancelOnError: true);
83 } 83 }
84 84
85 void close() { 85 void close() {
86 for (var subscription in _subscriptions) { 86 for (var subscription in _subscriptions) {
(...skipping 15 matching lines...) Expand all
102 _eventsBasedOnFileSystem(path) : [canonicalEvent]; 102 _eventsBasedOnFileSystem(path) : [canonicalEvent];
103 103
104 for (var event in events) { 104 for (var event in events) {
105 if (event is FileSystemCreateEvent) { 105 if (event is FileSystemCreateEvent) {
106 if (!event.isDirectory) { 106 if (!event.isDirectory) {
107 _emitEvent(ChangeType.ADD, path); 107 _emitEvent(ChangeType.ADD, path);
108 _files.add(path); 108 _files.add(path);
109 continue; 109 continue;
110 } 110 }
111 111
112 _listen(new Directory(path).list(recursive: true), (entity) { 112 _listen(Chain.track(new Directory(path).list(recursive: true)),
113 (entity) {
113 if (entity is Directory) return; 114 if (entity is Directory) return;
114 _emitEvent(ChangeType.ADD, entity.path); 115 _emitEvent(ChangeType.ADD, entity.path);
115 _files.add(entity.path); 116 _files.add(entity.path);
116 }, onError: _emitError, cancelOnError: true); 117 }, onError: _emitError, cancelOnError: true);
117 } else if (event is FileSystemModifyEvent) { 118 } else if (event is FileSystemModifyEvent) {
118 assert(!event.isDirectory); 119 assert(!event.isDirectory);
119 _emitEvent(ChangeType.MODIFY, path); 120 _emitEvent(ChangeType.MODIFY, path);
120 } else { 121 } else {
121 assert(event is FileSystemDeleteEvent); 122 assert(event is FileSystemDeleteEvent);
122 for (var removedPath in _files.remove(path)) { 123 for (var removedPath in _files.remove(path)) {
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 for (var file in _files.toSet()) { 308 for (var file in _files.toSet()) {
308 _emitEvent(ChangeType.REMOVE, file); 309 _emitEvent(ChangeType.REMOVE, file);
309 } 310 }
310 _files.clear(); 311 _files.clear();
311 close(); 312 close();
312 } 313 }
313 314
314 /// Start or restart the underlying [Directory.watch] stream. 315 /// Start or restart the underlying [Directory.watch] stream.
315 void _startWatch() { 316 void _startWatch() {
316 // Batch the FSEvent changes together so that we can dedup events. 317 // Batch the FSEvent changes together so that we can dedup events.
317 var innerStream = new Directory(directory).watch(recursive: true).transform( 318 var innerStream =
318 new BatchedStreamTransformer<FileSystemEvent>()); 319 Chain.track(new Directory(directory).watch(recursive: true))
320 .transform(new BatchedStreamTransformer<FileSystemEvent>());
319 _watchSubscription = innerStream.listen(_onBatch, 321 _watchSubscription = innerStream.listen(_onBatch,
320 onError: _eventsController.addError, 322 onError: _eventsController.addError,
321 onDone: _onDone); 323 onDone: _onDone);
322 } 324 }
323 325
324 /// Emit an event with the given [type] and [path]. 326 /// Emit an event with the given [type] and [path].
325 void _emitEvent(ChangeType type, String path) { 327 void _emitEvent(ChangeType type, String path) {
326 if (!isReady) return; 328 if (!isReady) return;
327 329
328 // Don't emit ADD events for files that we already know about. Such an event 330 // Don't emit ADD events for files that we already know about. Such an event
(...skipping 15 matching lines...) Expand all
344 void _listen(Stream stream, void onData(event), {Function onError, 346 void _listen(Stream stream, void onData(event), {Function onError,
345 void onDone(), bool cancelOnError}) { 347 void onDone(), bool cancelOnError}) {
346 var subscription; 348 var subscription;
347 subscription = stream.listen(onData, onError: onError, onDone: () { 349 subscription = stream.listen(onData, onError: onError, onDone: () {
348 _subscriptions.remove(subscription); 350 _subscriptions.remove(subscription);
349 if (onDone != null) onDone(); 351 if (onDone != null) onDone();
350 }, cancelOnError: cancelOnError); 352 }, cancelOnError: cancelOnError);
351 _subscriptions.add(subscription); 353 _subscriptions.add(subscription);
352 } 354 }
353 } 355 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698