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); + } } }