Index: sdk/lib/_internal/pub_generated/lib/src/solver/dependency_queue.dart |
diff --git a/sdk/lib/_internal/pub_generated/lib/src/solver/dependency_queue.dart b/sdk/lib/_internal/pub_generated/lib/src/solver/dependency_queue.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f2651f4f6b3c4d6c5e1740aaa7dbc36a3d5f3f73 |
--- /dev/null |
+++ b/sdk/lib/_internal/pub_generated/lib/src/solver/dependency_queue.dart |
@@ -0,0 +1,73 @@ |
+library pub.solver.dependency_queue; |
+import 'dart:async'; |
+import 'dart:collection' show Queue; |
+import '../log.dart' as log; |
+import '../package.dart'; |
+import 'backtracking_solver.dart'; |
+class DependencyQueue { |
+ final BacktrackingSolver _solver; |
+ final Queue<PackageDep> _presorted; |
+ final List<PackageDep> _remaining; |
+ bool _isSorted = false; |
+ bool get isEmpty => _presorted.isEmpty && _remaining.isEmpty; |
+ Future _sortFuture; |
+ factory DependencyQueue(BacktrackingSolver solver, Iterable<PackageDep> deps) |
+ { |
+ var presorted = <PackageDep>[]; |
+ var remaining = <PackageDep>[]; |
+ for (var dep in deps) { |
+ if (solver.getSelected(dep.name) != null || |
+ solver.getLocked(dep.name) != null) { |
+ presorted.add(dep); |
+ } else { |
+ remaining.add(dep); |
+ } |
+ } |
+ presorted.sort((a, b) => a.name.compareTo(b.name)); |
+ return new DependencyQueue._( |
+ solver, |
+ new Queue<PackageDep>.from(presorted), |
+ remaining); |
+ } |
+ DependencyQueue._(this._solver, this._presorted, this._remaining); |
+ Future<PackageDep> advance() { |
+ if (_presorted.isNotEmpty) { |
+ return new Future.value(_presorted.removeFirst()); |
+ } |
+ if (!_isSorted) return _sort().then((_) => _remaining.removeAt(0)); |
+ return new Future.value(_remaining.removeAt(0)); |
+ } |
+ Future _sort() { |
+ assert(_sortFuture == null); |
+ _sortFuture = Future.wait(_remaining.map(_getNumVersions)).then((versions) { |
+ _sortFuture = null; |
+ var versionMap = new Map.fromIterables(_remaining, versions); |
+ _remaining.sort((a, b) { |
+ if (versionMap[a] != versionMap[b]) { |
+ return versionMap[a].compareTo(versionMap[b]); |
+ } |
+ return a.name.compareTo(b.name); |
+ }); |
+ _isSorted = true; |
+ }); |
+ return _sortFuture; |
+ } |
+ Future<int> _getNumVersions(PackageDep dep) { |
+ if (dep.isRoot) { |
+ return new Future.value(1); |
+ } |
+ return _solver.cache.getVersions(dep.toRef()).then((versions) { |
+ for (var rootDep in _solver.root.immediateDependencies) { |
+ if (rootDep.name == dep.name) { |
+ versions = |
+ versions.where((id) => rootDep.constraint.allows(id.version)); |
+ break; |
+ } |
+ } |
+ return versions.length; |
+ }).catchError((error, trace) { |
+ log.solver("Could not get versions for $dep:\n$error\n\n$trace"); |
+ return 0; |
+ }); |
+ } |
+} |