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 pub.solver.version_solver; | 5 library pub.solver.version_solver; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import "dart:convert"; | 8 import "dart:convert"; |
9 | 9 |
10 import '../lock_file.dart'; | 10 import '../lock_file.dart'; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 return source.describe(id).then((pubspec) { | 114 return source.describe(id).then((pubspec) { |
115 _pubspecs[id] = pubspec; | 115 _pubspecs[id] = pubspec; |
116 return pubspec; | 116 return pubspec; |
117 }); | 117 }); |
118 } | 118 } |
119 | 119 |
120 /// Returns the previously cached pubspec for the package identified by [id] | 120 /// Returns the previously cached pubspec for the package identified by [id] |
121 /// or returns `null` if not in the cache. | 121 /// or returns `null` if not in the cache. |
122 Pubspec getCachedPubspec(PackageId id) => _pubspecs[id]; | 122 Pubspec getCachedPubspec(PackageId id) => _pubspecs[id]; |
123 | 123 |
124 /// Gets the list of versions for [package] in descending order. | 124 /// Gets the list of versions for [package]. |
| 125 /// |
| 126 /// Packages are sorted in descending version order with all "stable" |
| 127 /// versions (i.e. ones without a prerelease suffix) before pre-release |
| 128 /// versions. This ensures that the solver prefers stable packages over |
| 129 /// unstable ones. |
125 Future<List<PackageId>> getVersions(PackageRef package) { | 130 Future<List<PackageId>> getVersions(PackageRef package) { |
126 if (package.isRoot) { | 131 if (package.isRoot) { |
127 throw new StateError("Cannot get versions for root package $package."); | 132 throw new StateError("Cannot get versions for root package $package."); |
128 } | 133 } |
129 | 134 |
130 // See if we have it cached. | 135 // See if we have it cached. |
131 var versions = _versions[package]; | 136 var versions = _versions[package]; |
132 if (versions != null) { | 137 if (versions != null) { |
133 versionCacheHits++; | 138 versionCacheHits++; |
134 return new Future.value(versions); | 139 return new Future.value(versions); |
135 } | 140 } |
136 | 141 |
137 versionCacheMisses++; | 142 versionCacheMisses++; |
138 | 143 |
139 var source = _sources[package.source]; | 144 var source = _sources[package.source]; |
140 return source.getVersions(package.name, package.description) | 145 return source.getVersions(package.name, package.description) |
141 .then((versions) { | 146 .then((versions) { |
142 // Sort by descending version so we try newer versions first. | 147 // Sort by descending version so we try newer versions first. |
143 versions.sort((a, b) => b.compareTo(a)); | 148 versions.sort((a, b) { |
| 149 // Sort all prerelease versions after all normal versions. This way |
| 150 // the solver will prefer stable packages over unstable ones. |
| 151 if (a.isPreRelease && !b.isPreRelease) return 1; |
| 152 if (!a.isPreRelease && b.isPreRelease) return -1; |
| 153 |
| 154 return b.compareTo(a); |
| 155 }); |
144 | 156 |
145 var ids = versions.map((version) => package.atVersion(version)).toList(); | 157 var ids = versions.map((version) => package.atVersion(version)).toList(); |
146 _versions[package] = ids; | 158 _versions[package] = ids; |
147 return ids; | 159 return ids; |
148 }); | 160 }); |
149 } | 161 } |
150 } | 162 } |
151 | 163 |
152 /// A reference from a depending package to a package that it depends on. | 164 /// A reference from a depending package to a package that it depends on. |
153 class Dependency { | 165 class Dependency { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 Iterable<Dependency> dependencies) | 302 Iterable<Dependency> dependencies) |
291 : super(package, dependencies); | 303 : super(package, dependencies); |
292 | 304 |
293 String get _message => "Incompatible dependencies on '$package'"; | 305 String get _message => "Incompatible dependencies on '$package'"; |
294 | 306 |
295 String _describeDependency(PackageDep dep) { | 307 String _describeDependency(PackageDep dep) { |
296 // TODO(nweiz): Dump descriptions to YAML when that's supported. | 308 // TODO(nweiz): Dump descriptions to YAML when that's supported. |
297 return "depends on it with description ${JSON.encode(dep.description)}"; | 309 return "depends on it with description ${JSON.encode(dep.description)}"; |
298 } | 310 } |
299 } | 311 } |
OLD | NEW |