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
if (project != null) { if (project != null) {
return new UpdatedPackages(project, repository); return new UpdatedPackages(project, repository);
} }
return new UpdatedPackages(GetPackagesInstalledIntoAnyProject(), repository); return new UpdatedPackages(GetPackagesInstalledIntoAnyProject(), repository, NullConstraintProvider.Instance);
} }
IQueryable<IPackage> GetPackagesInstalledIntoAnyProject() IQueryable<IPackage> GetPackagesInstalledIntoAnyProject()

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

@ -157,5 +157,13 @@ namespace ICSharpCode.PackageManagement
} }
return null; 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
{ {
IPackageRepository sourceRepository; IPackageRepository sourceRepository;
IQueryable<IPackage> installedPackages; IQueryable<IPackage> installedPackages;
IPackageConstraintProvider constraintProvider;
public UpdatedPackages( public UpdatedPackages(
IPackageManagementProject project, IPackageManagementProject project,
IPackageRepository aggregateRepository) IPackageRepository aggregateRepository)
: this( : this(
project.GetPackages(), project.GetPackages(),
aggregateRepository) aggregateRepository,
project.ConstraintProvider)
{ {
} }
public UpdatedPackages( public UpdatedPackages(
IQueryable<IPackage> installedPackages, IQueryable<IPackage> installedPackages,
IPackageRepository aggregrateRepository) IPackageRepository aggregrateRepository,
IPackageConstraintProvider constraintProvider)
{ {
this.installedPackages = installedPackages; this.installedPackages = installedPackages;
this.sourceRepository = aggregrateRepository; this.sourceRepository = aggregrateRepository;
this.constraintProvider = constraintProvider;
} }
public string SearchTerms { get; set; } public string SearchTerms { get; set; }
@ -54,7 +58,7 @@ namespace ICSharpCode.PackageManagement
IQueryable<IPackage> localPackages = installedPackages; IQueryable<IPackage> localPackages = installedPackages;
localPackages = FilterPackages(localPackages); localPackages = FilterPackages(localPackages);
IEnumerable<IPackage> distinctLocalPackages = DistinctPackages(localPackages); IEnumerable<IPackage> distinctLocalPackages = DistinctPackages(localPackages);
return GetUpdatedPackages(sourceRepository, distinctLocalPackages, includePrerelease); return GetUpdatedPackages(distinctLocalPackages, includePrerelease);
} }
IQueryable<IPackage> GetInstalledPackages() IQueryable<IPackage> GetInstalledPackages()
@ -81,11 +85,18 @@ namespace ICSharpCode.PackageManagement
} }
IEnumerable<IPackage> GetUpdatedPackages( IEnumerable<IPackage> GetUpdatedPackages(
IPackageRepository sourceRepository,
IEnumerable<IPackage> localPackages, IEnumerable<IPackage> localPackages,
bool includePrelease) 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
try { try {
IPackageRepository repository = RegisteredPackageRepositories.ActiveRepository; IPackageRepository repository = RegisteredPackageRepositories.ActiveRepository;
IQueryable<IPackage> installedPackages = GetInstalledPackages(repository); IQueryable<IPackage> installedPackages = GetInstalledPackages(repository);
updatedPackages = new UpdatedPackages(installedPackages, repository); updatedPackages = new UpdatedPackages(installedPackages, repository, selectedProjects.GetConstraintProvider(repository));
} catch (Exception ex) { } catch (Exception ex) {
errorMessage = ex.Message; errorMessage = ex.Message;
} }

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

@ -20,7 +20,9 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.Versioning; using System.Runtime.Versioning;
using ICSharpCode.PackageManagement; using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design;
using NuGet; using NuGet;
using NUnit.Framework; using NUnit.Framework;
using PackageManagement.Tests.Helpers; using PackageManagement.Tests.Helpers;
@ -37,6 +39,7 @@ namespace PackageManagement.Tests
List<IPackage> sourceRepositoryPackages; List<IPackage> sourceRepositoryPackages;
List<IPackage> packagesUsedWhenCheckingForUpdates; List<IPackage> packagesUsedWhenCheckingForUpdates;
bool includePreleaseUsedWhenCheckingForUpdates; bool includePreleaseUsedWhenCheckingForUpdates;
FakePackageManagementProject project;
[SetUp] [SetUp]
public void Init() public void Init()
@ -66,7 +69,17 @@ namespace PackageManagement.Tests
}) })
.Return(sourceRepositoryPackages.AsQueryable()); .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) IPackage AddPackageToSourceRepository(string id, string version)
@ -166,5 +179,31 @@ namespace PackageManagement.Tests
Assert.IsFalse(includePreleaseUsedWhenCheckingForUpdates); 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
operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Update, null); 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