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

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

Issue 475093003: Precompile immutable globally-installed pub executables. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 6 years, 4 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
« no previous file with comments | « sdk/lib/_internal/pub/lib/src/command/run.dart ('k') | sdk/lib/_internal/pub/lib/src/executable.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/_internal/pub/lib/src/entrypoint.dart
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index 25bb14f1d3222eabfde2f4cc35f2584d01bab7bd..c1f0e7d50960e254b1b10581de90999d77065845 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -5,13 +5,11 @@
library pub.entrypoint;
import 'dart:async';
-import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:barback/barback.dart';
import 'barback/asset_environment.dart';
-import 'exceptions.dart';
import 'io.dart';
import 'lock_file.dart';
import 'log.dart' as log;
@@ -144,15 +142,8 @@ class Entrypoint {
/// Build a package graph from the version solver results so we don't
/// have to reload and reparse all the pubspecs.
- return Future.wait(ids.map((id) {
- return cache.sources[id.source].getDirectory(id).then((dir) {
- return new Package(result.pubspecs[id.name], dir);
- });
- }));
- }).then((packages) {
- _packageGraph = new PackageGraph(this, _lockFile,
- new Map.fromIterable(packages, key: (package) => package.name));
-
+ return loadPackageGraph(result);
+ }).then((packageGraph) {
return precompileExecutables(changed: result.changedPackages)
.catchError((error, stackTrace) {
// Just log exceptions here. Since the method is just about acquiring
@@ -207,8 +198,11 @@ class Entrypoint {
});
return waitAndPrintErrors(executables.keys.map((package) {
- return _precompileExecutablesForPackage(
- environment, package, executables[package]);
+ var dir = path.join(binDir, package);
+ cleanDir(dir);
+ return environment.precompileExecutables(
+ package, dir,
+ executableIds: executables[package]);
}));
});
});
@@ -236,15 +230,7 @@ class Entrypoint {
});
if (hasUncachedDependency) return [];
- var executables =
- ordered(package.listFiles(beneath: binDir, recursive: false))
- .where((executable) => path.extension(executable) == '.dart')
- .map((executable) {
- return new AssetId(
- package.name,
- path.toUri(path.relative(executable, from: package.dir))
- .toString());
- }).toList();
+ var executables = package.executableIds;
// If we don't know which packages were changed, always precompile the
// executables.
@@ -267,51 +253,6 @@ class Entrypoint {
return [];
}
- /// Precompiles all [executables] for [package].
- ///
- /// [executables] is assumed to be a list of Dart executables in [package]'s
- /// bin directory.
- Future _precompileExecutablesForPackage(
- AssetEnvironment environment, String package, List<AssetId> executables) {
- var cacheDir = path.join('.pub', 'bin', package);
- cleanDir(cacheDir);
-
- // TODO(nweiz): Unserve this directory when we're done with it.
- return environment.servePackageBinDirectory(package).then((server) {
- return waitAndPrintErrors(executables.map((id) {
- var basename = path.url.basename(id.path);
- var snapshotPath = path.join(cacheDir, "$basename.snapshot");
- return runProcess(Platform.executable, [
- '--snapshot=$snapshotPath',
- server.url.resolve(basename).toString()
- ]).then((result) {
- if (result.success) {
- log.message("Precompiled ${_executableName(id)}.");
- } else {
- // TODO(nweiz): Stop manually deleting this when issue 20504 is
- // fixed.
- deleteEntry(snapshotPath);
- throw new ApplicationException(
- log.yellow("Failed to precompile "
- "${_executableName(id)}:\n") +
- result.stderr.join('\n'));
- }
- });
- })).whenComplete(() {
- // Don't return this future, since we have no need to wait for the
- // server to fully shut down.
- server.close();
- });
- });
- }
-
- /// Returns the executable name for [id].
- ///
- /// [id] is assumed to be an executable in a bin directory. The return value
- /// is intended for log output and may contain formatting.
- String _executableName(AssetId id) =>
- log.bold("${id.package}:${path.basenameWithoutExtension(id.path)}");
-
/// Makes sure the package at [id] is locally available.
///
/// This automatically downloads the package to the system-wide cache as well
@@ -421,22 +362,37 @@ class Entrypoint {
/// Loads the package graph for the application and all of its transitive
/// dependencies.
///
- /// Before loading, makes sure the lockfile and dependencies are installed
- /// and up to date.
- Future<PackageGraph> loadPackageGraph() {
+ /// If [result] is passed, this loads the graph from it without re-parsing the
+ /// lockfile or any pubspecs. Otherwise, before loading, this makes sure the
+ /// lockfile and dependencies are installed and up to date.
+ Future<PackageGraph> loadPackageGraph([SolveResult result]) {
if (_packageGraph != null) return new Future.value(_packageGraph);
- return ensureLockFileIsUpToDate().then((_) {
- return Future.wait(lockFile.packages.values.map((id) {
- var source = cache.sources[id.source];
- return source.getDirectory(id)
- .then((dir) => new Package.load(id.name, dir, cache.sources));
- })).then((packages) {
- var packageMap = new Map.fromIterable(packages, key: (p) => p.name);
- packageMap[root.name] = root;
- _packageGraph = new PackageGraph(this, lockFile, packageMap);
- return _packageGraph;
- });
+ return syncFuture(() {
+ if (result != null) {
+ return Future.wait(result.packages.map((id) {
+ return cache.sources[id.source].getDirectory(id)
+ .then((dir) => new Package(result.pubspecs[id.name], dir));
+ })).then((packages) {
+ return new PackageGraph(this, new LockFile(result.packages),
+ new Map.fromIterable(packages, key: (package) => package.name));
+ });
+ } else {
+ return ensureLockFileIsUpToDate().then((_) {
+ return Future.wait(lockFile.packages.values.map((id) {
+ var source = cache.sources[id.source];
+ return source.getDirectory(id)
+ .then((dir) => new Package.load(id.name, dir, cache.sources));
+ })).then((packages) {
+ var packageMap = new Map.fromIterable(packages, key: (p) => p.name);
+ packageMap[root.name] = root;
+ return new PackageGraph(this, lockFile, packageMap);
+ });
+ });
+ }
+ }).then((graph) {
+ _packageGraph = graph;
+ return graph;
});
}
« no previous file with comments | « sdk/lib/_internal/pub/lib/src/command/run.dart ('k') | sdk/lib/_internal/pub/lib/src/executable.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698