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();
            }
        }
Beispiel #3
0
        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();
            }
        }