Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(364)

Unified Diff: sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart

Issue 576333002: Precompile immutable dependencies on "pub get". (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
diff --git a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
index 128734492b88ebeba577699ddaed802bde3db276..3f15c401d7fed3194a882f2723c29217e2c0b63b 100644
--- a/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub_generated/lib/src/entrypoint.dart
@@ -40,40 +40,251 @@ class Entrypoint {
String get lockFilePath => path.join(root.dir, 'pubspec.lock');
Future acquireDependencies(SolveType type, {List<String> useLatest,
bool dryRun: false}) {
- return syncFuture(() {
- return resolveVersions(
- type,
- cache.sources,
- root,
- lockFile: lockFile,
- useLatest: useLatest);
- }).then((result) {
- if (!result.succeeded) throw result.error;
- result.showReport(type);
- if (dryRun) {
- result.summarizeChanges(type, dryRun: dryRun);
- return null;
+ final completer0 = new Completer();
+ scheduleMicrotask(() {
+ try {
+ resolveVersions(
+ type,
+ cache.sources,
+ root,
+ lockFile: lockFile,
+ useLatest: useLatest).then((x0) {
+ try {
+ var result = x0;
+ join0() {
+ result.showReport(type);
+ join1() {
+ join2() {
+ Future.wait(result.packages.map(_get)).then((x1) {
+ try {
+ var ids = x1;
+ _saveLockFile(ids);
+ join3() {
+ _linkOrDeleteSecondaryPackageDirs();
+ result.summarizeChanges(type, dryRun: dryRun);
+ loadPackageGraph(result).then((x2) {
+ try {
+ var packageGraph = x2;
+ packageGraph.loadTransformerCache().clearIfOutdated(
+ result.changedPackages);
+ completer0.complete(
+ precompileDependencies(changed: result.changedPackages).then(((_) {
+ return precompileExecutables(
+ changed: result.changedPackages);
+ })).catchError(((error, stackTrace) {
+ log.exception(error, stackTrace);
+ })));
+ } catch (e2) {
+ completer0.completeError(e2);
+ }
+ }, onError: (e3) {
+ completer0.completeError(e3);
+ });
+ }
+ if (_packageSymlinks) {
+ _linkSelf();
+ join3();
+ } else {
+ join3();
+ }
+ } catch (e1) {
+ completer0.completeError(e1);
+ }
+ }, onError: (e4) {
+ completer0.completeError(e4);
+ });
+ }
+ if (_packageSymlinks) {
+ cleanDir(packagesDir);
+ join2();
+ } else {
+ deleteEntry(packagesDir);
+ join2();
+ }
+ }
+ if (dryRun) {
+ result.summarizeChanges(type, dryRun: dryRun);
+ completer0.complete(null);
+ } else {
+ join1();
+ }
+ }
+ if (!result.succeeded) {
+ completer0.completeError(result.error);
+ } else {
+ join0();
+ }
+ } catch (e0) {
+ completer0.completeError(e0);
+ }
+ }, onError: (e5) {
+ completer0.completeError(e5);
+ });
+ } catch (e6) {
+ completer0.completeError(e6);
}
- if (_packageSymlinks) {
- cleanDir(packagesDir);
- } else {
- deleteEntry(packagesDir);
+ });
+ return completer0.future;
+ }
+ Future precompileDependencies({Iterable<String> changed}) {
+ final completer0 = new Completer();
+ scheduleMicrotask(() {
+ try {
+ join0() {
+ loadPackageGraph().then((x0) {
+ try {
+ var graph = x0;
+ var depsDir = path.join('.pub', 'deps', 'debug');
+ var dependenciesToPrecompile =
+ graph.packages.values.where(((package) {
+ if (package.pubspec.transformers.isEmpty) return false;
+ if (graph.isPackageMutable(package.name)) return false;
+ if (!dirExists(path.join(depsDir, package.name))) return true;
+ if (changed == null) return true;
+ return overlaps(
+ graph.transitiveDependencies(
+ package.name).map((package) => package.name).toSet(),
+ changed);
+ })).map(((package) => package.name)).toSet();
+ log.fine(
+ "dependencies to precompile: ${dependenciesToPrecompile}");
+ log.fine("changed: ${changed}");
+ join1() {
+ log.progress("Precompiling dependencies", (() {
+ final completer0 = new Completer();
+ scheduleMicrotask(() {
+ try {
+ var packagesToLoad = unionAll(
+ dependenciesToPrecompile.map(
+ graph.transitiveDependencies)).map(((package) => package.name)).toSet();
+ AssetEnvironment.create(
+ this,
+ BarbackMode.DEBUG,
+ packages: packagesToLoad,
+ useDart2JS: false).then((x0) {
+ try {
+ var environment = x0;
+ environment.barback.errors.listen(((_) {}));
+ var it0 = dependenciesToPrecompile.iterator;
+ break0(x4) {
+ environment.barback.getAllAssets().then((x1) {
+ try {
+ var assets = x1;
+ waitAndPrintErrors(assets.map(((asset) {
+ final completer0 = new Completer();
+ scheduleMicrotask(() {
+ try {
+ join0() {
+ var destPath =
+ path.join(depsDir, asset.id.package, path.fromUri(asset.id.path));
+ ensureDir(path.dirname(destPath));
+ createFileFromStream(
+ asset.read(),
+ destPath).then((x0) {
+ try {
+ x0;
+ completer0.complete(null);
+ } catch (e0) {
+ completer0.completeError(e0);
+ }
+ }, onError: (e1) {
+ completer0.completeError(e1);
+ });
+ }
+ if (!dependenciesToPrecompile.contains(
+ asset.id.package)) {
+ completer0.complete(null);
+ } else {
+ join0();
+ }
+ } catch (e2) {
+ completer0.completeError(e2);
+ }
+ });
+ return completer0.future;
+ }))).then((x2) {
+ try {
+ x2;
+ log.message(
+ "Precompiled " +
+ toSentence(ordered(dependenciesToPrecompile).map(log.bold)) +
+ ".");
+ completer0.complete(null);
+ } catch (e2) {
+ completer0.completeError(e2);
+ }
+ }, onError: (e3) {
+ completer0.completeError(e3);
+ });
+ } catch (e1) {
+ completer0.completeError(e1);
+ }
+ }, onError: (e4) {
+ completer0.completeError(e4);
+ });
+ }
+ continue0(x5) {
+ if (it0.moveNext()) {
+ Future.wait([]).then((x3) {
+ var package = it0.current;
+ cleanDir(path.join(depsDir, package));
+ continue0(null);
+ });
+ } else {
+ break0(null);
+ }
+ }
+ continue0(null);
+ } catch (e0) {
+ completer0.completeError(e0);
+ }
+ }, onError: (e5) {
+ completer0.completeError(e5);
+ });
+ } catch (e6) {
+ completer0.completeError(e6);
+ }
+ });
+ return completer0.future;
+ })).catchError(((error) {
+ for (var package in dependenciesToPrecompile) {
+ deleteEntry(path.join(depsDir, package));
+ }
+ throw error;
+ })).then((x1) {
+ try {
+ x1;
+ completer0.complete(null);
+ } catch (e1) {
+ completer0.completeError(e1);
+ }
+ }, onError: (e2) {
+ completer0.completeError(e2);
+ });
+ }
+ if (dependenciesToPrecompile.isEmpty) {
+ completer0.complete(null);
+ } else {
+ join1();
+ }
+ } catch (e0) {
+ completer0.completeError(e0);
+ }
+ }, onError: (e3) {
+ completer0.completeError(e3);
+ });
+ }
+ if (changed != null) {
+ changed = changed.toSet();
+ join0();
+ } else {
+ join0();
+ }
+ } catch (e4) {
+ completer0.completeError(e4);
}
- return Future.wait(result.packages.map(_get)).then((ids) {
- _saveLockFile(ids);
- if (_packageSymlinks) _linkSelf();
- _linkOrDeleteSecondaryPackageDirs();
- result.summarizeChanges(type, dryRun: dryRun);
- return loadPackageGraph(result);
- }).then((packageGraph) {
- packageGraph.loadTransformerCache().clearIfOutdated(
- result.changedPackages);
- return precompileExecutables(
- changed: result.changedPackages).catchError((error, stackTrace) {
- log.exception(error, stackTrace);
- });
- });
});
+ return completer0.future;
}
Future precompileExecutables({Iterable<String> changed}) {
if (changed != null) changed = changed.toSet();
@@ -124,15 +335,11 @@ class Entrypoint {
var package = graph.packages[packageName];
var binDir = path.join(package.dir, 'bin');
if (!dirExists(binDir)) return [];
- var deps = graph.transitiveDependencies(packageName);
- var hasUncachedDependency = deps.any((package) {
- var source = cache.sources[graph.lockFile.packages[package.name].source];
- return source is! CachedSource;
- });
- if (hasUncachedDependency) return [];
+ if (graph.isPackageMutable(packageName)) return [];
var executables = package.executableIds;
if (changed == null) return executables;
- if (deps.any((package) => changed.contains(package.name))) {
+ if (graph.transitiveDependencies(
+ packageName).any((package) => changed.contains(package.name))) {
return executables;
}
var executablesExist = executables.every(

Powered by Google App Engine
This is Rietveld 408576698