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

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

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

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

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

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

@ -1556,5 +1556,76 @@ namespace PackageManagement.Tests
Assert.IsNotNull(selectedProjects); Assert.IsNotNull(selectedProjects);
SelectedProjectCollectionAssert.AreEqual(expectedSelectedProjects, 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