@@ -276,122 +276,106 @@ class Package extends db.ExpandoModel<String> {
276276 }
277277
278278 /// Updates the latest* version fields using all the available versions
279- /// and the current Dart SDK.
279+ /// and the current Dart and Flutter SDK version .
280280 ///
281281 /// If the update was triggered because of a single version changing, the
282282 /// [replaced] parameter can be used to replace the corresponding entry
283- /// from the [allVersions ] parameter, which may have been loaded before the
283+ /// from the [versions ] parameter, which may have been loaded before the
284284 /// transaction started.
285- bool updateLatestVersionReferences (
286- Iterable <PackageVersion > allVersions, {
285+ ///
286+ /// Returns whether the internal state has changed.
287+ bool updateVersions (
288+ List <PackageVersion > versions, {
287289 required Version dartSdkVersion,
288290 required Version flutterSdkVersion,
289291 PackageVersion ? replaced,
290292 }) {
291- final versions = allVersions
293+ final oldStableVersion = latestVersionKey;
294+ final oldPrereleaseVersion = latestPrereleaseVersionKey;
295+ final oldPreviewVersion = latestPreviewVersionKey;
296+ final oldLastVersionPublished = lastVersionPublished;
297+ final oldVersionCount = versionCount;
298+
299+ versions = versions
292300 .map ((v) => v.version == replaced? .version ? replaced! : v)
293- .where ((v) => ! v.isModerated)
294301 .toList ();
295- if (versions.isEmpty) {
302+
303+ final isAllRetracted = versions.every ((v) => v.isRetracted);
304+ final isAllModerated = versions.every ((v) => v.isModerated);
305+ if (isAllModerated) {
296306 throw NotAcceptableException ('No visible versions left.' );
297307 }
298308
299- final oldStableVersion = latestSemanticVersion;
300- final oldPrereleaseVersion = latestPrereleaseSemanticVersion;
301- final oldPreviewVersion = latestPreviewSemanticVersion;
302-
303309 // reset field values
304310 latestVersionKey = null ;
305- latestPrereleaseVersionKey = null ;
311+ latestPublished = null ;
306312 latestPreviewVersionKey = null ;
313+ latestPreviewPublished = null ;
314+ latestPrereleaseVersionKey = null ;
315+ latestPrereleasePublished = null ;
316+ lastVersionPublished = null ;
317+ versionCount = 0 ;
318+
319+ for (final pv in versions) {
320+ // Skip all moderated versions.
321+ if (pv.isModerated) {
322+ continue ;
323+ }
307324
308- for (final v in versions.where ((v) => ! v.isRetracted)) {
309- updateVersion (
310- v,
325+ versionCount++ ;
326+
327+ // `lastVersionPublished` is updated regardless of its retracted status.
328+ if (lastVersionPublished == null ||
329+ lastVersionPublished! .isBefore (pv.created! )) {
330+ lastVersionPublished = pv.created;
331+ }
332+
333+ // Skip retracted versions if there is a non-retracted version,
334+ // otherwise process all of the retracted ones.
335+ if (pv.isRetracted && ! isAllRetracted) {
336+ continue ;
337+ }
338+
339+ final newVersion = pv.semanticVersion;
340+ final isOnPreviewSdk = pv.pubspec! .isPreviewForCurrentSdk (
311341 dartSdkVersion: dartSdkVersion,
312342 flutterSdkVersion: flutterSdkVersion,
313343 );
314- }
344+ final isOnStableSdk = ! isOnPreviewSdk;
345+
346+ if (latestVersionKey == null ||
347+ (isNewer (latestSemanticVersion, newVersion, pubSorted: true ) &&
348+ (latestSemanticVersion.isPreRelease || isOnStableSdk))) {
349+ latestVersionKey = pv.key;
350+ latestPublished = pv.created;
351+ }
352+
353+ if (latestPreviewVersionKey == null ||
354+ isNewer (latestPreviewSemanticVersion! , newVersion, pubSorted: true )) {
355+ latestPreviewVersionKey = pv.key;
356+ latestPreviewPublished = pv.created;
357+ }
315358
316- if (latestVersionKey == null ) {
317- // All versions are retracted, we use the latest regardless of retracted status.
318- for (final v in versions) {
319- updateVersion (
320- v,
321- dartSdkVersion: dartSdkVersion,
322- flutterSdkVersion: flutterSdkVersion,
323- );
359+ if (latestPrereleaseVersionKey == null ||
360+ isNewer (latestPrereleaseSemanticVersion! , newVersion,
361+ pubSorted: false )) {
362+ latestPrereleaseVersionKey = pv.key;
363+ latestPrereleasePublished = pv.created;
324364 }
325365 }
326366
327- final unchanged = oldStableVersion == latestSemanticVersion &&
328- oldPrereleaseVersion == latestPrereleaseSemanticVersion &&
329- oldPreviewVersion == latestPreviewSemanticVersion;
367+ final unchanged = oldStableVersion == latestVersionKey &&
368+ oldPrereleaseVersion == latestPrereleaseVersionKey &&
369+ oldPreviewVersion == latestPreviewVersionKey &&
370+ oldLastVersionPublished == lastVersionPublished &&
371+ oldVersionCount == versionCount;
330372 if (unchanged) {
331373 return false ;
332374 }
333375 updated = clock.now ().toUtc ();
334376 return true ;
335377 }
336378
337- /// Updates latest stable, prerelease and preview versions and published
338- /// timestamp with the new version.
339- void updateVersion (
340- PackageVersion pv, {
341- required Version dartSdkVersion,
342- required Version flutterSdkVersion,
343- bool existingLatestIsRetracted = false ,
344- }) {
345- final newVersion = pv.semanticVersion;
346- final isOnStableSdk = ! pv.pubspec! .isPreviewForCurrentSdk (
347- dartSdkVersion: dartSdkVersion,
348- flutterSdkVersion: flutterSdkVersion,
349- );
350-
351- if (existingLatestIsRetracted ||
352- latestVersionKey == null ||
353- (isNewer (latestSemanticVersion, newVersion, pubSorted: true ) &&
354- (latestSemanticVersion.isPreRelease || isOnStableSdk))) {
355- latestVersionKey = pv.key;
356- latestPublished = pv.created;
357- }
358-
359- if (existingLatestIsRetracted ||
360- latestPreviewVersionKey == null ||
361- isNewer (latestPreviewSemanticVersion! , newVersion, pubSorted: true )) {
362- latestPreviewVersionKey = pv.key;
363- latestPreviewPublished = pv.created;
364- }
365-
366- if (existingLatestIsRetracted ||
367- latestPrereleaseVersionKey == null ||
368- isNewer (latestPrereleaseSemanticVersion! , newVersion,
369- pubSorted: false )) {
370- latestPrereleaseVersionKey = pv.key;
371- latestPrereleasePublished = pv.created;
372- }
373-
374- if (lastVersionPublished == null ||
375- lastVersionPublished! .isBefore (pv.created! )) {
376- lastVersionPublished = pv.created;
377- }
378- }
379-
380- /// Checks if a change in a version's status may affect
381- /// the latest versions: is it one of them or is it newer
382- /// than one of the latests.
383- bool mayAffectLatestVersions (Version version) {
384- return latestVersion == version.toString () ||
385- latestPrereleaseVersion == version.toString () ||
386- latestPreviewVersion == version.toString () ||
387- isNewer (latestSemanticVersion, version) ||
388- (latestPrereleaseSemanticVersion != null &&
389- isNewer (latestPrereleaseSemanticVersion! , version,
390- pubSorted: false )) ||
391- (latestPreviewSemanticVersion != null &&
392- isNewer (latestPreviewSemanticVersion! , version, pubSorted: false ));
393- }
394-
395379 bool isNewPackage () => created! .difference (clock.now ()).abs ().inDays <= 30 ;
396380
397381 /// List of tags from the flags on the current [Package] entity.
0 commit comments