public void IsUnknown(int?semVerLevelKey, bool expected) { var package = new Package { SemVerLevelKey = semVerLevelKey }; var compiledFunction = SemVerLevelKey.IsUnknownPredicate().Compile(); var actual = compiledFunction(package); Assert.Equal(expected, actual); }
public virtual async Task UpdateIsLatestAsync(PackageRegistration packageRegistration, bool commitChanges = true) { if (!packageRegistration.Packages.Any()) { return; } // TODO: improve setting the latest bit; this is horrible. Trigger maybe? var currentUtcTime = DateTime.UtcNow; foreach (var pv in packageRegistration.Packages.Where(p => p.IsLatest || p.IsLatestStable || p.IsLatestSemVer2 || p.IsLatestStableSemVer2)) { pv.IsLatest = false; pv.IsLatestStable = false; pv.IsLatestSemVer2 = false; pv.IsLatestStableSemVer2 = false; pv.LastUpdated = currentUtcTime; } // If the last listed package was just unlisted, then we won't find another one var latestPackage = FindPackage( packageRegistration.Packages.AsQueryable(), ps => ps .Where(SemVerLevelKey.IsUnknownPredicate()) .Where(p => p.PackageStatusKey == PackageStatus.Available && p.Listed)); var latestSemVer2Package = FindPackage( packageRegistration.Packages.AsQueryable(), ps => ps .Where(SemVerLevelKey.IsSemVer2Predicate()) .Where(p => p.PackageStatusKey == PackageStatus.Available && p.Listed)); if (latestPackage != null) { latestPackage.IsLatest = true; latestPackage.LastUpdated = currentUtcTime; if (latestPackage.IsPrerelease) { // If the newest uploaded package is a prerelease package, we need to find an older package that is // a release version and set it to IsLatest. var latestReleasePackage = FindPackage(packageRegistration .Packages .AsQueryable() .Where(SemVerLevelKey.IsUnknownPredicate()) .Where(p => !p.IsPrerelease && p.PackageStatusKey == PackageStatus.Available && p.Listed)); if (latestReleasePackage != null) { // We could have no release packages latestReleasePackage.IsLatestStable = true; latestReleasePackage.LastUpdated = currentUtcTime; } } else { // Only release versions are marked as IsLatestStable. latestPackage.IsLatestStable = true; } } if (latestSemVer2Package != null) { latestSemVer2Package.IsLatestSemVer2 = true; latestSemVer2Package.LastUpdated = currentUtcTime; if (latestSemVer2Package.IsPrerelease) { // If the newest uploaded package is a prerelease package, we need to find an older package that is // a release version and set it to IsLatest. var latestSemVer2ReleasePackage = FindPackage(packageRegistration .Packages .AsQueryable() .Where(SemVerLevelKey.IsSemVer2Predicate()) .Where(p => !p.IsPrerelease && p.PackageStatusKey == PackageStatus.Available && p.Listed)); if (latestSemVer2ReleasePackage != null) { // We could have no release packages latestSemVer2ReleasePackage.IsLatestStableSemVer2 = true; latestSemVer2ReleasePackage.LastUpdated = currentUtcTime; } } else { // Only release versions are marked as IsLatestStable. latestSemVer2Package.IsLatestStableSemVer2 = true; } } if (commitChanges) { await _packageRepository.CommitChangesAsync(); } }
public virtual async Task UpdateIsLatestAsync(PackageRegistration packageRegistration, bool commitChanges = true) { if (!packageRegistration.Packages.Any()) { return; } // TODO: improve setting the latest bit; this is horrible. Trigger maybe? var currentUtcTime = DateTime.UtcNow; foreach (var pv in packageRegistration.Packages.Where(p => p.IsLatest || p.IsLatestStable || p.IsLatestSemVer2 || p.IsLatestStableSemVer2)) { pv.IsLatest = false; pv.IsLatestStable = false; pv.IsLatestSemVer2 = false; pv.IsLatestStableSemVer2 = false; pv.LastUpdated = currentUtcTime; } // If the last listed package was just unlisted, then we won't find another one var latestPackage = FindPackage( packageRegistration.Packages.AsQueryable(), ps => ps .Where(SemVerLevelKey.IsUnknownPredicate()) .Where(p => p.PackageStatusKey == PackageStatus.Available && p.Listed)); var latestSemVer2Package = FindPackage( packageRegistration.Packages.AsQueryable(), ps => ps .Where(SemVerLevelKey.IsSemVer2Predicate()) .Where(p => p.PackageStatusKey == PackageStatus.Available && p.Listed)); if (latestPackage != null) { latestPackage.IsLatest = true; latestPackage.LastUpdated = currentUtcTime; if (latestPackage.IsPrerelease) { // If the newest uploaded package is a prerelease package, we need to find an older package that is // a release version and set it to IsLatest. var latestReleasePackage = FindPackage(packageRegistration .Packages .AsQueryable() .Where(SemVerLevelKey.IsUnknownPredicate()) .Where(p => !p.IsPrerelease && p.PackageStatusKey == PackageStatus.Available && p.Listed)); if (latestReleasePackage != null) { // We could have no release packages latestReleasePackage.IsLatestStable = true; latestReleasePackage.LastUpdated = currentUtcTime; } } else { // Only release versions are marked as IsLatestStable. latestPackage.IsLatestStable = true; } } if (latestSemVer2Package != null) { latestSemVer2Package.IsLatestSemVer2 = true; latestSemVer2Package.LastUpdated = currentUtcTime; if (latestSemVer2Package.IsPrerelease) { // If the newest uploaded package is a prerelease package, we need to find an older package that is // a release version and set it to IsLatest. var latestSemVer2ReleasePackage = FindPackage(packageRegistration .Packages .AsQueryable() .Where(SemVerLevelKey.IsSemVer2Predicate()) .Where(p => !p.IsPrerelease && p.PackageStatusKey == PackageStatus.Available && p.Listed)); if (latestSemVer2ReleasePackage != null) { // We could have no release packages latestSemVer2ReleasePackage.IsLatestStableSemVer2 = true; latestSemVer2ReleasePackage.LastUpdated = currentUtcTime; } } else { // Only release versions are marked as IsLatestStable. latestSemVer2Package.IsLatestStableSemVer2 = true; } } // Update the ID on the PackageRegistration if the value differs only by case from the absolute latest // (stable or prerelease) SemVer 2.0.0 package. This is a best effort flow because in general package IDs // are compared in a case-insensitive manner and therefore the PackageRegistration ID casing should not // have any functional impact. The specific casing is only a display concern. if (latestSemVer2Package != null && string.Equals(latestSemVer2Package.Id, packageRegistration.Id, StringComparison.OrdinalIgnoreCase) && !string.Equals(latestSemVer2Package.Id, packageRegistration.Id, StringComparison.Ordinal)) { packageRegistration.Id = latestSemVer2Package.Id; } if (commitChanges) { await _packageRepository.CommitChangesAsync(); } }