| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library entrypoint; | 5 library entrypoint; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import '../../pkg/pathos/lib/path.dart' as path; | 9 import '../../pkg/pathos/lib/path.dart' as path; |
| 10 | 10 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 /// | 67 /// |
| 68 /// See also [installDependencies]. | 68 /// See also [installDependencies]. |
| 69 Future<PackageId> install(PackageId id) { | 69 Future<PackageId> install(PackageId id) { |
| 70 var pendingOrCompleted = _installs[id]; | 70 var pendingOrCompleted = _installs[id]; |
| 71 if (pendingOrCompleted != null) return pendingOrCompleted; | 71 if (pendingOrCompleted != null) return pendingOrCompleted; |
| 72 | 72 |
| 73 var packageDir = path.join(packagesDir, id.name); | 73 var packageDir = path.join(packagesDir, id.name); |
| 74 var future = defer(() { | 74 var future = defer(() { |
| 75 ensureDir(path.dirname(packageDir)); | 75 ensureDir(path.dirname(packageDir)); |
| 76 | 76 |
| 77 if (dirExists(packageDir)) { | 77 if (entryExists(packageDir)) { |
| 78 // TODO(nweiz): figure out when to actually delete the directory, and | 78 // TODO(nweiz): figure out when to actually delete the directory, and |
| 79 // when we can just re-use the existing symlink. | 79 // when we can just re-use the existing symlink. |
| 80 log.fine("Deleting package directory for ${id.name} before install."); | 80 log.fine("Deleting package directory for ${id.name} before install."); |
| 81 deleteDir(packageDir); | 81 deleteEntry(packageDir); |
| 82 } | 82 } |
| 83 | 83 |
| 84 if (id.source.shouldCache) { | 84 if (id.source.shouldCache) { |
| 85 return cache.install(id).then( | 85 return cache.install(id).then( |
| 86 (pkg) => createPackageSymlink(id.name, pkg.dir, packageDir)); | 86 (pkg) => createPackageSymlink(id.name, pkg.dir, packageDir)); |
| 87 } else { | 87 } else { |
| 88 return id.source.install(id, packageDir).then((found) { | 88 return id.source.install(id, packageDir).then((found) { |
| 89 if (found) return null; | 89 if (found) return null; |
| 90 // TODO(nweiz): More robust error-handling. | 90 // TODO(nweiz): More robust error-handling. |
| 91 throw 'Package ${id.name} not found in source "${id.source.name}".'; | 91 throw 'Package ${id.name} not found in source "${id.source.name}".'; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 "or adding a version constraint to use an older version of a " | 203 "or adding a version constraint to use an older version of a " |
| 204 "package."); | 204 "package."); |
| 205 } | 205 } |
| 206 }); | 206 }); |
| 207 } | 207 } |
| 208 | 208 |
| 209 /// Loads the list of concrete package versions from the `pubspec.lock`, if it | 209 /// Loads the list of concrete package versions from the `pubspec.lock`, if it |
| 210 /// exists. If it doesn't, this completes to an empty [LockFile]. | 210 /// exists. If it doesn't, this completes to an empty [LockFile]. |
| 211 LockFile loadLockFile() { | 211 LockFile loadLockFile() { |
| 212 var lockFilePath = path.join(root.dir, 'pubspec.lock'); | 212 var lockFilePath = path.join(root.dir, 'pubspec.lock'); |
| 213 if (!fileExists(lockFilePath)) return new LockFile.empty(); | 213 if (!entryExists(lockFilePath)) return new LockFile.empty(); |
| 214 return new LockFile.load(lockFilePath, cache.sources); | 214 return new LockFile.load(lockFilePath, cache.sources); |
| 215 } | 215 } |
| 216 | 216 |
| 217 /// Saves a list of concrete package versions to the `pubspec.lock` file. | 217 /// Saves a list of concrete package versions to the `pubspec.lock` file. |
| 218 void _saveLockFile(List<PackageId> packageIds) { | 218 void _saveLockFile(List<PackageId> packageIds) { |
| 219 var lockFile = new LockFile.empty(); | 219 var lockFile = new LockFile.empty(); |
| 220 for (var id in packageIds) { | 220 for (var id in packageIds) { |
| 221 if (!id.isRoot) lockFile.packages[id.name] = id; | 221 if (!id.isRoot) lockFile.packages[id.name] = id; |
| 222 } | 222 } |
| 223 | 223 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 }); | 291 }); |
| 292 }).toList()); | 292 }).toList()); |
| 293 }).then(flatten); | 293 }).then(flatten); |
| 294 } | 294 } |
| 295 | 295 |
| 296 /// Creates a symlink to the `packages` directory in [dir]. Will replace one | 296 /// Creates a symlink to the `packages` directory in [dir]. Will replace one |
| 297 /// if already there. | 297 /// if already there. |
| 298 Future _linkSecondaryPackageDir(String dir) { | 298 Future _linkSecondaryPackageDir(String dir) { |
| 299 return defer(() { | 299 return defer(() { |
| 300 var symlink = path.join(dir, 'packages'); | 300 var symlink = path.join(dir, 'packages'); |
| 301 // The order of if tests is significant here. fileExists() will return | 301 if (entryExists(symlink)) deleteEntry(symlink); |
| 302 // true for a symlink (broken or not) but deleteFile() cannot be used | |
| 303 // to delete a broken symlink on Windows. So we test for the directory | |
| 304 // first since deleteDir() does work on symlinks. | |
| 305 // TODO(rnystrom): Make deleteFile() work for symlinks on Windows so this | |
| 306 // doesn't matter. | |
| 307 if (dirExists(symlink)) { | |
| 308 deleteDir(symlink); | |
| 309 } else if (fileExists(symlink)) { | |
| 310 deleteFile(symlink); | |
| 311 } | |
| 312 return createSymlink(packagesDir, symlink, relative: true); | 302 return createSymlink(packagesDir, symlink, relative: true); |
| 313 }); | 303 }); |
| 314 } | 304 } |
| 315 } | 305 } |
| OLD | NEW |