Browse Source

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.
pull/701/head
Matt Ward 10 years ago
parent
commit
5d65596d2c
  1. 25
      src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs
  2. 31
      src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs
  3. 6
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProject.cs

25
src/AddIns/Misc/PackageManagement/Cmdlets/Project/Src/UpdatePackageCmdlet.cs

@ -228,10 +228,26 @@ namespace ICSharpCode.PackageManagement.Cmdlets
void ReinstallPackageInSingleProject() void ReinstallPackageInSingleProject()
{ {
IPackageManagementProject project = GetProject(); IPackageManagementProject project = GetProject();
IPackage package = project.FindPackage(Id, null); IPackage package = FindPackageOrThrow(project);
ReinstallPackageInProject(project, package); 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) void ReinstallPackageInProject(IPackageManagementProject project, IPackage package)
{ {
ReinstallPackageAction action = CreateReinstallPackageAction(project, package); ReinstallPackageAction action = CreateReinstallPackageAction(project, package);
@ -269,13 +285,20 @@ namespace ICSharpCode.PackageManagement.Cmdlets
void ReinstallPackageInAllProjects() void ReinstallPackageInAllProjects()
{ {
bool foundPackage = false;
IPackageRepository repository = GetActivePackageRepository(); IPackageRepository repository = GetActivePackageRepository();
foreach (IPackageManagementProject project in ConsoleHost.Solution.GetProjects(repository)) { foreach (IPackageManagementProject project in ConsoleHost.Solution.GetProjects(repository)) {
IPackage package = project.FindPackage(Id, null); IPackage package = project.FindPackage(Id, null);
if (package != null) { if (package != null) {
foundPackage = true;
ReinstallPackageInProject(project, package); ReinstallPackageInProject(project, package);
} }
} }
if (!foundPackage) {
throw CreatePackageNotFoundException(Id);
}
} }
} }
} }

31
src/AddIns/Misc/PackageManagement/Cmdlets/Test/Src/UpdatePackageCmdletTests.cs

@ -888,6 +888,20 @@ namespace PackageManagement.Cmdlets.Tests
Assert.IsTrue(ReinstallPackageInSingleProjectAction.UpdateDependencies); 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<InvalidOperationException>(RunCmdlet);
Assert.AreEqual("Unable to find package 'UnknownPackageId'.", ex.Message);
}
[Test] [Test]
public void ProcessRecord_ReinstallWhenPackageIdAndProjectNameSpecifiedAndSourceRepositoryIsOperationAware_ReinstallOperationStartedAndDisposedForPackage() public void ProcessRecord_ReinstallWhenPackageIdAndProjectNameSpecifiedAndSourceRepositoryIsOperationAware_ReinstallOperationStartedAndDisposedForPackage()
{ {
@ -1064,5 +1078,22 @@ namespace PackageManagement.Cmdlets.Tests
operationAwareRepository1.OperationsStarted.Single().AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Reinstall, "B"); operationAwareRepository1.OperationsStarted.Single().AssertOperationWasStartedAndDisposed(RepositoryOperationNames.Reinstall, "B");
operationAwareRepository2.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<InvalidOperationException>(RunCmdlet);
Assert.AreEqual("Unable to find package 'UnknownPackageId'.", ex.Message);
}
} }
} }

6
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); string message = String.Format("Multiple versions of '{0}' found. Please specify the version.", packageId);
return new InvalidOperationException(message); 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() public ReinstallPackageAction CreateReinstallPackageAction()
{ {

Loading…
Cancel
Save