From 2baac1b1c5c77435c38808e2eb8ba4868f25def2 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Wed, 13 Aug 2014 22:47:15 +0100 Subject: [PATCH] Use version constraints for updates shown in Manage Packages dialog. A version constraint defined in the packages.config file, as shown below, is now used when checking for package updates from a package source. Previously always the latest version of the NuGet package would be displayed as an update in the Manage Packages dialog. After updating to jQuery 1.7.2 then no further updates will be shown in the Manage Packages dialog. Currently this only works if a project is selected when the Manage Packages dialog is opened. --- .../Cmdlets/Project/Src/GetPackageCmdlet.cs | 2 +- .../Src/PackageManagementSelectedProjects.cs | 8 ++++ .../Project/Src/UpdatedPackages.cs | 21 +++++++--- .../Project/Src/UpdatedPackagesViewModel.cs | 2 +- .../Test/Src/UpdatedPackagesTests.cs | 41 ++++++++++++++++++- .../Test/Src/UpdatedPackagesViewModelTests.cs | 27 ++++++++++++ 6 files changed, 93 insertions(+), 8 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/GetPackageCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/GetPackageCmdlet.cs index 74c4cfadf9..fdaac36cbb 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/GetPackageCmdlet.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/GetPackageCmdlet.cs @@ -200,7 +200,7 @@ namespace ICSharpCode.PackageManagement.Cmdlets if (project != null) { return new UpdatedPackages(project, repository); } - return new UpdatedPackages(GetPackagesInstalledIntoAnyProject(), repository); + return new UpdatedPackages(GetPackagesInstalledIntoAnyProject(), repository, NullConstraintProvider.Instance); } IQueryable GetPackagesInstalledIntoAnyProject() diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSelectedProjects.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSelectedProjects.cs index f5cf048d2c..3e04227eec 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSelectedProjects.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSelectedProjects.cs @@ -157,5 +157,13 @@ namespace ICSharpCode.PackageManagement } return null; } + + public IPackageConstraintProvider GetConstraintProvider(IPackageRepository repository) + { + if (HasSingleProjectSelected()) { + return GetSingleProjectSelected(repository).ConstraintProvider; + } + return NullConstraintProvider.Instance; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackages.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackages.cs index 073b0cd7a4..730c64bcb5 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackages.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackages.cs @@ -29,22 +29,26 @@ namespace ICSharpCode.PackageManagement { IPackageRepository sourceRepository; IQueryable installedPackages; + IPackageConstraintProvider constraintProvider; public UpdatedPackages( IPackageManagementProject project, IPackageRepository aggregateRepository) : this( project.GetPackages(), - aggregateRepository) + aggregateRepository, + project.ConstraintProvider) { } public UpdatedPackages( IQueryable installedPackages, - IPackageRepository aggregrateRepository) + IPackageRepository aggregrateRepository, + IPackageConstraintProvider constraintProvider) { this.installedPackages = installedPackages; this.sourceRepository = aggregrateRepository; + this.constraintProvider = constraintProvider; } public string SearchTerms { get; set; } @@ -54,7 +58,7 @@ namespace ICSharpCode.PackageManagement IQueryable localPackages = installedPackages; localPackages = FilterPackages(localPackages); IEnumerable distinctLocalPackages = DistinctPackages(localPackages); - return GetUpdatedPackages(sourceRepository, distinctLocalPackages, includePrerelease); + return GetUpdatedPackages(distinctLocalPackages, includePrerelease); } IQueryable GetInstalledPackages() @@ -81,11 +85,18 @@ namespace ICSharpCode.PackageManagement } IEnumerable GetUpdatedPackages( - IPackageRepository sourceRepository, IEnumerable localPackages, bool includePrelease) { - return sourceRepository.GetUpdates(localPackages, includePrelease, false); + IEnumerable constraints = localPackages + .Select(package => constraintProvider.GetConstraint(package.Id)); + + return sourceRepository.GetUpdates( + localPackages, + includePrelease, + false, + null, + constraints); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs index 933a33997b..e14001ae20 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs @@ -78,7 +78,7 @@ namespace ICSharpCode.PackageManagement try { IPackageRepository repository = RegisteredPackageRepositories.ActiveRepository; IQueryable installedPackages = GetInstalledPackages(repository); - updatedPackages = new UpdatedPackages(installedPackages, repository); + updatedPackages = new UpdatedPackages(installedPackages, repository, selectedProjects.GetConstraintProvider(repository)); } catch (Exception ex) { errorMessage = ex.Message; } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesTests.cs index 41cde30364..34979f6dd2 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesTests.cs @@ -20,7 +20,9 @@ using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Versioning; + using ICSharpCode.PackageManagement; +using ICSharpCode.PackageManagement.Design; using NuGet; using NUnit.Framework; using PackageManagement.Tests.Helpers; @@ -37,6 +39,7 @@ namespace PackageManagement.Tests List sourceRepositoryPackages; List packagesUsedWhenCheckingForUpdates; bool includePreleaseUsedWhenCheckingForUpdates; + FakePackageManagementProject project; [SetUp] public void Init() @@ -66,7 +69,17 @@ namespace PackageManagement.Tests }) .Return(sourceRepositoryPackages.AsQueryable()); - updatedPackages = new UpdatedPackages(installedPackages.AsQueryable(), sourceRepository); + updatedPackages = new UpdatedPackages(installedPackages.AsQueryable(), sourceRepository, NullConstraintProvider.Instance); + } + + void CreateProject() + { + project = new FakePackageManagementProject(); + } + + void CreateUpdatedPackages(IPackageRepository repository) + { + updatedPackages = new UpdatedPackages(project, repository); } IPackage AddPackageToSourceRepository(string id, string version) @@ -166,5 +179,31 @@ namespace PackageManagement.Tests Assert.IsFalse(includePreleaseUsedWhenCheckingForUpdates); } + + [Test] + public void GetUpdatedPackages_OnePackageReferencedWithConstraintAndUpdatesAvailable_LatestVersionReturnedBasedOnConstraint() + { + CreateProject(); + project.FakePackages.Add(new FakePackage("Test", "1.0")); + var sourceRepository = new FakePackageRepository(); + FakePackage packageVersion2 = sourceRepository.AddFakePackageWithVersion("Test", "2.0"); + FakePackage [] expectedPackages = new [] { + packageVersion2 + }; + sourceRepository.AddFakePackageWithVersion("Test", "3.0"); + var versionSpec = new VersionSpec(); + versionSpec.MinVersion = new SemanticVersion("1.0"); + versionSpec.IsMinInclusive = true; + versionSpec.MaxVersion = new SemanticVersion("2.0"); + versionSpec.IsMaxInclusive = true; + var constraintProvider = new DefaultConstraintProvider(); + constraintProvider.AddConstraint("Test", versionSpec); + project.ConstraintProvider = constraintProvider; + CreateUpdatedPackages(sourceRepository); + + IEnumerable packages = updatedPackages.GetUpdatedPackages(); + + PackageCollectionAssert.AreEqual(expectedPackages, packages); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs index 01a9c34832..0bec90135f 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs @@ -787,5 +787,32 @@ namespace PackageManagement.Tests operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Update, null); } + + [Test] + public void ReadPackages_TwoPackagesInSourceRepositoryAndTwoNewerPackageVersionAvailableAndProjectHasConstraint_NewerPackageVersionThatMeetsConstraintIsDisplayed() + { + CreateViewModel(); + var versionSpec = new VersionSpec(); + versionSpec.MinVersion = new SemanticVersion("1.0"); + versionSpec.IsMinInclusive = true; + versionSpec.MaxVersion = new SemanticVersion("2.0"); + versionSpec.IsMaxInclusive = true; + var constraintProvider = new DefaultConstraintProvider(); + constraintProvider.AddConstraint("Test", versionSpec); + solution.FakeProjectToReturnFromGetProject.ConstraintProvider = constraintProvider; + AddPackageToLocalRepository("Test", "1.0.0.0"); + AddPackageToActiveRepository("Test", "1.0.0.0"); + FakePackage expectedPackage = AddPackageToActiveRepository("Test", "2.0.0.0"); + AddPackageToActiveRepository("Test", "3.0.0.0"); + + viewModel.ReadPackages(); + CompleteReadPackagesTask(); + + var expectedPackages = new FakePackage[] { + expectedPackage + }; + + PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels); + } } }