Browse Source

Handle any exceptions when NuGet package added to project.

Logic to check if the NuGet package is for the solution or for the
project was not handling any exceptions that could be generated.
For example if installing a NuGet package that supports the
dnx framework, which is not currently supported in NuGet 2.8.3,
the exception would not be caught because the try catch was at
a lower level and not at the top level.

Exceptions are now caught when checking the package to see if it is a
solution level package when adding, removing or managing a NuGet
package.
pull/690/head
Matt Ward 11 years ago
parent
commit
b1f70d154a
  1. 116
      src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs
  2. 4
      src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs
  3. 12
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackageViewModel.cs
  4. 71
      src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs

116
src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs

@ -219,6 +219,7 @@ namespace ICSharpCode.PackageManagement @@ -219,6 +219,7 @@ namespace ICSharpCode.PackageManagement
public void AddOrManagePackage()
{
try {
if (!selectedProjects.HasSingleProjectSelected()) {
if (IsProjectPackage(package)) {
ManagePackage();
@ -228,6 +229,10 @@ namespace ICSharpCode.PackageManagement @@ -228,6 +229,10 @@ namespace ICSharpCode.PackageManagement
} else {
AddPackage();
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
public void AddPackage()
@ -236,14 +241,27 @@ namespace ICSharpCode.PackageManagement @@ -236,14 +241,27 @@ namespace ICSharpCode.PackageManagement
logger.LogAddingPackage();
using (IDisposable operation = StartInstallOperation(package)) {
TryAddingPackage();
}
logger.LogAfterPackageOperationCompletes();
}
void TryAddingPackage()
{
try {
if (IsProjectPackage(package)) {
TryInstallingPackageIntoProject();
GetInstallOperationsForProject();
if (LicensesAccepted()) {
InstallPackageIntoProject();
}
} else {
TryInstallingPackageIntoSolution();
InstallPackageIntoSolution();
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
logger.LogAfterPackageOperationCompletes();
}
protected virtual IDisposable StartInstallOperation(IPackageFromRepository package)
@ -315,10 +333,9 @@ namespace ICSharpCode.PackageManagement @@ -315,10 +333,9 @@ namespace ICSharpCode.PackageManagement
return selectedProjects.Solution.IsPackageInstalled(packageToCheck);
}
protected virtual void TryInstallingPackageIntoSolution()
protected virtual void InstallPackageIntoSolution()
{
try {
var solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
ISolutionPackageRepository solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
var installAction = new InstallPackageAction(null, packageManagementEvents);
installAction.Package = package;
installAction.IgnoreDependencies = false;
@ -330,11 +347,6 @@ namespace ICSharpCode.PackageManagement @@ -330,11 +347,6 @@ namespace ICSharpCode.PackageManagement
InstallPackageIntoSolution(solutionRepository, installAction, package);
packageManagementEvents.OnParentPackageInstalled(package);
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
void GetInstallOperationsForSolutionPackage(
@ -369,10 +381,9 @@ namespace ICSharpCode.PackageManagement @@ -369,10 +381,9 @@ namespace ICSharpCode.PackageManagement
installAction.AllowPrereleaseVersions);
}
protected virtual void TryUpdatingPackageInSolution()
protected void UpdatePackageInSolution()
{
try {
var solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
ISolutionPackageRepository solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
var updateAction = new UpdatePackageAction(null, packageManagementEvents);
updateAction.Package = package;
updateAction.AllowPrereleaseVersions = parent.IncludePrerelease;
@ -389,10 +400,6 @@ namespace ICSharpCode.PackageManagement @@ -389,10 +400,6 @@ namespace ICSharpCode.PackageManagement
packageManagementEvents.OnParentPackagesUpdated(updatedPackages);
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
void GetUpdateOperationsForSolutionPackage(
@ -426,19 +433,6 @@ namespace ICSharpCode.PackageManagement @@ -426,19 +433,6 @@ namespace ICSharpCode.PackageManagement
updateAction.AllowPrereleaseVersions);
}
void TryInstallingPackageIntoProject()
{
try {
GetInstallOperationsForProject();
if (LicensesAccepted()) {
InstallPackageIntoProject();
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
void InstallPackageIntoProject()
{
InstallPackageIntoProject(packageOperations);
@ -467,6 +461,7 @@ namespace ICSharpCode.PackageManagement @@ -467,6 +461,7 @@ namespace ICSharpCode.PackageManagement
public void RemoveOrManagePackage()
{
try {
if (selectedProjects.HasMultipleProjects()) {
if (IsProjectPackage(package)) {
ManagePackage();
@ -476,6 +471,10 @@ namespace ICSharpCode.PackageManagement @@ -476,6 +471,10 @@ namespace ICSharpCode.PackageManagement
} else {
RemovePackage();
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
public void RemovePackage()
@ -483,57 +482,46 @@ namespace ICSharpCode.PackageManagement @@ -483,57 +482,46 @@ namespace ICSharpCode.PackageManagement
ClearReportedMessages();
logger.LogRemovingPackage();
if (IsProjectPackage(package)) {
TryUninstallingPackageFromProject();
} else {
TrySolutionPackageUninstall();
}
TryRemovingPackage();
logger.LogAfterPackageOperationCompletes();
}
void LogRemovingPackage()
void TryRemovingPackage()
{
logger.LogRemovingPackage();
try {
if (IsProjectPackage(package)) {
IPackageManagementProject project = GetSingleProjectSelected();
UninstallPackageAction action = project.CreateUninstallPackageAction();
action.Package = package;
actionRunner.Run(action);
} else {
UninstallPackageFromSolution();
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
void TrySolutionPackageUninstall()
void LogRemovingPackage()
{
TryUninstallingPackageFromSolution(package);
logger.LogRemovingPackage();
}
protected void TryUninstallingPackageFromSolution(IPackage removePackage)
void UninstallPackageFromSolution()
{
try {
var solutionPackageRepository = PackageManagementServices.Solution.CreateSolutionPackageRepository();
var packageManager = new PackageManager(
solutionPackageRepository.Repository,
solutionPackageRepository.PackagePathResolver,
solutionPackageRepository.FileSystem);
packageManager.UninstallPackage(removePackage);
solutionPackageRepository.Repository.RemovePackage(removePackage);
packageManagementEvents.OnParentPackageUninstalled(removePackage);
packageManager.UninstallPackage(package);
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
solutionPackageRepository.Repository.RemovePackage(package);
void TryUninstallingPackageFromProject()
{
try {
IPackageManagementProject project = GetSingleProjectSelected();
UninstallPackageAction action = project.CreateUninstallPackageAction();
action.Package = package;
actionRunner.Run(action);
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
packageManagementEvents.OnParentPackageUninstalled(package);
}
public bool IsManaged {

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

@ -43,9 +43,9 @@ namespace ICSharpCode.PackageManagement @@ -43,9 +43,9 @@ namespace ICSharpCode.PackageManagement
SelectedProjectsForUpdatedPackages selectedProjects;
protected override void TryInstallingPackageIntoSolution()
protected override void InstallPackageIntoSolution()
{
TryUpdatingPackageInSolution();
UpdatePackageInSolution();
}
protected override ProcessPackageAction CreatePackageManageAction(IPackageManagementSelectedProject selectedProject)

12
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestablePackageViewModel.cs

@ -67,12 +67,18 @@ namespace PackageManagement.Tests.Helpers @@ -67,12 +67,18 @@ namespace PackageManagement.Tests.Helpers
IsProjectPackageReturnsValue = true;
IsProjectPackageIsCalled = false;
}
protected override bool IsProjectPackage(NuGet.IPackage package)
{
IsProjectPackageAction = p => {
IsProjectPackageIsCalled = true;
return IsProjectPackageReturnsValue;
};
}
public Func<IPackage, bool> IsProjectPackageAction;
protected override bool IsProjectPackage(IPackage package)
{
return IsProjectPackageAction(package);
}
public bool IsProjectPackageReturnsValue { get; set; }

71
src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs

@ -1556,5 +1556,76 @@ namespace PackageManagement.Tests @@ -1556,5 +1556,76 @@ namespace PackageManagement.Tests
Assert.IsNotNull(selectedProjects);
SelectedProjectCollectionAssert.AreEqual(expectedSelectedProjects, selectedProjects);
}
[Test]
public void AddPackage_ExceptionWhenCheckIfPackageIsForProject_ExceptionErrorMessageReported()
{
CreateViewModel();
viewModel.AddOneFakeInstallPackageOperationForViewModelPackage();
var ex = new Exception("Test");
viewModel.IsProjectPackageAction = package => {
throw ex;
};
viewModel.AddPackage();
Assert.AreEqual(ex, fakePackageManagementEvents.ExceptionPassedToOnPackageOperationError);
Assert.IsTrue(fakeLogger.FormattedMessagesLoggedContainsText("Test"));
}
[Test]
public void AddOrManagePackage_ExceptionThrownWhenCheckingIfPackageIsForProject_ExceptionIsLogged()
{
CreateFakeSolution();
AddProjectToSolution();
fakeSolution.FakeMSBuildProjects[0].Name = "MyProject";
fakeSolution.NoProjectsSelected();
fakeSolution.AddFakeProjectToReturnFromGetProject("MyProject");
CreateViewModel(fakeSolution);
var ex = new Exception("Test");
viewModel.IsProjectPackageAction = package => {
throw ex;
};
viewModel.AddOrManagePackage();
Assert.AreEqual(ex, fakePackageManagementEvents.ExceptionPassedToOnPackageOperationError);
Assert.IsTrue(fakeLogger.FormattedMessagesLoggedContainsText("Test"));
}
[Test]
public void RemovePackage_ExceptionWhenCheckingIfPackageIsForProject_ExceptionErrorMessageReported()
{
CreateViewModel();
var ex = new Exception("Test");
viewModel.IsProjectPackageAction = package => {
throw ex;
};
viewModel.RemovePackage();
Assert.AreEqual(ex, fakePackageManagementEvents.ExceptionPassedToOnPackageOperationError);
Assert.IsTrue(fakeLogger.FormattedMessagesLoggedContainsText("Test"));
}
[Test]
public void RemoveOrManagePackage_ExceptionThrownWhenCheckingIfPackageIsForProject_ExceptionIsLogged()
{
CreateFakeSolution();
AddProjectToSolution();
AddProjectToSolution();
fakeSolution.FakeMSBuildProjects[0].Name = "MyProject";
fakeSolution.NoProjectsSelected();
fakeSolution.AddFakeProjectToReturnFromGetProject("MyProject");
CreateViewModel(fakeSolution);
var ex = new Exception("Test");
viewModel.IsProjectPackageAction = package => {
throw ex;
};
viewModel.RemoveOrManagePackage();
Assert.AreEqual(ex, fakePackageManagementEvents.ExceptionPassedToOnPackageOperationError);
Assert.IsTrue(fakeLogger.FormattedMessagesLoggedContainsText("Test"));
}
}
}

Loading…
Cancel
Save