Browse Source

Uninstall-Package can now remove solution level NuGet packages.

Previously if a solution level NuGet package, such as Fake, was
installed then running the Uninstall-Package cmdlet would not find
the Fake NuGet package and report an error. Now if the NuGet package
is not found in the project's package repository then the solution's
package repository is checked.
pull/637/merge
Matt Ward 10 years ago
parent
commit
c0ff79e49e
  1. 17
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs
  2. 2
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManager.cs
  3. 2
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProject.cs
  4. 25
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs
  5. 6
      src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs
  6. 4
      src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManager.cs
  7. 5
      src/AddIns/Misc/PackageManagement/Project/Src/UninstallPackageAction.cs
  8. 68
      src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs
  9. 22
      src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs
  10. 26
      src/AddIns/Misc/PackageManagement/Test/Src/UninstallPackageActionTests.cs

17
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs

@ -299,5 +299,22 @@ namespace ICSharpCode.PackageManagement.Design @@ -299,5 +299,22 @@ namespace ICSharpCode.PackageManagement.Design
public IPackageConstraintProvider ConstraintProvider { get; set; }
public FrameworkName TargetFramework { get; set; }
public FakePackageRepository FakeLocalRepository = new FakePackageRepository();
public IPackage FindPackage(string packageId, SemanticVersion version)
{
return FakeLocalRepository.FindPackage(packageId, version);
}
public void AddFakePackageToLocalRepository(string packageId)
{
FakeLocalRepository.AddFakePackage(packageId);
}
public FakePackage AddFakePackageToLocalRepository(string packageId, string version)
{
return FakeLocalRepository.AddFakePackageWithVersion(packageId, version);
}
}
}

2
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManager.cs

@ -60,11 +60,13 @@ namespace ICSharpCode.PackageManagement.Design @@ -60,11 +60,13 @@ namespace ICSharpCode.PackageManagement.Design
public ISharpDevelopProjectManager ProjectManager { get; set; }
public FakePackageRepository FakeSourceRepository = new FakePackageRepository();
public FakePackageRepository FakeLocalRepository = new FakePackageRepository();
public FakePackageManager()
{
ProjectManager = FakeProjectManager;
SourceRepository = FakeSourceRepository;
LocalRepository = FakeLocalRepository;
}
public bool ForceRemovePassedToUninstallPackage;

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

@ -65,5 +65,7 @@ namespace ICSharpCode.PackageManagement @@ -65,5 +65,7 @@ namespace ICSharpCode.PackageManagement
UpdatePackagesAction CreateUpdatePackagesAction();
void RunPackageOperations(IEnumerable<PackageOperation> expectedOperations);
IPackage FindPackage(string packageId, SemanticVersion version);
}
}

25
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs

@ -195,5 +195,30 @@ namespace ICSharpCode.PackageManagement @@ -195,5 +195,30 @@ namespace ICSharpCode.PackageManagement
return NullConstraintProvider.Instance;
}
}
public IPackage FindPackage(string packageId, SemanticVersion version)
{
IPackage package = projectManager.LocalRepository.FindPackage(packageId, version);
if (package != null) {
return package;
}
if (version != null) {
return packageManager.LocalRepository.FindPackage(packageId, version);
}
List<IPackage> packages = packageManager.LocalRepository.FindPackagesById(packageId).ToList();
if (packages.Count > 1) {
throw CreateAmbiguousPackageException(packageId);
}
return packages.FirstOrDefault();
}
InvalidOperationException CreateAmbiguousPackageException(string packageId)
{
string message = String.Format("Multiple versions of '{0}' found. Please specify the version.", packageId);
return new InvalidOperationException(message);
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs

@ -125,16 +125,16 @@ namespace ICSharpCode.PackageManagement @@ -125,16 +125,16 @@ namespace ICSharpCode.PackageManagement
void GetPackageIfMissing()
{
if (Package == null) {
FindPackage();
Package = FindPackage();
}
if (Package == null) {
ThrowPackageNotFoundError(PackageId);
}
}
void FindPackage()
protected virtual IPackage FindPackage()
{
Package = Project.SourceRepository.FindPackage(
return Project.SourceRepository.FindPackage(
PackageId,
PackageVersion,
Project.ConstraintProvider,

4
src/AddIns/Misc/PackageManagement/Project/Src/SharpDevelopPackageManager.cs

@ -108,10 +108,14 @@ namespace ICSharpCode.PackageManagement @@ -108,10 +108,14 @@ namespace ICSharpCode.PackageManagement
public override void UninstallPackage(IPackage package, bool forceRemove, bool removeDependencies)
{
if (package.IsProjectPackage()) {
ProjectManager.RemovePackageReference(package.Id, forceRemove, removeDependencies);
if (!IsPackageReferencedByOtherProjects(package)) {
base.UninstallPackage(package, forceRemove, removeDependencies);
}
} else {
base.UninstallPackage(package, forceRemove, removeDependencies);
}
}
public void UninstallPackageFromSolutionRepository(IPackage package)

5
src/AddIns/Misc/PackageManagement/Project/Src/UninstallPackageAction.cs

@ -52,5 +52,10 @@ namespace ICSharpCode.PackageManagement @@ -52,5 +52,10 @@ namespace ICSharpCode.PackageManagement
var files = new PackageFiles(Package);
return files.HasUninstallPackageScript();
}
protected override IPackage FindPackage()
{
return Project.FindPackage(PackageId, PackageVersion);
}
}
}

68
src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementProjectTests.cs

@ -805,5 +805,73 @@ namespace PackageManagement.Tests @@ -805,5 +805,73 @@ namespace PackageManagement.Tests
Assert.AreEqual(expectedName, targetFramework);
}
[Test]
public void FindPackage_PackageExistsInProjectLocalRepository_PackageReturned()
{
CreateProject();
FakePackage package = fakeProjectManager.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.0");
IPackage packageFound = project.FindPackage("Test", new SemanticVersion("1.0"));
Assert.AreEqual(package, packageFound);
}
[Test]
public void FindPackage_PackageWithDifferentVersionExistsInProjectLocalRepository_PackageNotFound()
{
CreateProject();
fakeProjectManager.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.0");
IPackage packageFound = project.FindPackage("Test", new SemanticVersion("2.1"));
Assert.IsNull(packageFound);
}
[Test]
public void FindPackage_PackageWithSameVersionExistsInSolutionPackageRepository_PackageReturned()
{
CreateProject();
FakePackage package = fakePackageManager.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.0");
IPackage packageFound = project.FindPackage("Test", new SemanticVersion("1.0"));
Assert.AreEqual(package, packageFound);
}
[Test]
public void FindPackage_PackageWithDifferentVersionExistsInSolutionPackageRepository_PackageNotFound()
{
CreateProject();
fakePackageManager.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.0");
IPackage packageFound = project.FindPackage("Test", new SemanticVersion("2.1"));
Assert.IsNull(packageFound);
}
[Test]
public void FindPackage_PackageWithoutVersionWhichExistsInSolutionPackageRepository_PackageReturned()
{
CreateProject();
FakePackage package = fakePackageManager.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.0");
IPackage packageFound = project.FindPackage("Test", null);
Assert.AreEqual(package, packageFound);
}
[Test]
public void FindPackage_PackageWithoutVersionWhenPackageExistsWithMultipleVersionsInSolutionPackageRepository_InvalidOperationExceptionThrown()
{
CreateProject();
fakePackageManager.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.0");
fakePackageManager.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.1");
InvalidOperationException ex =
Assert.Throws<InvalidOperationException>(() => project.FindPackage("Test", null));
Assert.AreEqual("Multiple versions of 'Test' found. Please specify the version.", ex.Message);
}
}
}

22
src/AddIns/Misc/PackageManagement/Test/Src/SharpDevelopPackageManagerTests.cs

@ -98,7 +98,9 @@ namespace PackageManagement.Tests @@ -98,7 +98,9 @@ namespace PackageManagement.Tests
FakePackage CreateFakePackage(string id = "Test", string version = "1.0.0.0")
{
return new FakePackage(id, version);
var package = new FakePackage(id, version);
package.FrameworkAssembliesList.Add(new FrameworkAssemblyReference("System.Xml"));
return package;
}
FakePackage InstallPackage()
@ -632,7 +634,7 @@ namespace PackageManagement.Tests @@ -632,7 +634,7 @@ namespace PackageManagement.Tests
CreatePackageManager();
CreateTestableProjectManager();
var package = new FakePackage("MyPackageId", "1.4.5.2");
FakePackage package = CreateFakePackage("MyPackageId", "1.4.5.2");
testableProjectManager.FakeLocalRepository.FakePackages.Add(package);
fakeSolutionSharedRepository.FakePackages.Add(package);
@ -1116,5 +1118,21 @@ namespace PackageManagement.Tests @@ -1116,5 +1118,21 @@ namespace PackageManagement.Tests
Assert.IsTrue(fakeSolutionSharedRepository.FakePackages.Contains(installedPackage));
}
[Test]
public void UninstallPackage_SolutionLevelPackage_PackageIsRemovedFromSharedSolutionRepositoryAndProjectManagerNotUsed()
{
CreatePackageManager();
CreateTestableProjectManager();
var package = new FakePackage("MyPackage", "1.0");
fakeSolutionSharedRepository.FakePackages.Add(package);
packageManager.UninstallPackage(package);
bool containsPackage = fakeSolutionSharedRepository.FakePackages.Contains(package);
Assert.IsFalse(containsPackage);
Assert.IsNull(testableProjectManager.PackagePassedToRemovePackageReference);
}
}
}

26
src/AddIns/Misc/PackageManagement/Test/Src/UninstallPackageActionTests.cs

@ -42,14 +42,14 @@ namespace PackageManagement.Tests @@ -42,14 +42,14 @@ namespace PackageManagement.Tests
uninstallPackageHelper = new UninstallPackageHelper(action);
}
FakePackage AddOnePackageToProjectSourceRepository(string packageId)
FakePackage AddOnePackageToProjectLocalRepository(string packageId)
{
return fakeProject.FakeSourceRepository.AddFakePackage(packageId);
return fakeProject.FakeLocalRepository.AddFakePackage(packageId);
}
FakePackage AddOnePackageToProjectSourceRepository(string packageId, string version)
FakePackage AddOnePackageToProjectLocalRepository(string packageId, string version)
{
return fakeProject.FakeSourceRepository.AddFakePackageWithVersion(packageId, version);
return fakeProject.FakeLocalRepository.AddFakePackageWithVersion(packageId, version);
}
void AddFileToPackageBeingUninstalled(string fileName)
@ -90,7 +90,7 @@ namespace PackageManagement.Tests @@ -90,7 +90,7 @@ namespace PackageManagement.Tests
public void Execute_PackageObjectPassedAndForceRemoveIsFalse_PackageIsNotForcefullyRemoved()
{
CreateAction();
fakeProject.AddFakePackageToSourceRepository("PackageId");
fakeProject.AddFakePackageToLocalRepository("PackageId");
uninstallPackageHelper.ForceRemove = false;
uninstallPackageHelper.UninstallPackageById("PackageId");
@ -103,7 +103,7 @@ namespace PackageManagement.Tests @@ -103,7 +103,7 @@ namespace PackageManagement.Tests
public void Execute_PackageObjectPassedAndForceRemoveIsTrue_PackageIsForcefullyRemoved()
{
CreateAction();
fakeProject.AddFakePackageToSourceRepository("PackageId");
fakeProject.AddFakePackageToLocalRepository("PackageId");
uninstallPackageHelper.ForceRemove = true;
uninstallPackageHelper.UninstallPackageById("PackageId");
@ -116,7 +116,7 @@ namespace PackageManagement.Tests @@ -116,7 +116,7 @@ namespace PackageManagement.Tests
public void Execute_PackageObjectPassedAndRemoveDependenciesIsFalse_PackageDependenciesAreNotRemoved()
{
CreateAction();
fakeProject.AddFakePackageToSourceRepository("PackageId");
fakeProject.AddFakePackageToLocalRepository("PackageId");
uninstallPackageHelper.RemoveDependencies = false;
uninstallPackageHelper.UninstallPackageById("PackageId");
@ -129,7 +129,7 @@ namespace PackageManagement.Tests @@ -129,7 +129,7 @@ namespace PackageManagement.Tests
public void Execute_PackageObjectPassedAndRemoveDependenciesIsTrue_PackageDependenciesAreRemoved()
{
CreateAction();
fakeProject.AddFakePackageToSourceRepository("PackageId");
fakeProject.AddFakePackageToLocalRepository("PackageId");
uninstallPackageHelper.RemoveDependencies = true;
uninstallPackageHelper.UninstallPackageById("PackageId");
@ -142,7 +142,7 @@ namespace PackageManagement.Tests @@ -142,7 +142,7 @@ namespace PackageManagement.Tests
public void Execute_PackageIdSpecifiedAndForceRemoveIsTrue_PackageIsForcefullyRemoved()
{
CreateAction();
fakeProject.AddFakePackageToSourceRepository("PackageId");
fakeProject.AddFakePackageToLocalRepository("PackageId");
uninstallPackageHelper.ForceRemove = true;
uninstallPackageHelper.UninstallPackageById("PackageId");
@ -155,7 +155,7 @@ namespace PackageManagement.Tests @@ -155,7 +155,7 @@ namespace PackageManagement.Tests
public void Execute_PackageIdSpecifiedAndRemoveDependenciesIsTrue_PackageDependenciesAreRemoved()
{
CreateAction();
fakeProject.AddFakePackageToSourceRepository("PackageId");
fakeProject.AddFakePackageToLocalRepository("PackageId");
uninstallPackageHelper.RemoveDependencies = true;
uninstallPackageHelper.UninstallPackageById("PackageId");
@ -169,9 +169,9 @@ namespace PackageManagement.Tests @@ -169,9 +169,9 @@ namespace PackageManagement.Tests
{
CreateAction();
FakePackage recentPackage = AddOnePackageToProjectSourceRepository("PackageId", "1.2.0.0");
FakePackage oldPackage = AddOnePackageToProjectSourceRepository("PackageId", "1.0.0.0");
FakePackage package = AddOnePackageToProjectSourceRepository("PackageId", "1.1.0");
FakePackage recentPackage = AddOnePackageToProjectLocalRepository("PackageId", "1.2.0.0");
FakePackage oldPackage = AddOnePackageToProjectLocalRepository("PackageId", "1.0.0.0");
FakePackage package = AddOnePackageToProjectLocalRepository("PackageId", "1.1.0");
uninstallPackageHelper.Version = package.Version;
uninstallPackageHelper.UninstallPackageById("PackageId");

Loading…
Cancel
Save