diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs
index 489755c5c6..973b15ab92 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs
@@ -39,6 +39,8 @@ namespace ICSharpCode.PackageManagement.Design
FakeUninstallPackageAction = new FakeUninstallPackageAction(this);
this.Name = name;
+
+ ConstraintProvider = NullConstraintProvider.Instance;
}
private FakeInstallPackageAction FakeInstallPackageAction;
@@ -232,6 +234,11 @@ namespace ICSharpCode.PackageManagement.Design
FakeSourceRepository.AddFakePackage(packageId);
}
+ public FakePackage AddFakePackageToSourceRepository(string packageId, string version)
+ {
+ return FakeSourceRepository.AddFakePackageWithVersion(packageId, version);
+ }
+
public void UpdatePackages(UpdatePackagesAction action)
{
}
@@ -274,5 +281,7 @@ namespace ICSharpCode.PackageManagement.Design
{
throw new NotImplementedException();
}
+
+ public IPackageConstraintProvider ConstraintProvider { get; set; }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs
index d84c17d928..629e24c367 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs
@@ -38,6 +38,8 @@ namespace ICSharpCode.PackageManagement
Project ConvertToDTEProject();
+ IPackageConstraintProvider ConstraintProvider { get; }
+
bool IsPackageInstalled(IPackage package);
bool IsPackageInstalled(string packageId);
bool HasOlderPackageInstalled(IPackage package);
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs
index 3d17b9a309..2b206d57bd 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs
@@ -178,5 +178,15 @@ namespace ICSharpCode.PackageManagement
{
packageManager.UpdatePackageReference(package, settings);
}
+
+ public IPackageConstraintProvider ConstraintProvider {
+ get {
+ var constraintProvider = projectManager.LocalRepository as IPackageConstraintProvider;
+ if (constraintProvider != null) {
+ return constraintProvider;
+ }
+ return NullConstraintProvider.Instance;
+ }
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
index 740b745ee1..07add3da31 100644
--- a/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
+++ b/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
@@ -134,9 +134,12 @@ namespace ICSharpCode.PackageManagement
void FindPackage()
{
- Package = Project
- .SourceRepository
- .FindPackage(PackageId, PackageVersion, AllowPrereleaseVersions, allowUnlisted: false);
+ Package = Project.SourceRepository.FindPackage(
+ PackageId,
+ PackageVersion,
+ Project.ConstraintProvider,
+ AllowPrereleaseVersions,
+ allowUnlisted: false);
}
void ThrowPackageNotFoundError(string packageId)
diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
index 0a2c80e407..580664fc67 100644
--- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
+++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
@@ -111,6 +111,7 @@
+
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryWithConstraintProvider.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryWithConstraintProvider.cs
new file mode 100644
index 0000000000..f83fd2881e
--- /dev/null
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryWithConstraintProvider.cs
@@ -0,0 +1,39 @@
+// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using ICSharpCode.PackageManagement.Design;
+using NuGet;
+
+namespace PackageManagement.Tests.Helpers
+{
+ public class FakePackageRepositoryWithConstraintProvider : FakePackageRepository, IPackageConstraintProvider
+ {
+ DefaultConstraintProvider constraintProvider = new DefaultConstraintProvider();
+
+ public IVersionSpec GetConstraint(string packageId)
+ {
+ return constraintProvider.GetConstraint(packageId);
+ }
+
+ public void AddConstraint(string packageId, IVersionSpec versionSpec)
+ {
+ constraintProvider.AddConstraint (packageId, versionSpec);
+ }
+ }
+}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs
index c721492fd3..3c1c06b677 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs
@@ -759,5 +759,27 @@ namespace PackageManagement.Tests
Assert.AreEqual(package, fakePackageManager.PackagePassedToUpdatePackageReference);
Assert.AreEqual(updatePackagesAction, fakePackageManager.SettingsPassedToUpdatePackageReference);
}
+
+ [Test]
+ public void ConstraintProvider_LocalRepositoryDoesNotImplementIConstraintProvider_ReturnsNullConstraintProviderInstance ()
+ {
+ CreateProject ();
+
+ IPackageConstraintProvider provider = project.ConstraintProvider;
+
+ Assert.AreEqual (NullConstraintProvider.Instance, provider);
+ }
+
+ [Test]
+ public void ConstraintProvider_LocalRepositoryImplementsIConstraintProvider_ReturnsLocalRepository ()
+ {
+ CreateProject ();
+ var localRepository = new FakePackageRepositoryWithConstraintProvider ();
+ fakeProjectManager.FakeLocalRepository = localRepository;
+
+ IPackageConstraintProvider provider = project.ConstraintProvider;
+
+ Assert.AreEqual (localRepository, provider);
+ }
}
}
diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs
index 2258dd1699..a4c5f15634 100644
--- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs
+++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs
@@ -355,5 +355,28 @@ namespace PackageManagement.Tests
Assert.AreEqual(expectedPackage, actualPackage);
}
+
+ [Test]
+ public void Execute_PackageHasConstraint_LatestPackageIsNotUpdatedButPackageWithHighestVersionThatMatchesConstraint ()
+ {
+ CreateSolution ();
+ var constraintProvider = new DefaultConstraintProvider ();
+ var versionSpec = new VersionSpec ();
+ versionSpec.MinVersion = new SemanticVersion ("1.0");
+ versionSpec.IsMinInclusive = true;
+ versionSpec.IsMaxInclusive = true;
+ versionSpec.MaxVersion = new SemanticVersion ("2.0");
+ constraintProvider.AddConstraint ("MyPackage", versionSpec);
+ fakeProject.ConstraintProvider = constraintProvider;
+ fakeProject.AddFakePackageToSourceRepository ("MyPackage", "1.0");
+ FakePackage packageVersion2 = fakeProject.AddFakePackageToSourceRepository ("MyPackage", "2.0");
+ fakeProject.AddFakePackageToSourceRepository ("MyPackage", "3.0");
+ fakeProject.FakePackages.Add (new FakePackage ("MyPackage", "1.0"));
+ action.PackageId = "MyPackage";
+
+ action.Execute ();
+
+ Assert.AreEqual (packageVersion2, fakeProject.PackagePassedToUpdatePackage);
+ }
}
}