From 5d65596d2cdfcbc508b912f0143f6f50f6f2475e Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 23 Aug 2015 18:25:06 +0100 Subject: [PATCH] Show package not found error message for Update-Package -reinstall Fixed null reference exception when package not found when reinstalling a package for a single project. Throw an exception when the package id cannot be found when reinstalling a package for a single project or if the package id cannot be found in any project when reinstalling for all projects. --- .../Project/Src/UpdatePackageCmdlet.cs | 25 ++++++++++++++- .../Test/Src/UpdatePackageCmdletTests.cs | 31 +++++++++++++++++++ .../Project/Src/PackageManagementProject.cs | 6 ---- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs index 3d8ad482e1..7f7706fa1b 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs @@ -228,10 +228,26 @@ namespace ICSharpCode.PackageManagement.Cmdlets void ReinstallPackageInSingleProject() { IPackageManagementProject project = GetProject(); - IPackage package = project.FindPackage(Id, null); + IPackage package = FindPackageOrThrow(project); ReinstallPackageInProject(project, package); } + IPackage FindPackageOrThrow(IPackageManagementProject project) + { + IPackage package = project.FindPackage(Id, null); + if (package != null) { + return package; + } + + throw CreatePackageNotFoundException(Id); + } + + static InvalidOperationException CreatePackageNotFoundException(string packageId) + { + string message = String.Format("Unable to find package '{0}'.", packageId); + throw new InvalidOperationException(message); + } + void ReinstallPackageInProject(IPackageManagementProject project, IPackage package) { ReinstallPackageAction action = CreateReinstallPackageAction(project, package); @@ -269,13 +285,20 @@ namespace ICSharpCode.PackageManagement.Cmdlets void ReinstallPackageInAllProjects() { + bool foundPackage = false; + IPackageRepository repository = GetActivePackageRepository(); foreach (IPackageManagementProject project in ConsoleHost.Solution.GetProjects(repository)) { IPackage package = project.FindPackage(Id, null); if (package != null) { + foundPackage = true; ReinstallPackageInProject(project, package); } } + + if (!foundPackage) { + throw CreatePackageNotFoundException(Id); + } } } } diff --git a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs index b4eecbada5..ad04279a42 100644 --- a/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs +++ b/src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs @@ -888,6 +888,20 @@ namespace PackageManagement.Cmdlets.Tests Assert.IsTrue(ReinstallPackageInSingleProjectAction.UpdateDependencies); } + [Test] + public void ProcessRecord_ReinstallPackageIdIntoProjectWhenPackageIdNotFound_ExceptionThrownAboutMissingPackage() + { + CreateCmdletWithActivePackageSourceAndProject(); + SetIdParameter("UnknownPackageId"); + SetProjectNameParameter("MyProject"); + cmdlet.Reinstall = true; + FakePackage testPackage = fakeProject.FakeLocalRepository.AddFakePackageWithVersion("Test", "1.2.3"); + + var ex = Assert.Throws(RunCmdlet); + + Assert.AreEqual("Unable to find package 'UnknownPackageId'.", ex.Message); + } + [Test] public void ProcessRecord_ReinstallWhenPackageIdAndProjectNameSpecifiedAndSourceRepositoryIsOperationAware_ReinstallOperationStartedAndDisposedForPackage() { @@ -1064,5 +1078,22 @@ namespace PackageManagement.Cmdlets.Tests operationAwareRepository1.OperationsStarted.Single().AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Reinstall, "B"); operationAwareRepository2.OperationsStarted.Single().AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Reinstall, "B"); } + + [Test] + public void ProcessRecord_ReinstallPackageInAllProjectsButPackageNotFound_ExceptionThrown() + { + CreateCmdletWithActivePackageSourceAndProject(); + AddPackageSourceToConsoleHost(); + SetSourceParameter("Test"); + SetIdParameter("UnknownPackageId"); + cmdlet.Reinstall = true; + FakePackageManagementProject project1 = fakeSolution.AddFakeProject("Project1"); + FakePackageManagementProject project2 = fakeSolution.AddFakeProject("Project2"); + FakePackageManagementProject project3 = fakeSolution.AddFakeProject("Project3"); + + var ex = Assert.Throws(RunCmdlet); + + Assert.AreEqual("Unable to find package 'UnknownPackageId'.", ex.Message); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs index d27f7cf288..ff5fdfaf7a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs @@ -221,12 +221,6 @@ namespace ICSharpCode.PackageManagement string message = String.Format("Multiple versions of '{0}' found. Please specify the version.", packageId); return new InvalidOperationException(message); } - - InvalidOperationException CreatePackageNotFoundException(string packageId) - { - string message = String.Format("Unable to find package '{0}'.", packageId); - return new InvalidOperationException(message); - } public ReinstallPackageAction CreateReinstallPackageAction() {