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 6a9f6076bdb37ed5f7c1348b9fde2b850715ea08..6ce137d954bd6d38636fca3e9fc6ee178e174c8e 100644 |
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart |
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart |
@@ -43,18 +43,28 @@ class Entrypoint { |
/// the network. |
final SystemCache cache; |
+ /// Whether to create and symlink a "packages" directory containing links to |
+ /// the installed packages. |
+ final bool _packageSymlinks; |
+ |
/// The lockfile for the entrypoint. |
/// |
/// If not provided to the entrypoint, it will be laoded lazily from disc. |
LockFile _lockFile; |
/// Loads the entrypoint from a package at [rootDir]. |
- Entrypoint(String rootDir, SystemCache cache) |
+ /// |
+ /// If [packageSymlinks] is `true`, this will create a "packages" directory |
+ /// with symlinks to the installed packages. This directory will be symlinked |
+ /// into any directory that might contain an entrypoint. |
+ Entrypoint(String rootDir, SystemCache cache, {bool packageSymlinks: true}) |
: root = new Package.load(null, rootDir, cache.sources), |
- cache = cache; |
+ cache = cache, |
+ _packageSymlinks = packageSymlinks; |
/// Creates an entrypoint given package and lockfile objects. |
- Entrypoint.inMemory(this.root, this._lockFile, this.cache); |
+ Entrypoint.inMemory(this.root, this._lockFile, this.cache) |
+ : _packageSymlinks = false; |
/// The path to the entrypoint's "packages" directory. |
String get packagesDir => path.join(root.dir, 'packages'); |
@@ -109,12 +119,19 @@ class Entrypoint { |
return null; |
} |
- // Install the packages. |
- cleanDir(packagesDir); |
+ // Install the packages and maybe link them into the entrypoint. |
+ if (_packageSymlinks) { |
+ cleanDir(packagesDir); |
+ } else { |
+ deleteEntry(packagesDir); |
+ } |
+ |
return Future.wait(result.packages.map(_get)).then((ids) { |
_saveLockFile(ids); |
- _linkSelf(); |
- _linkSecondaryPackageDirs(); |
+ |
+ if (_packageSymlinks) _linkSelf(); |
+ _linkOrDeleteSecondaryPackageDirs(); |
+ |
result.summarizeChanges(type, dryRun: dryRun); |
}); |
}); |
@@ -128,11 +145,17 @@ class Entrypoint { |
Future<PackageId> _get(PackageId id) { |
if (id.isRoot) return new Future.value(id); |
- var packageDir = path.join(packagesDir, id.name); |
- if (entryExists(packageDir)) deleteEntry(packageDir); |
- |
var source = cache.sources[id.source]; |
- return source.get(id, packageDir).then((_) => source.resolveId(id)); |
+ return syncFuture(() { |
+ if (!_packageSymlinks) { |
+ if (source is! CachedSource) return null; |
+ return source.downloadToSystemCache(id); |
+ } |
+ |
+ var packageDir = path.join(packagesDir, id.name); |
+ if (entryExists(packageDir)) deleteEntry(packageDir); |
+ return source.get(id, packageDir); |
+ }).then((_) => source.resolveId(id)); |
} |
/// Determines whether or not the lockfile is out of date with respect to the |
@@ -257,28 +280,34 @@ class Entrypoint { |
isSelfLink: true, relative: true); |
} |
- /// Add "packages" directories to the whitelist of directories that may |
- /// contain Dart entrypoints. |
- void _linkSecondaryPackageDirs() { |
+ /// If [packageSymlinks] is true, add "packages" directories to the whitelist |
+ /// of directories that may contain Dart entrypoints. |
+ /// |
+ /// Otherwise, delete any "packages" directories in the whitelist of |
+ /// directories that may contain Dart entrypoints. |
+ void _linkOrDeleteSecondaryPackageDirs() { |
// Only the main "bin" directory gets a "packages" directory, not its |
// subdirectories. |
var binDir = path.join(root.dir, 'bin'); |
- if (dirExists(binDir)) _linkSecondaryPackageDir(binDir); |
+ if (dirExists(binDir)) _linkOrDeleteSecondaryPackageDir(binDir); |
// The others get "packages" directories in subdirectories too. |
for (var dir in ['benchmark', 'example', 'test', 'tool', 'web']) { |
- _linkSecondaryPackageDirsRecursively(path.join(root.dir, dir)); |
+ _linkOrDeleteSecondaryPackageDirsRecursively(path.join(root.dir, dir)); |
} |
} |
- /// Creates a symlink to the `packages` directory in [dir] and all its |
+ /// If [packageSymlinks] is true, creates a symlink to the "packages" |
+ /// directory in [dir] and all its subdirectories. |
+ /// |
+ /// Otherwise, deletes any "packages" directories in [dir] and all its |
/// subdirectories. |
- void _linkSecondaryPackageDirsRecursively(String dir) { |
+ void _linkOrDeleteSecondaryPackageDirsRecursively(String dir) { |
if (!dirExists(dir)) return; |
- _linkSecondaryPackageDir(dir); |
+ _linkOrDeleteSecondaryPackageDir(dir); |
_listDirWithoutPackages(dir) |
.where(dirExists) |
- .forEach(_linkSecondaryPackageDir); |
+ .forEach(_linkOrDeleteSecondaryPackageDir); |
} |
// TODO(nweiz): roll this into [listDir] in io.dart once issue 4775 is fixed. |
@@ -294,11 +323,13 @@ class Entrypoint { |
})); |
} |
- /// Creates a symlink to the `packages` directory in [dir]. Will replace one |
- /// if already there. |
- void _linkSecondaryPackageDir(String dir) { |
+ /// If [packageSymlinks] is true, creates a symlink to the "packages" |
+ /// directory in [dir]. |
+ /// |
+ /// Otherwise, deletes a "packages" directories in [dir] if one exists. |
+ void _linkOrDeleteSecondaryPackageDir(String dir) { |
var symlink = path.join(dir, 'packages'); |
if (entryExists(symlink)) deleteEntry(symlink); |
- createSymlink(packagesDir, symlink, relative: true); |
+ if (_packageSymlinks) createSymlink(packagesDir, symlink, relative: true); |
} |
} |