// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:io'; import 'package:path/path.dart' as path; /// Returns a path to the directory containing source code for packages such as /// kernel, front_end, and analyzer. String get packageRoot { // If the package root directory is specified on the command line using // `-DpkgRoot=...`, use that. const pkgRootVar = bool.hasEnvironment('pkgRoot') ? String.fromEnvironment('pkgRoot') : null; if (pkgRootVar != null) { var pkgRootPath = path.join(Directory.current.path, pkgRootVar); if (!pkgRootPath.endsWith(path.separator)) pkgRootPath += path.separator; return pkgRootPath; } // Otherwise try to guess based on the script path. var scriptPath = path.fromUri(Platform.script); var pathFromScript = _tryGetPkgRoot(scriptPath); if (pathFromScript != null) { return pathFromScript; } // Try a Bazel environment. We expect that all packages that will be // accessed via this root are configured in the BUILD file, and located // inside this single root. var runFiles = Platform.environment['TEST_SRCDIR']; var analyzerPackagesRoot = Platform.environment['ANALYZER_PACKAGES_ROOT']; if (runFiles != null && analyzerPackagesRoot != null) { return path.join(runFiles, analyzerPackagesRoot); } // Finally, try the current working directory. var pathFromCwd = _tryGetPkgRoot(Directory.current.path); if (pathFromCwd != null) { return pathFromCwd; } var exceptionMessage = 'Unable to find the Dart SDK package root directory ("sdk/pkg/") in '; if (pkgRootVar != null) { exceptionMessage += '"$pkgRootVar" (specified via `-DpkgRoot=`), or '; } exceptionMessage += 'in an ancestor of either "$pathFromScript", or "$pathFromCwd".'; throw StateError(exceptionMessage); } /// Tries to find the path to the 'pkg' folder from [searchPath]. String? _tryGetPkgRoot(String searchPath) { var parts = path.split(searchPath); var pkgIndex = parts.indexOf('pkg'); if (pkgIndex != -1) { return path.joinAll(parts.sublist(0, pkgIndex + 1)) + path.separator; } return null; }