Index: sdk/lib/_internal/pub/lib/src/source/hosted.dart |
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart |
index dd5cb0faad15e47b7087ad32264dff4696fea6ef..b42ba77f823337ffdfe6d885f9a18feafc26c892 100644 |
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart |
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart |
@@ -16,16 +16,14 @@ import '../io.dart'; |
import '../log.dart' as log; |
import '../package.dart'; |
import '../pubspec.dart'; |
-import '../source.dart'; |
import '../utils.dart'; |
import '../version.dart'; |
+import 'cached.dart'; |
/// A package source that gets packages from a package hosting site that uses |
/// the same API as pub.dartlang.org. |
-class HostedSource extends Source { |
- |
+class HostedSource extends CachedSource { |
final name = "hosted"; |
- final shouldCache = true; |
/// Gets the default URL for the package server for hosted dependencies. |
static String get defaultUrl { |
@@ -76,17 +74,39 @@ class HostedSource extends Source { |
}); |
} |
- /// Downloads a package from the site and unpacks it. |
- Future<bool> get(PackageId id, String destPath) { |
- var parsed = _parseDescription(id.description); |
- return _download(parsed.last, parsed.first, id.version, destPath); |
+ /// Downloads the package identified by [id] to the system cache. |
+ Future<Package> downloadToSystemCache(PackageId id) { |
+ var packageDir; |
+ return getDirectory(id).then((p) { |
+ packageDir = p; |
+ |
+ // See if it's already cached. |
+ if (dirExists(packageDir)) { |
+ if (isCachedPackageCorrupted(packageDir)) { |
+ // Wipe it out and re-install it. |
+ deleteEntry(packageDir); |
+ } else { |
+ // Already downloaded. |
+ return true; |
+ } |
+ } |
+ |
+ ensureDir(path.dirname(packageDir)); |
+ |
+ var parsed = _parseDescription(id.description); |
+ return _download(parsed.last, parsed.first, id.version, packageDir); |
+ }).then((found) { |
+ if (!found) fail('Package $id not found.'); |
+ return new Package.load(id.name, packageDir, systemCache.sources); |
+ }); |
} |
/// The system cache directory for the hosted source contains subdirectories |
- /// for each separate repository URL that's used on the system. Each of these |
- /// subdirectories then contains a subdirectory for each package downloaded |
- /// from that site. |
- Future<String> systemCacheDirectory(PackageId id) { |
+ /// for each separate repository URL that's used on the system. |
+ /// |
+ /// Each of these subdirectories then contains a subdirectory for each |
+ /// package downloaded from that site. |
+ Future<String> getDirectory(PackageId id) { |
var parsed = _parseDescription(id.description); |
var dir = _urlToDirectory(parsed.last); |
@@ -184,6 +204,7 @@ class HostedSource extends Source { |
}); |
}); |
} |
+ |
/// When an error occurs trying to read something about [package] from [url], |
/// this tries to translate into a more user friendly error message. Always |
/// throws an error, either the original one or a better one. |
@@ -233,16 +254,18 @@ class OfflineHostedSource extends HostedSource { |
}); |
} |
- Future<bool> get(PackageId id, String destPath) { |
- // Since HostedSource returns `true` for [shouldCache], install will only |
- // be called for uncached packages. |
- throw new UnsupportedError("Cannot get packages when offline."); |
+ Future<bool> _download(String server, String package, Version version, |
+ String destPath) { |
+ // Since HostedSource is cached, this will only be called for uncached |
+ // packages. |
+ throw new UnsupportedError("Cannot download packages when offline."); |
} |
- Future<Pubspec> describeUncached(PackageId id) { |
+ Future<Pubspec> onDescribeUncached(PackageId id) { |
// [getVersions()] will only return packages that are already cached. |
- // Source should only call [describeUncached()] on a package after it has |
- // failed to find it in the cache, so this code should not be reached. |
+ // [CachedSource] will only call [onDescribeUncached()] on a package after |
+ // it has failed to find it in the cache, so this code should not be |
+ // reached. |
throw new UnsupportedError("Cannot describe packages when offline."); |
} |
} |