| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import '../base/file_system.dart'; |
| import '../base/io.dart'; |
| |
| /// A mixin providing some utility functions for locating/working with |
| /// package_config.json files. |
| /// |
| /// Adapted from package:dds/src/dap/adapters/mixins.dart to use Flutter's |
| /// dart:io wrappers. |
| mixin PackageConfigUtils { |
| abstract FileSystem fileSystem; |
| |
| /// Find the `package_config.json` file for the program being launched. |
| File? findPackageConfigFile(String possibleRoot) { |
| // TODO(dantup): Remove this once |
| // https://github.com/dart-lang/sdk/issues/45530 is done as it will not be |
| // necessary. |
| File? packageConfig; |
| while (true) { |
| packageConfig = fileSystem.file( |
| fileSystem.path.join(possibleRoot, '.dart_tool', 'package_config.json'), |
| ); |
| |
| // If this packageconfig exists, use it. |
| if (packageConfig.existsSync()) { |
| break; |
| } |
| |
| final String parent = fileSystem.path.dirname(possibleRoot); |
| |
| // If we can't go up anymore, the search failed. |
| if (parent == possibleRoot) { |
| packageConfig = null; |
| break; |
| } |
| |
| possibleRoot = parent; |
| } |
| |
| return packageConfig; |
| } |
| } |
| |
| /// A mixin for tracking additional PIDs that can be shut down at the end of a debug session. |
| /// |
| /// Adapted from package:dds/src/dap/adapters/mixins.dart to use Flutter's |
| /// dart:io wrappers. |
| mixin PidTracker { |
| /// Process IDs to terminate during shutdown. |
| /// |
| /// This may be populated with pids from the VM Service to ensure we clean up |
| /// properly where signals may not be passed through the shell to the |
| /// underlying VM process. |
| /// https://github.com/Dart-Code/Dart-Code/issues/907 |
| final Set<int> pidsToTerminate = <int>{}; |
| |
| /// Terminates all processes with the PIDs registered in [pidsToTerminate]. |
| void terminatePids(ProcessSignal signal) { |
| pidsToTerminate.forEach(signal.send); |
| } |
| } |