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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 /// `id.source.shouldCache` is true). | 66 /// `id.source.shouldCache` is true). |
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 if (!dirExists(packageDir)) return; | |
77 | 76 |
78 // TODO(nweiz): figure out when to actually delete the directory, and when | 77 if (dirExists(packageDir)) { |
79 // we can just re-use the existing symlink. | 78 // TODO(nweiz): figure out when to actually delete the directory, and |
80 log.fine("Deleting package directory for ${id.name} before install."); | 79 // when we can just re-use the existing symlink. |
81 return deleteDir(packageDir); | 80 log.fine("Deleting package directory for ${id.name} before install."); |
82 }).then((_) { | 81 deleteDir(packageDir); |
| 82 } |
| 83 |
83 if (id.source.shouldCache) { | 84 if (id.source.shouldCache) { |
84 return cache.install(id).then( | 85 return cache.install(id).then( |
85 (pkg) => createPackageSymlink(id.name, pkg.dir, packageDir)); | 86 (pkg) => createPackageSymlink(id.name, pkg.dir, packageDir)); |
86 } else { | 87 } else { |
87 return id.source.install(id, packageDir).then((found) { | 88 return id.source.install(id, packageDir).then((found) { |
88 if (found) return null; | 89 if (found) return null; |
89 // TODO(nweiz): More robust error-handling. | 90 // TODO(nweiz): More robust error-handling. |
90 throw 'Package ${id.name} not found in source "${id.source.name}".'; | 91 throw 'Package ${id.name} not found in source "${id.source.name}".'; |
91 }); | 92 }); |
92 } | 93 } |
(...skipping 30 matching lines...) Expand all Loading... |
123 for (var dependency in dependencies) { | 124 for (var dependency in dependencies) { |
124 solver.useLatestVersion(dependency); | 125 solver.useLatestVersion(dependency); |
125 } | 126 } |
126 return solver.solve(); | 127 return solver.solve(); |
127 }).then(_installDependencies); | 128 }).then(_installDependencies); |
128 } | 129 } |
129 | 130 |
130 /// Removes the old packages directory, installs all dependencies listed in | 131 /// Removes the old packages directory, installs all dependencies listed in |
131 /// [packageVersions], and writes a [LockFile]. | 132 /// [packageVersions], and writes a [LockFile]. |
132 Future _installDependencies(List<PackageId> packageVersions) { | 133 Future _installDependencies(List<PackageId> packageVersions) { |
133 return cleanDir(packagesDir).then((_) { | 134 return new Future.of(() { |
| 135 cleanDir(packagesDir); |
134 return Future.wait(packageVersions.map((id) { | 136 return Future.wait(packageVersions.map((id) { |
135 if (id.isRoot) return new Future.immediate(id); | 137 if (id.isRoot) return new Future.immediate(id); |
136 return install(id); | 138 return install(id); |
137 }).toList()); | 139 }).toList()); |
138 }).then(_saveLockFile) | 140 }).then(_saveLockFile) |
139 .then(_installSelfReference) | 141 .then(_installSelfReference) |
140 .then(_linkSecondaryPackageDirs); | 142 .then(_linkSecondaryPackageDirs); |
141 } | 143 } |
142 | 144 |
143 /// Traverses the root's package dependency graph and loads each of the | 145 /// Traverses the root's package dependency graph and loads each of the |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 }); | 291 }); |
290 }).toList()); | 292 }).toList()); |
291 }).then(flatten); | 293 }).then(flatten); |
292 } | 294 } |
293 | 295 |
294 /// 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 |
295 /// if already there. | 297 /// if already there. |
296 Future _linkSecondaryPackageDir(String dir) { | 298 Future _linkSecondaryPackageDir(String dir) { |
297 return defer(() { | 299 return defer(() { |
298 var symlink = path.join(dir, 'packages'); | 300 var symlink = path.join(dir, 'packages'); |
299 return new Future.of(() { | 301 if (fileExists(symlink)) { |
300 if (fileExists(symlink)) { | 302 deleteFile(symlink); |
301 deleteFile(symlink); | 303 } else if (dirExists(symlink)) { |
302 } else if (dirExists(symlink)) { | 304 deleteDir(symlink); |
303 return deleteDir(symlink); | 305 } |
304 } | 306 return createSymlink(packagesDir, symlink, relative: true); |
305 }).then((_) => createSymlink(packagesDir, symlink, relative: true)); | |
306 }); | 307 }); |
307 } | 308 } |
308 } | 309 } |
OLD | NEW |