Index: lib/src/source/sdk.dart |
diff --git a/lib/src/source/sdk.dart b/lib/src/source/sdk.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c04d7fd2e0554d94610e1a34406d06dd7c4e5ee9 |
--- /dev/null |
+++ b/lib/src/source/sdk.dart |
@@ -0,0 +1,109 @@ |
+// Copyright (c) 2016, 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:async'; |
+ |
+import 'package:pub_semver/pub_semver.dart'; |
+ |
+import '../exceptions.dart'; |
+import '../flutter.dart' as flutter; |
+import '../io.dart'; |
+import '../package.dart'; |
+import '../pubspec.dart'; |
+import '../source.dart'; |
+import '../system_cache.dart'; |
+ |
+/// A package [Source] that gets packages from a hard-coded SDK. |
+class SdkSource extends Source { |
+ final name = 'sdk'; |
+ |
+ BoundSource bind(SystemCache systemCache) => |
+ new BoundSdkSource(this, systemCache); |
+ |
+ /// Returns a reference to an SDK package named [name] from [sdk]. |
+ PackageRef refFor(String name, String sdk) => new PackageRef(name, this, sdk); |
+ |
+ /// Returns an ID for an SDK package with the given [name] and [version] from |
+ /// [sdk]. |
+ PackageId idFor(String name, Version version, String sdk) => |
+ new PackageId(name, this, version, sdk); |
+ |
+ /// Parses an SDK dependency. |
+ PackageRef parseRef(String name, description, {String containingPath}) { |
+ if (description is! String) { |
+ throw new FormatException("The description must be an SDK name."); |
+ } |
+ |
+ return new PackageRef(name, this, description); |
+ } |
+ |
+ PackageId parseId(String name, Version version, description) { |
+ if (description is! String) { |
+ throw new FormatException("The description must be an SDK name."); |
+ } |
+ |
+ return new PackageId(name, this, version, description); |
+ } |
+ |
+ bool descriptionsEqual(description1, description2) => |
+ description1 == description2; |
+ |
+ int hashDescription(description) => description.hashCode; |
+} |
+ |
+/// The [BoundSource] for [SdkSource]. |
+class BoundSdkSource extends BoundSource { |
+ final SdkSource source; |
+ |
+ final SystemCache systemCache; |
+ |
+ BoundSdkSource(this.source, this.systemCache); |
+ |
+ Future<List<PackageId>> doGetVersions(PackageRef ref) async { |
+ var sdk = ref.description as String; |
+ if (sdk == 'dart') { |
+ throw new PackageNotFoundException( |
+ 'Could not find package ${ref.name} in the Dart SDK.'); |
+ } else if (sdk != 'flutter') { |
+ throw new PackageNotFoundException('Unknown SDK "$sdk".'); |
+ } |
+ |
+ var pubspec = _loadPubspec(ref.name); |
+ var id = new PackageId(ref.name, source, pubspec.version, sdk); |
+ memoizePubspec(id, pubspec); |
+ return [id]; |
+ } |
+ |
+ Future<Pubspec> doDescribe(PackageId id) async => _loadPubspec(id.name); |
+ |
+ /// Loads the pubspec for the Flutter package named [name]. |
+ /// |
+ /// Throws a [PackageNotFoundException] if Flutter is unavaialable or doesn't |
+ /// contain the package. |
+ Pubspec _loadPubspec(String name) => |
+ new Pubspec.load(_verifiedPackagePath(name), systemCache.sources, |
+ expectedName: name); |
+ |
+ Future get(PackageId id, String symlink) async { |
+ createPackageSymlink(id.name, _verifiedPackagePath(id.name), symlink); |
+ } |
+ |
+ /// Returns the path in the Flutter SDK for the package named [name]. |
+ /// |
+ /// Throws a [PackageNotFoundException] if Flutter is unavailable or doesn't |
+ /// contain the package. |
+ String _verifiedPackagePath(String name) { |
+ if (!flutter.isAvailable) { |
+ throw new PackageNotFoundException('The Flutter SDK is not available.'); |
+ } |
+ |
+ var path = flutter.packagePath(name); |
+ if (dirExists(path)) return path; |
+ |
+ throw new PackageNotFoundException( |
+ 'Could not find package $name in the Flutter SDK.'); |
+ } |
+ |
+ String getDirectory(PackageId id) => flutter.packagePath(id.name); |
+} |