| 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;
|
| + });
|
| + }
|
| +}
|
|
|