Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 2baac1b

Browse files
committed
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.
1 parent 5a8f57f commit 2baac1b

6 files changed

Lines changed: 93 additions & 8 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ UpdatedPackages CreateUpdatedPackages(IPackageRepository repository)
200200
if (project != null) {
201201
return new UpdatedPackages(project, repository);
202202
}
203-
return new UpdatedPackages(GetPackagesInstalledIntoAnyProject(), repository);
203+
return new UpdatedPackages(GetPackagesInstalledIntoAnyProject(), repository, NullConstraintProvider.Instance);
204204
}
205205

206206
IQueryable<IPackage> GetPackagesInstalledIntoAnyProject()

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,5 +157,13 @@ public IPackageManagementProject GetSingleProjectSelected(IPackageRepository rep
157157
}
158158
return null;
159159
}
160+
161+
public IPackageConstraintProvider GetConstraintProvider(IPackageRepository repository)
162+
{
163+
if (HasSingleProjectSelected()) {
164+
return GetSingleProjectSelected(repository).ConstraintProvider;
165+
}
166+
return NullConstraintProvider.Instance;
167+
}
160168
}
161169
}

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

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,26 @@ public class UpdatedPackages
2929
{
3030
IPackageRepository sourceRepository;
3131
IQueryable<IPackage> installedPackages;
32+
IPackageConstraintProvider constraintProvider;
3233

3334
public UpdatedPackages(
3435
IPackageManagementProject project,
3536
IPackageRepository aggregateRepository)
3637
: this(
3738
project.GetPackages(),
38-
aggregateRepository)
39+
aggregateRepository,
40+
project.ConstraintProvider)
3941
{
4042
}
4143

4244
public UpdatedPackages(
4345
IQueryable<IPackage> installedPackages,
44-
IPackageRepository aggregrateRepository)
46+
IPackageRepository aggregrateRepository,
47+
IPackageConstraintProvider constraintProvider)
4548
{
4649
this.installedPackages = installedPackages;
4750
this.sourceRepository = aggregrateRepository;
51+
this.constraintProvider = constraintProvider;
4852
}
4953

5054
public string SearchTerms { get; set; }
@@ -54,7 +58,7 @@ public IEnumerable<IPackage> GetUpdatedPackages(bool includePrerelease = false)
5458
IQueryable<IPackage> localPackages = installedPackages;
5559
localPackages = FilterPackages(localPackages);
5660
IEnumerable<IPackage> distinctLocalPackages = DistinctPackages(localPackages);
57-
return GetUpdatedPackages(sourceRepository, distinctLocalPackages, includePrerelease);
61+
return GetUpdatedPackages(distinctLocalPackages, includePrerelease);
5862
}
5963

6064
IQueryable<IPackage> GetInstalledPackages()
@@ -81,11 +85,18 @@ IEnumerable<IPackage> DistinctPackages(IQueryable<IPackage> localPackages)
8185
}
8286

8387
IEnumerable<IPackage> GetUpdatedPackages(
84-
IPackageRepository sourceRepository,
8588
IEnumerable<IPackage> localPackages,
8689
bool includePrelease)
8790
{
88-
return sourceRepository.GetUpdates(localPackages, includePrelease, false);
91+
IEnumerable<IVersionSpec> constraints = localPackages
92+
.Select(package => constraintProvider.GetConstraint(package.Id));
93+
94+
return sourceRepository.GetUpdates(
95+
localPackages,
96+
includePrelease,
97+
false,
98+
null,
99+
constraints);
89100
}
90101
}
91102
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ protected override void UpdateRepositoryBeforeReadPackagesTaskStarts()
7878
try {
7979
IPackageRepository repository = RegisteredPackageRepositories.ActiveRepository;
8080
IQueryable<IPackage> installedPackages = GetInstalledPackages(repository);
81-
updatedPackages = new UpdatedPackages(installedPackages, repository);
81+
updatedPackages = new UpdatedPackages(installedPackages, repository, selectedProjects.GetConstraintProvider(repository));
8282
} catch (Exception ex) {
8383
errorMessage = ex.Message;
8484
}

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

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
using System.Collections.Generic;
2121
using System.Linq;
2222
using System.Runtime.Versioning;
23+
2324
using ICSharpCode.PackageManagement;
25+
using ICSharpCode.PackageManagement.Design;
2426
using NuGet;
2527
using NUnit.Framework;
2628
using PackageManagement.Tests.Helpers;
@@ -37,6 +39,7 @@ public class UpdatedPackagesTests
3739
List<IPackage> sourceRepositoryPackages;
3840
List<IPackage> packagesUsedWhenCheckingForUpdates;
3941
bool includePreleaseUsedWhenCheckingForUpdates;
42+
FakePackageManagementProject project;
4043

4144
[SetUp]
4245
public void Init()
@@ -66,7 +69,17 @@ void CreateUpdatedPackages()
6669
})
6770
.Return(sourceRepositoryPackages.AsQueryable());
6871

69-
updatedPackages = new UpdatedPackages(installedPackages.AsQueryable(), sourceRepository);
72+
updatedPackages = new UpdatedPackages(installedPackages.AsQueryable(), sourceRepository, NullConstraintProvider.Instance);
73+
}
74+
75+
void CreateProject()
76+
{
77+
project = new FakePackageManagementProject();
78+
}
79+
80+
void CreateUpdatedPackages(IPackageRepository repository)
81+
{
82+
updatedPackages = new UpdatedPackages(project, repository);
7083
}
7184

7285
IPackage AddPackageToSourceRepository(string id, string version)
@@ -166,5 +179,31 @@ public void GetUpdatedPackages_AllowPrereleaseIsFalse_PrereleasePackagesNotAllow
166179

167180
Assert.IsFalse(includePreleaseUsedWhenCheckingForUpdates);
168181
}
182+
183+
[Test]
184+
public void GetUpdatedPackages_OnePackageReferencedWithConstraintAndUpdatesAvailable_LatestVersionReturnedBasedOnConstraint()
185+
{
186+
CreateProject();
187+
project.FakePackages.Add(new FakePackage("Test", "1.0"));
188+
var sourceRepository = new FakePackageRepository();
189+
FakePackage packageVersion2 = sourceRepository.AddFakePackageWithVersion("Test", "2.0");
190+
FakePackage [] expectedPackages = new [] {
191+
packageVersion2
192+
};
193+
sourceRepository.AddFakePackageWithVersion("Test", "3.0");
194+
var versionSpec = new VersionSpec();
195+
versionSpec.MinVersion = new SemanticVersion("1.0");
196+
versionSpec.IsMinInclusive = true;
197+
versionSpec.MaxVersion = new SemanticVersion("2.0");
198+
versionSpec.IsMaxInclusive = true;
199+
var constraintProvider = new DefaultConstraintProvider();
200+
constraintProvider.AddConstraint("Test", versionSpec);
201+
project.ConstraintProvider = constraintProvider;
202+
CreateUpdatedPackages(sourceRepository);
203+
204+
IEnumerable<IPackage> packages = updatedPackages.GetUpdatedPackages();
205+
206+
PackageCollectionAssert.AreEqual(expectedPackages, packages);
207+
}
169208
}
170209
}

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,5 +787,32 @@ public void UpdateAllPackagesCommand_SourceRepositoryIsOperationAware_UpdateOper
787787

788788
operationAwareRepository.AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Update, null);
789789
}
790+
791+
[Test]
792+
public void ReadPackages_TwoPackagesInSourceRepositoryAndTwoNewerPackageVersionAvailableAndProjectHasConstraint_NewerPackageVersionThatMeetsConstraintIsDisplayed()
793+
{
794+
CreateViewModel();
795+
var versionSpec = new VersionSpec();
796+
versionSpec.MinVersion = new SemanticVersion("1.0");
797+
versionSpec.IsMinInclusive = true;
798+
versionSpec.MaxVersion = new SemanticVersion("2.0");
799+
versionSpec.IsMaxInclusive = true;
800+
var constraintProvider = new DefaultConstraintProvider();
801+
constraintProvider.AddConstraint("Test", versionSpec);
802+
solution.FakeProjectToReturnFromGetProject.ConstraintProvider = constraintProvider;
803+
AddPackageToLocalRepository("Test", "1.0.0.0");
804+
AddPackageToActiveRepository("Test", "1.0.0.0");
805+
FakePackage expectedPackage = AddPackageToActiveRepository("Test", "2.0.0.0");
806+
AddPackageToActiveRepository("Test", "3.0.0.0");
807+
808+
viewModel.ReadPackages();
809+
CompleteReadPackagesTask();
810+
811+
var expectedPackages = new FakePackage[] {
812+
expectedPackage
813+
};
814+
815+
PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels);
816+
}
790817
}
791818
}

0 commit comments

Comments
 (0)