| Index: sdk/lib/_internal/pub_generated/lib/src/solver/solve_report.dart
|
| diff --git a/sdk/lib/_internal/pub_generated/lib/src/solver/solve_report.dart b/sdk/lib/_internal/pub_generated/lib/src/solver/solve_report.dart
|
| index f4603f24db74506ecd3aca16fad0c199b4433e55..4e6cfa603354f294ba7f0b2139bc8c5df0c90fac 100644
|
| --- a/sdk/lib/_internal/pub_generated/lib/src/solver/solve_report.dart
|
| +++ b/sdk/lib/_internal/pub_generated/lib/src/solver/solve_report.dart
|
| @@ -1,40 +1,72 @@
|
| +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| library pub.solver.solve_report;
|
| +
|
| import 'package:pub_semver/pub_semver.dart';
|
| +
|
| import '../lock_file.dart';
|
| import '../log.dart' as log;
|
| import '../package.dart';
|
| import '../source_registry.dart';
|
| import '../utils.dart';
|
| import 'version_solver.dart';
|
| +
|
| +/// Unlike [SolveResult], which is the static data describing a resolution,
|
| +/// this class contains the mutable state used while generating the report
|
| +/// itself.
|
| +///
|
| +/// It's a report builder.
|
| class SolveReport {
|
| final SolveType _type;
|
| final SourceRegistry _sources;
|
| final Package _root;
|
| final LockFile _previousLockFile;
|
| final SolveResult _result;
|
| +
|
| + /// The dependencies in [_result], keyed by package name.
|
| final _dependencies = new Map<String, PackageId>();
|
| +
|
| final _output = new StringBuffer();
|
| +
|
| SolveReport(this._type, this._sources, this._root, this._previousLockFile,
|
| this._result) {
|
| + // Fill the map so we can use it later.
|
| for (var id in _result.packages) {
|
| _dependencies[id.name] = id;
|
| }
|
| }
|
| +
|
| + /// Displays a report of the results of the version resolution relative to
|
| + /// the previous lock file.
|
| void show() {
|
| _reportChanges();
|
| _reportOverrides();
|
| }
|
| +
|
| + /// Displays a one-line message summarizing what changes were made (or would
|
| + /// be made) to the lockfile.
|
| + ///
|
| + /// If [dryRun] is true, describes it in terms of what would be done.
|
| void summarize({bool dryRun: false}) {
|
| + // Count how many dependencies actually changed.
|
| var dependencies = _dependencies.keys.toSet();
|
| dependencies.addAll(_previousLockFile.packages.keys);
|
| dependencies.remove(_root.name);
|
| +
|
| var numChanged = dependencies.where((name) {
|
| var oldId = _previousLockFile.packages[name];
|
| var newId = _dependencies[name];
|
| +
|
| + // Added or removed dependencies count.
|
| if (oldId == null) return true;
|
| if (newId == null) return true;
|
| +
|
| + // The dependency existed before, so see if it was modified.
|
| return !_sources.idsEqual(oldId, newId);
|
| }).length;
|
| +
|
| if (dryRun) {
|
| if (numChanged == 0) {
|
| log.message("No dependencies would change.");
|
| @@ -57,12 +89,19 @@ class SolveReport {
|
| }
|
| }
|
| }
|
| +
|
| + /// Displays a report of all of the previous and current dependencies and
|
| + /// how they have changed.
|
| void _reportChanges() {
|
| _output.clear();
|
| +
|
| + // Show the new set of dependencies ordered by name.
|
| var names = _result.packages.map((id) => id.name).toList();
|
| names.remove(_root.name);
|
| names.sort();
|
| names.forEach(_reportPackage);
|
| +
|
| + // Show any removed ones.
|
| var removed = _previousLockFile.packages.keys.toSet();
|
| removed.removeAll(names);
|
| if (removed.isNotEmpty) {
|
| @@ -71,28 +110,55 @@ class SolveReport {
|
| removed.sort();
|
| removed.forEach((name) => _reportPackage(name, alwaysShow: true));
|
| }
|
| +
|
| log.message(_output);
|
| }
|
| +
|
| + /// Displays a warning about the overrides currently in effect.
|
| void _reportOverrides() {
|
| _output.clear();
|
| +
|
| if (_result.overrides.isNotEmpty) {
|
| _output.writeln("Warning: You are using these overridden dependencies:");
|
| var overrides = _result.overrides.map((dep) => dep.name).toList();
|
| overrides.sort((a, b) => a.compareTo(b));
|
| +
|
| overrides.forEach(
|
| (name) => _reportPackage(name, alwaysShow: true, highlightOverride: false));
|
| +
|
| log.warning(_output);
|
| }
|
| }
|
| +
|
| + /// Reports the results of the upgrade on the package named [name].
|
| + ///
|
| + /// If [alwaysShow] is true, the package is reported even if it didn't change,
|
| + /// regardless of [_type]. If [highlightOverride] is true (or absent), writes
|
| + /// "(override)" next to overridden packages.
|
| void _reportPackage(String name, {bool alwaysShow: false,
|
| bool highlightOverride: true}) {
|
| var newId = _dependencies[name];
|
| var oldId = _previousLockFile.packages[name];
|
| var id = newId != null ? newId : oldId;
|
| +
|
| var isOverridden =
|
| _result.overrides.map((dep) => dep.name).contains(id.name);
|
| +
|
| + // If the package was previously a dependency but the dependency has
|
| + // changed in some way.
|
| var changed = false;
|
| +
|
| + // If the dependency was added or removed.
|
| var addedOrRemoved = false;
|
| +
|
| + // Show a one-character "icon" describing the change. They are:
|
| + //
|
| + // ! The package is being overridden.
|
| + // - The package was removed.
|
| + // + The package was added.
|
| + // > The package was upgraded from a lower version.
|
| + // < The package was downgraded from a higher version.
|
| + // * Any other change between the old and new package.
|
| var icon;
|
| if (isOverridden) {
|
| icon = log.magenta("! ");
|
| @@ -112,27 +178,39 @@ class SolveReport {
|
| icon = log.cyan("< ");
|
| changed = true;
|
| } else {
|
| + // Unchanged.
|
| icon = " ";
|
| }
|
| +
|
| if (_type == SolveType.GET && !(alwaysShow || changed || addedOrRemoved)) {
|
| return;
|
| }
|
| +
|
| _output.write(icon);
|
| _output.write(log.bold(id.name));
|
| _output.write(" ");
|
| _writeId(id);
|
| +
|
| + // If the package was upgraded, show what it was upgraded from.
|
| if (changed) {
|
| _output.write(" (was ");
|
| _writeId(oldId);
|
| _output.write(")");
|
| }
|
| +
|
| + // Highlight overridden packages.
|
| if (isOverridden && highlightOverride) {
|
| _output.write(" ${log.magenta('(overridden)')}");
|
| }
|
| +
|
| + // See if there are any newer versions of the package that we were
|
| + // unable to upgrade to.
|
| if (newId != null && _type != SolveType.DOWNGRADE) {
|
| var versions = _result.availableVersions[newId.name];
|
| +
|
| var newerStable = false;
|
| var newerUnstable = false;
|
| +
|
| for (var version in versions) {
|
| if (version > newId.version) {
|
| if (version.isPreRelease) {
|
| @@ -142,18 +220,25 @@ class SolveReport {
|
| }
|
| }
|
| }
|
| +
|
| + // If there are newer stable versions, only show those.
|
| var message;
|
| if (newerStable) {
|
| message = "(${maxAll(versions, Version.prioritize)} available)";
|
| } else if (newerUnstable) {
|
| message = "(${maxAll(versions)} available)";
|
| }
|
| +
|
| if (message != null) _output.write(" ${log.cyan(message)}");
|
| }
|
| +
|
| _output.writeln();
|
| }
|
| +
|
| + /// Writes a terse description of [id] (not including its name) to the output.
|
| void _writeId(PackageId id) {
|
| _output.write(id.version);
|
| +
|
| var source = _sources[id.source];
|
| if (source != _sources.defaultSource) {
|
| var description = source.formatDescription(_root.dir, id.description);
|
|
|