| OLD | NEW |
| 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 'package:path/path.dart' as p; | 10 import 'package:path/path.dart' as p; |
| 11 import 'package:stack_trace/stack_trace.dart'; | 11 import 'package:stack_trace/stack_trace.dart'; |
| 12 | 12 |
| 13 import '../constructable_file_system_event.dart'; | 13 import '../constructable_file_system_event.dart'; |
| 14 import '../path_set.dart'; | 14 import '../path_set.dart'; |
| 15 import '../utils.dart'; | 15 import '../utils.dart'; |
| 16 import '../watch_event.dart'; | 16 import '../watch_event.dart'; |
| 17 import 'resubscribable.dart'; | 17 import 'resubscribable.dart'; |
| 18 | 18 |
| 19 /// Uses the FSEvents subsystem to watch for filesystem events. | 19 /// Uses the FSEvents subsystem to watch for filesystem events. |
| 20 /// | 20 /// |
| 21 /// FSEvents has two main idiosyncrasies that this class works around. First, it | 21 /// FSEvents has two main idiosyncrasies that this class works around. First, it |
| 22 /// will occasionally report events that occurred before the filesystem watch | 22 /// will occasionally report events that occurred before the filesystem watch |
| 23 /// was initiated. Second, if multiple events happen to the same file in close | 23 /// was initiated. Second, if multiple events happen to the same file in close |
| 24 /// succession, it won't report them in the order they occurred. See issue | 24 /// succession, it won't report them in the order they occurred. See issue |
| 25 /// 14373. | 25 /// 14373. |
| 26 /// | 26 /// |
| 27 /// This also works around issues 15458 and 14849 in the implementation of | 27 /// This also works around issue 14849 in the implementation of |
| 28 /// [Directory.watch]. | 28 /// [Directory.watch]. |
| 29 class MacOSDirectoryWatcher extends ResubscribableDirectoryWatcher { | 29 class MacOSDirectoryWatcher extends ResubscribableDirectoryWatcher { |
| 30 // TODO(nweiz): remove these when issue 15042 is fixed. | 30 // TODO(nweiz): remove these when issue 15042 is fixed. |
| 31 static var logDebugInfo = false; | 31 static var logDebugInfo = false; |
| 32 static var _count = 0; | 32 static var _count = 0; |
| 33 | 33 |
| 34 MacOSDirectoryWatcher(String directory) | 34 MacOSDirectoryWatcher(String directory) |
| 35 : super(directory, () => new _MacOSDirectoryWatcher(directory, _count++)); | 35 : super(directory, () => new _MacOSDirectoryWatcher(directory, _count++)); |
| 36 } | 36 } |
| 37 | 37 |
| (...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 // but not the CREATE. | 288 // but not the CREATE. |
| 289 if (type == FileSystemEvent.CREATE && hadModifyEvent && | 289 if (type == FileSystemEvent.CREATE && hadModifyEvent && |
| 290 _files.contains(batch.first.path)) { | 290 _files.contains(batch.first.path)) { |
| 291 type = FileSystemEvent.MODIFY; | 291 type = FileSystemEvent.MODIFY; |
| 292 } | 292 } |
| 293 | 293 |
| 294 switch (type) { | 294 switch (type) { |
| 295 case FileSystemEvent.CREATE: | 295 case FileSystemEvent.CREATE: |
| 296 return new ConstructableFileSystemCreateEvent(batch.first.path, isDir); | 296 return new ConstructableFileSystemCreateEvent(batch.first.path, isDir); |
| 297 case FileSystemEvent.DELETE: | 297 case FileSystemEvent.DELETE: |
| 298 // Issue 15458 means that DELETE events for directories can actually | |
| 299 // mean CREATE, so we always check the filesystem for them. | |
| 300 if (isDir) return null; | |
| 301 return new ConstructableFileSystemCreateEvent(batch.first.path, false); | 298 return new ConstructableFileSystemCreateEvent(batch.first.path, false); |
| 302 case FileSystemEvent.MODIFY: | 299 case FileSystemEvent.MODIFY: |
| 303 return new ConstructableFileSystemModifyEvent( | 300 return new ConstructableFileSystemModifyEvent( |
| 304 batch.first.path, isDir, false); | 301 batch.first.path, isDir, false); |
| 305 default: assert(false); | 302 default: assert(false); |
| 306 } | 303 } |
| 307 } | 304 } |
| 308 | 305 |
| 309 /// Returns one or more events that describe the change between the last known | 306 /// Returns one or more events that describe the change between the last known |
| 310 /// state of [path] and its current state on the filesystem. | 307 /// state of [path] and its current state on the filesystem. |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 } else if (event is FileSystemDeleteEvent) { | 425 } else if (event is FileSystemDeleteEvent) { |
| 429 return "delete $type $path"; | 426 return "delete $type $path"; |
| 430 } else if (event is FileSystemModifyEvent) { | 427 } else if (event is FileSystemModifyEvent) { |
| 431 return "modify $type $path"; | 428 return "modify $type $path"; |
| 432 } else if (event is FileSystemMoveEvent) { | 429 } else if (event is FileSystemMoveEvent) { |
| 433 return "move $type $path to " | 430 return "move $type $path to " |
| 434 "${p.relative(event.destination, from: directory)}"; | 431 "${p.relative(event.destination, from: directory)}"; |
| 435 } | 432 } |
| 436 } | 433 } |
| 437 } | 434 } |
| OLD | NEW |