Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion app/lib/task/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'package:clock/clock.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:pub_dev/admin/actions/actions.dart';
import 'package:pub_dev/shared/utils.dart';
import 'package:pub_semver/pub_semver.dart';

import '../shared/datastore.dart' as db;
import '../shared/versions.dart' as shared_versions;
Expand Down Expand Up @@ -167,7 +168,7 @@ class PackageState extends db.ExpandoModel<String> {
final at_ = at ?? clock.now();
Duration timeSince(DateTime past) => at_.difference(past);

return versions!.entries
final list = versions!.entries
.where(
// NOTE: Any changes here must be reflected in [derivePendingAt]
(e) =>
Expand All @@ -185,7 +186,40 @@ class PackageState extends db.ExpandoModel<String> {
taskRetryDelay(e.value.attempts)),
)
.map((e) => e.key)
.map(Version.parse)
.toList();

// Prioritize stable versions first, prereleases after them (in decreasing order), e.g.
// - 2.5.0
// - 2.4.0
// - 2.0.0
// - 1.2.0
// - 3.0.0-dev2
// - 3.0.0-dev1
// - 2.7.0-beta
// - 1.0.0-dev
list.sort((a, b) => compareSemanticVersionsDesc(a, b, true, true));

// Promote the first prerelease version to the second position, e.g.
// - 2.5.0
// - 3.0.0-dev2
// - 2.4.0
// - 2.0.0
// - 1.2.0
// - 3.0.0-dev1
// - 2.7.0-beta
// - 1.0.0-dev
//
// (applicable only when the second position is a stable version)
if (list.length > 2 && !list[1].isPreRelease) {
final firstPrereleaseIndex = list.indexWhere((v) => v.isPreRelease);
if (firstPrereleaseIndex > 1) {
final v = list.removeAt(firstPrereleaseIndex);
list.insert(1, v);
}
}

return list.map((s) => s.toString()).toList();
}

/// Returns true if the current [PackageState] instance is new, no version analysis
Expand Down
39 changes: 1 addition & 38 deletions app/lib/task/scheduler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import 'package:pub_dev/task/clock_control.dart';
import 'package:pub_dev/task/cloudcompute/cloudcompute.dart';
import 'package:pub_dev/task/global_lock.dart';
import 'package:pub_dev/task/models.dart';
import 'package:pub_semver/pub_semver.dart';

final _log = Logger('pub.task.schedule');

Expand Down Expand Up @@ -305,48 +304,12 @@ updatePackageStateWithPendingVersions(
final oldVersionsMap = {...?s.versions};

final now = clock.now();
final pendingVersions = s
.pendingVersions(at: now)
.map(Version.parse)
.toList();
final pendingVersions = s.pendingVersions(at: now).toList();
if (pendingVersions.isEmpty) {
// do not schedule anything
return null;
}

// Prioritize stable versions first, prereleases after them (in decreasing order), e.g.
// - 2.5.0
// - 2.4.0
// - 2.0.0
// - 1.2.0
// - 3.0.0-dev2
// - 3.0.0-dev1
// - 2.7.0-beta
// - 1.0.0-dev
pendingVersions.sort(
(a, b) => compareSemanticVersionsDesc(a, b, true, true),
);
// Promote the first prerelease version to the second position, e.g.
// - 2.5.0
// - 3.0.0-dev2
// - 2.4.0
// - 2.0.0
// - 1.2.0
// - 3.0.0-dev1
// - 2.7.0-beta
// - 1.0.0-dev
//
// (applicable only when the second position is a stable version)
if (pendingVersions.length > 2 && !pendingVersions[1].isPreRelease) {
final firstPrereleaseIndex = pendingVersions.indexWhere(
(v) => v.isPreRelease,
);
if (firstPrereleaseIndex > 1) {
final v = pendingVersions.removeAt(firstPrereleaseIndex);
pendingVersions.insert(1, v);
}
}

// Update PackageState
s.versions!.addAll({
for (final v in pendingVersions.map((v) => v.toString()))
Expand Down