in lib/src/solver/report.dart [200:320]
Future<void> _reportPackage(String name,
{bool alwaysShow = false, bool highlightOverride = true}) async {
var newId = _dependencies[name];
var oldId = _previousLockFile.packages[name];
var id = newId ?? oldId!;
var isOverridden = _root.dependencyOverrides.containsKey(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.
String icon;
if (isOverridden) {
icon = log.magenta('! ');
} else if (newId == null) {
icon = log.red('- ');
addedOrRemoved = true;
} else if (oldId == null) {
icon = log.green('+ ');
addedOrRemoved = true;
} else if (!oldId.samePackage(newId)) {
icon = log.cyan('* ');
changed = true;
} else if (oldId.version < newId.version) {
icon = log.green('> ');
changed = true;
} else if (oldId.version > newId.version) {
icon = log.cyan('< ');
changed = true;
} else {
// Unchanged.
icon = ' ';
}
String? message;
// 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) {
newerUnstable = true;
} else {
newerStable = true;
}
}
}
final status =
await _cache.source(id.source).status(id, maxAge: Duration(days: 3));
if (status.isRetracted) {
if (newerStable) {
message =
'(retracted, ${maxAll(versions, Version.prioritize)} available)';
} else if (newId.version.isPreRelease && newerUnstable) {
message = '(retracted, ${maxAll(versions)} available)';
} else {
message = '(retracted)';
}
} else if (status.isDiscontinued &&
(_root.dependencyType(name) == DependencyType.direct ||
_root.dependencyType(name) == DependencyType.dev)) {
if (status.discontinuedReplacedBy == null) {
message = '(discontinued)';
} else {
message =
'(discontinued replaced by ${status.discontinuedReplacedBy})';
}
} else if (newerStable) {
// If there are newer stable versions, only show those.
message = '(${maxAll(versions, Version.prioritize)} available)';
} else if (
// Only show newer prereleases for versions where a prerelease is
// already chosen.
newId.version.isPreRelease && newerUnstable) {
message = '(${maxAll(versions)} available)';
}
}
if (_type == SolveType.get &&
!(alwaysShow || changed || addedOrRemoved || message != null)) {
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)')}");
}
if (message != null) _output.write(' ${log.cyan(message)}');
_output.writeln();
}