Outdated: If current is a prerelease, use prereleases for latest if no newer stable (#2484)
diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index 0d5f289..e239a27 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -219,6 +219,12 @@
/// Get the latest version of [package].
///
+ /// Will include prereleases in the comparison '--prereleases' was provided
+ /// in arguments.
+ ///
+ /// If [package] is a [PackageId] with a prerelease version and there are no
+ /// later stable version we return a prerelease version if it exists.
+ ///
/// Returns `null`, if unable to find the package.
Future<PackageId> _getLatest(PackageName package) async {
if (package == null) {
@@ -229,12 +235,19 @@
if (available.isEmpty) {
return null;
}
+
final prereleases = argResults.wasParsed('prereleases')
? argResults['prereleases']
: argResults['pre-releases'];
+
available.sort(prereleases
? (x, y) => x.version.compareTo(y.version)
: (x, y) => Version.prioritize(x.version, y.version));
+ if (package is PackageId &&
+ package.version.isPreRelease &&
+ package.version < available.last.version) {
+ available.sort((x, y) => x.version.compareTo(y.version));
+ }
return available.last;
}
diff --git a/test/outdated/goldens/prereleases.txt b/test/outdated/goldens/prereleases.txt
new file mode 100644
index 0000000..931b5de
--- /dev/null
+++ b/test/outdated/goldens/prereleases.txt
@@ -0,0 +1,118 @@
+$ pub outdated --json
+{
+ "packages": [
+ {
+ "package": "foo",
+ "current": {
+ "version": "1.0.0-dev.1"
+ },
+ "upgradable": {
+ "version": "1.0.0-dev.1"
+ },
+ "resolvable": {
+ "version": "0.9.0"
+ },
+ "latest": {
+ "version": "0.9.0"
+ }
+ },
+ {
+ "package": "mop",
+ "current": {
+ "version": "0.10.0-dev"
+ },
+ "upgradable": {
+ "version": "0.10.0-dev"
+ },
+ "resolvable": {
+ "version": "0.10.0"
+ },
+ "latest": {
+ "version": "1.0.0-dev"
+ }
+ }
+ ]
+}
+
+$ pub outdated --no-color
+Dependencies Current Upgradable Resolvable Latest
+foo *1.0.0-dev.1 *1.0.0-dev.1 0.9.0 0.9.0
+mop *0.10.0-dev *0.10.0-dev *0.10.0 1.0.0-dev
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2 dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --mark=none
+Dependencies Current Upgradable Resolvable Latest
+foo 1.0.0-dev.1 1.0.0-dev.1 0.9.0 0.9.0
+mop 0.10.0-dev 0.10.0-dev 0.10.0 1.0.0-dev
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2 dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --up-to-date
+Dependencies Current Upgradable Resolvable Latest
+bar 0.9.0 0.9.0 0.9.0 0.9.0
+foo *1.0.0-dev.1 *1.0.0-dev.1 0.9.0 0.9.0
+mop *0.10.0-dev *0.10.0-dev *0.10.0 1.0.0-dev
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2 dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --prereleases
+Dependencies Current Upgradable Resolvable Latest
+bar *0.9.0 *0.9.0 *0.9.0 1.0.0-dev.2
+foo *1.0.0-dev.1 *1.0.0-dev.1 *0.9.0 1.0.0-dev.2
+mop *0.10.0-dev *0.10.0-dev *0.10.0 1.0.0-dev
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2 dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --no-dev-dependencies
+Dependencies Current Upgradable Resolvable Latest
+foo *1.0.0-dev.1 *1.0.0-dev.1 0.9.0 0.9.0
+mop *0.10.0-dev *0.10.0-dev *0.10.0 1.0.0-dev
+
+transitive dependencies: all up-to-date
+
+2 dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
+$ pub outdated --no-color --no-dependency-overrides
+Dependencies Current Upgradable Resolvable Latest
+foo *1.0.0-dev.1 *1.0.0-dev.1 0.9.0 0.9.0
+mop *0.10.0-dev *0.10.0-dev *0.10.0 1.0.0-dev
+
+dev_dependencies: all up-to-date
+
+transitive dependencies: all up-to-date
+
+transitive dev_dependencies: all up-to-date
+
+2 dependencies are constrained to versions that are older than a resolvable version.
+To update these dependencies, edit pubspec.yaml.
+
diff --git a/test/outdated/outdated_test.dart b/test/outdated/outdated_test.dart
index b8aaf8a..227276d 100644
--- a/test/outdated/outdated_test.dart
+++ b/test/outdated/outdated_test.dart
@@ -219,4 +219,34 @@
await variations('dependency_overrides_no_solution');
});
+
+ test(
+ 'latest version reported while locked on a prerelease can be a prerelease',
+ () async {
+ await servePackages((builder) => builder
+ ..serve('foo', '0.9.0')
+ ..serve('foo', '1.0.0-dev.1')
+ ..serve('foo', '1.0.0-dev.2')
+ ..serve('bar', '0.9.0')
+ ..serve('bar', '1.0.0-dev.1')
+ ..serve('bar', '1.0.0-dev.2')
+ ..serve('mop', '0.10.0-dev')
+ ..serve('mop', '0.10.0')
+ ..serve('mop', '1.0.0-dev'));
+ await d.dir(appPath, [
+ d.pubspec({
+ 'name': 'app',
+ 'version': '1.0.1',
+ 'dependencies': {
+ 'foo': '1.0.0-dev.1',
+ 'bar': '^0.9.0',
+ 'mop': '0.10.0-dev'
+ },
+ })
+ ]).create();
+
+ await pubGet();
+
+ await variations('prereleases');
+ });
}