diff --git a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs index 5e3f5c18ce..d57e24dab5 100644 --- a/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs +++ b/src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs @@ -34,6 +34,18 @@ protected override async Task IsPackageValid(IPackage package) if (package.VersionString == package.NewVersionString) return false; + if ( + package.NormalizedNewVersion != default + && package.Manager.CompareVersions(package.VersionString, package.NewVersionString) + is >= 0 + ) + { + Logger.Info( + $"Ignoring package {package.Id} because the offered version {package.NewVersionString} is not newer than the installed version {package.VersionString}." + ); + return false; + } + if (package.NewerVersionIsInstalled()) { Logger.Info( diff --git a/src/UniGetUI.PackageEngine.Tests/UpgradablePackagesLoaderTests.cs b/src/UniGetUI.PackageEngine.Tests/UpgradablePackagesLoaderTests.cs index a1abd13c25..7d94e3c63a 100644 --- a/src/UniGetUI.PackageEngine.Tests/UpgradablePackagesLoaderTests.cs +++ b/src/UniGetUI.PackageEngine.Tests/UpgradablePackagesLoaderTests.cs @@ -170,6 +170,63 @@ await installedLoader.AddForeign( Assert.True(await loader.EvaluatePackageAsync(package)); } + [Fact] + public async Task EvaluatePackageAsync_RejectsOlderOfferedVersionWithoutTheInstalledList() + { + var manager = new PackageManagerBuilder().Build(); + _ = new InstalledPackagesLoader([manager]); + _ = new DiscoverablePackagesLoader([manager]); + var loader = new TestUpgradablePackagesLoader([manager]); + + var package = new PackageBuilder() + .WithManager(manager) + .WithId("Daum.PotPlayer") + .WithVersion("260819") + .WithNewVersion("210428") + .Build(); + + Assert.False(await loader.EvaluatePackageAsync(package)); + } + + [Theory] + [InlineData("stable")] + [InlineData("latest")] + [InlineData("2.0.0_rc1")] + public async Task EvaluatePackageAsync_KeepsUpdatesWhoseOfferedVersionCannotBeParsed(string newVersion) + { + var manager = new PackageManagerBuilder().Build(); + _ = new InstalledPackagesLoader([manager]); + _ = new DiscoverablePackagesLoader([manager]); + var loader = new TestUpgradablePackagesLoader([manager]); + + var package = new PackageBuilder() + .WithManager(manager) + .WithId("org.contoso.Flatpak") + .WithVersion("3.2.1") + .WithNewVersion(newVersion) + .Build(); + + Assert.True(await loader.EvaluatePackageAsync(package)); + } + + [Fact] + public async Task EvaluatePackageAsync_KeepsUpdatesWhenTheInstalledVersionIsUnknown() + { + var manager = new PackageManagerBuilder().Build(); + _ = new InstalledPackagesLoader([manager]); + _ = new DiscoverablePackagesLoader([manager]); + var loader = new TestUpgradablePackagesLoader([manager]); + + var package = new PackageBuilder() + .WithManager(manager) + .WithId("Contoso.Unversioned") + .WithVersion("Unknown") + .WithNewVersion("210428") + .Build(); + + Assert.True(await loader.EvaluatePackageAsync(package)); + } + [Fact] public async Task ApplyWhenAddingPackageAsync_UpdatesDiscoverableAndInstalledTags() {