Browse Source

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.

  <package
    id="jQuery"
    version="1.4.1"
    targetFramework="net40"
    allowedVersions="[1.4.1,1.8)" />

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.
pull/505/merge
Matt Ward 12 years ago
parent
commit
2baac1b1c5
  1. 2
      src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/GetPackageCmdlet.cs
  2. 8
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSelectedProjects.cs
  3. 21
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackages.cs
  4. 2
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs
  5. 41
      src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesTests.cs
  6. 27
      src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs

2
src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/GetPackageCmdlet.cs

@ -200,7 +200,7 @@ namespace ICSharpCode.PackageManagement.Cmdlets @@ -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<IPackage> GetPackagesInstalledIntoAnyProject()

8
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementSelectedProjects.cs

@ -157,5 +157,13 @@ namespace ICSharpCode.PackageManagement @@ -157,5 +157,13 @@ namespace ICSharpCode.PackageManagement
}
return null;
}
public IPackageConstraintProvider GetConstraintProvider(IPackageRepository repository)
{
if (HasSingleProjectSelected()) {
return GetSingleProjectSelected(repository).ConstraintProvider;
}
return NullConstraintProvider.Instance;
}
}
}

21
src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackages.cs

@ -29,22 +29,26 @@ namespace ICSharpCode.PackageManagement @@ -29,22 +29,26 @@ namespace ICSharpCode.PackageManagement
{
IPackageRepository sourceRepository;
IQueryable<IPackage> installedPackages;
IPackageConstraintProvider constraintProvider;
public UpdatedPackages(
IPackageManagementProject project,
IPackageRepository aggregateRepository)
: this(
project.GetPackages(),
aggregateRepository)
aggregateRepository,
project.ConstraintProvider)
{
}
public UpdatedPackages(
IQueryable<IPackage> 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 @@ -54,7 +58,7 @@ namespace ICSharpCode.PackageManagement
IQueryable<IPackage> localPackages = installedPackages;
localPackages = FilterPackages(localPackages);
IEnumerable<IPackage> distinctLocalPackages = DistinctPackages(localPackages);
return GetUpdatedPackages(sourceRepository, distinctLocalPackages, includePrerelease);
return GetUpdatedPackages(distinctLocalPackages, includePrerelease);
}
IQueryable<IPackage> GetInstalledPackages()
@ -81,11 +85,18 @@ namespace ICSharpCode.PackageManagement @@ -81,11 +85,18 @@ namespace ICSharpCode.PackageManagement
}
IEnumerable<IPackage> GetUpdatedPackages(
IPackageRepository sourceRepository,
IEnumerable<IPackage> localPackages,
bool includePrelease)
{
return sourceRepository.GetUpdates(localPackages, includePrelease, false);
IEnumerable<IVersionSpec> constraints = localPackages
.Select(package => constraintProvider.GetConstraint(package.Id));
return sourceRepository.GetUpdates(
localPackages,
includePrelease,
false,
null,
constraints);
}
}
}

2
src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackagesViewModel.cs

@ -78,7 +78,7 @@ namespace ICSharpCode.PackageManagement @@ -78,7 +78,7 @@ namespace ICSharpCode.PackageManagement
try {
IPackageRepository repository = RegisteredPackageRepositories.ActiveRepository;
IQueryable<IPackage> installedPackages = GetInstalledPackages(repository);
updatedPackages = new UpdatedPackages(installedPackages, repository);
updatedPackages = new UpdatedPackages(installedPackages, repository, selectedProjects.GetConstraintProvider(repository));
} catch (Exception ex) {
errorMessage = ex.Message;
}

41
src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesTests.cs

@ -20,7 +20,9 @@ using System; @@ -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 @@ -37,6 +39,7 @@ namespace PackageManagement.Tests
List<IPackage> sourceRepositoryPackages;
List<IPackage> packagesUsedWhenCheckingForUpdates;
bool includePreleaseUsedWhenCheckingForUpdates;
FakePackageManagementProject project;
[SetUp]
public void Init()
@ -66,7 +69,17 @@ namespace PackageManagement.Tests @@ -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 @@ -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<IPackage> packages = updatedPackages.GetUpdatedPackages();
PackageCollectionAssert.AreEqual(expectedPackages, packages);
}
}
}

27
src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackagesViewModelTests.cs

@ -787,5 +787,32 @@ namespace PackageManagement.Tests @@ -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);
}
}
}

Loading…
Cancel
Save