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 /** | 5 /** |
6 * Attempts to resolve a set of version constraints for a package dependency | 6 * Attempts to resolve a set of version constraints for a package dependency |
7 * graph and select an appropriate set of best specific versions for all | 7 * graph and select an appropriate set of best specific versions for all |
8 * dependent packages. It works iteratively and tries to reach a stable | 8 * dependent packages. It works iteratively and tries to reach a stable |
9 * solution where the constraints of all dependencies are met. If it fails to | 9 * solution where the constraints of all dependencies are met. If it fails to |
10 * reach a solution after a certain number of iterations, it assumes the | 10 * reach a solution after a certain number of iterations, it assumes the |
(...skipping 20 matching lines...) Expand all Loading... |
31 * of the constraints that its depending packages place on it. If that overall | 31 * of the constraints that its depending packages place on it. If that overall |
32 * constraint changes (say from "<3.0.0" to "<2.5.0"), then the currently | 32 * constraint changes (say from "<3.0.0" to "<2.5.0"), then the currently |
33 * picked version for that package may fall outside of the new constraint. If | 33 * picked version for that package may fall outside of the new constraint. If |
34 * that happens, we find the new best version that meets the updated constraint | 34 * that happens, we find the new best version that meets the updated constraint |
35 * and then the change the package to use that version. That cycles back up to | 35 * and then the change the package to use that version. That cycles back up to |
36 * the beginning again. | 36 * the beginning again. |
37 */ | 37 */ |
38 #library('version_solver'); | 38 #library('version_solver'); |
39 | 39 |
40 #import('dart:json'); | 40 #import('dart:json'); |
| 41 #import('dart:math'); |
41 #import('lock_file.dart'); | 42 #import('lock_file.dart'); |
42 #import('package.dart'); | 43 #import('package.dart'); |
43 #import('pubspec.dart'); | 44 #import('pubspec.dart'); |
44 #import('root_source.dart'); | 45 #import('root_source.dart'); |
45 #import('source.dart'); | 46 #import('source.dart'); |
46 #import('source_registry.dart'); | 47 #import('source_registry.dart'); |
47 #import('utils.dart'); | 48 #import('utils.dart'); |
48 #import('version.dart'); | 49 #import('version.dart'); |
49 | 50 |
50 /** | 51 /** |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 // Stop if we are done. | 102 // Stop if we are done. |
102 if (_work.isEmpty()) return new Future.immediate(buildResults()); | 103 if (_work.isEmpty()) return new Future.immediate(buildResults()); |
103 | 104 |
104 // If we appear to be stuck in a loop, then we probably have an unstable | 105 // If we appear to be stuck in a loop, then we probably have an unstable |
105 // graph, bail. We guess this based on a rough heuristic that it should | 106 // graph, bail. We guess this based on a rough heuristic that it should |
106 // only take a certain number of steps to solve a graph with a given | 107 // only take a certain number of steps to solve a graph with a given |
107 // number of connections. | 108 // number of connections. |
108 // TODO(rnystrom): These numbers here are magic and arbitrary. Tune | 109 // TODO(rnystrom): These numbers here are magic and arbitrary. Tune |
109 // when we have a better picture of real-world package topologies. | 110 // when we have a better picture of real-world package topologies. |
110 _numIterations++; | 111 _numIterations++; |
111 if (_numIterations > Math.max(50, _packages.length * 5)) { | 112 if (_numIterations > max(50, _packages.length * 5)) { |
112 throw new CouldNotSolveException(); | 113 throw new CouldNotSolveException(); |
113 } | 114 } |
114 | 115 |
115 // Run the first work item. | 116 // Run the first work item. |
116 var future = _work.removeFirst().process(this); | 117 var future = _work.removeFirst().process(this); |
117 | 118 |
118 // If we have an async operation to perform, chain the loop to resume | 119 // If we have an async operation to perform, chain the loop to resume |
119 // when it's done. Otherwise, just loop synchronously. | 120 // when it's done. Otherwise, just loop synchronously. |
120 if (future != null) { | 121 if (future != null) { |
121 return future.chain(processNextWorkItem); | 122 return future.chain(processNextWorkItem); |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 final description1; | 700 final description1; |
700 final description2; | 701 final description2; |
701 | 702 |
702 DescriptionMismatchException(this.package, this.description1, | 703 DescriptionMismatchException(this.package, this.description1, |
703 this.description2); | 704 this.description2); |
704 | 705 |
705 // TODO(nweiz): Dump to YAML when that's supported | 706 // TODO(nweiz): Dump to YAML when that's supported |
706 String toString() => "Package '$package' has conflicting descriptions " | 707 String toString() => "Package '$package' has conflicting descriptions " |
707 "'${JSON.stringify(description1)}' and '${JSON.stringify(description2)}'"; | 708 "'${JSON.stringify(description1)}' and '${JSON.stringify(description2)}'"; |
708 } | 709 } |
OLD | NEW |