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 10 years ago
parent
commit
b1f70d154a
  1. 212
      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. 73
      src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs

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

@ -219,31 +219,49 @@ namespace ICSharpCode.PackageManagement @@ -219,31 +219,49 @@ namespace ICSharpCode.PackageManagement
public void AddOrManagePackage()
{
if (!selectedProjects.HasSingleProjectSelected()) {
if (IsProjectPackage(package)) {
ManagePackage();
try {
if (!selectedProjects.HasSingleProjectSelected()) {
if (IsProjectPackage(package)) {
ManagePackage();
} else {
AddPackage();
}
} else {
AddPackage();
}
} else {
AddPackage();
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
public void AddPackage()
{
ClearReportedMessages();
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,25 +333,19 @@ namespace ICSharpCode.PackageManagement @@ -315,25 +333,19 @@ namespace ICSharpCode.PackageManagement
return selectedProjects.Solution.IsPackageInstalled(packageToCheck);
}
protected virtual void TryInstallingPackageIntoSolution()
protected virtual void InstallPackageIntoSolution()
{
try {
var solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
var installAction = new InstallPackageAction(null, packageManagementEvents);
installAction.Package = package;
installAction.IgnoreDependencies = false;
installAction.AllowPrereleaseVersions = parent.IncludePrerelease;
GetInstallOperationsForSolutionPackage(solutionRepository, installAction, package);
if (LicensesAccepted()) {
InstallPackageIntoSolution(solutionRepository, installAction, package);
packageManagementEvents.OnParentPackageInstalled(package);
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
ISolutionPackageRepository solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
var installAction = new InstallPackageAction(null, packageManagementEvents);
installAction.Package = package;
installAction.IgnoreDependencies = false;
installAction.AllowPrereleaseVersions = parent.IncludePrerelease;
GetInstallOperationsForSolutionPackage(solutionRepository, installAction, package);
if (LicensesAccepted()) {
InstallPackageIntoSolution(solutionRepository, installAction, package);
packageManagementEvents.OnParentPackageInstalled(package);
}
}
@ -368,30 +380,25 @@ namespace ICSharpCode.PackageManagement @@ -368,30 +380,25 @@ namespace ICSharpCode.PackageManagement
installAction.IgnoreDependencies,
installAction.AllowPrereleaseVersions);
}
protected virtual void TryUpdatingPackageInSolution()
protected void UpdatePackageInSolution()
{
try {
var solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
var updateAction = new UpdatePackageAction(null, packageManagementEvents);
updateAction.Package = package;
updateAction.AllowPrereleaseVersions = parent.IncludePrerelease;
ISolutionPackageRepository solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
var updateAction = new UpdatePackageAction(null, packageManagementEvents);
updateAction.Package = package;
updateAction.AllowPrereleaseVersions = parent.IncludePrerelease;
GetUpdateOperationsForSolutionPackage(solutionRepository, updateAction, package);
if (LicensesAccepted()) {
UpdateSolutionLevelPackage(solutionRepository, updateAction, package);
GetUpdateOperationsForSolutionPackage(solutionRepository, updateAction, package);
IEnumerable<IPackage> updatedPackages = packageOperations
.Where(packageOperation => packageOperation.Package != null)
.Select(packageOperation => packageOperation.Package)
.Distinct();
if (LicensesAccepted()) {
UpdateSolutionLevelPackage(solutionRepository, updateAction, package);
IEnumerable<IPackage> updatedPackages = packageOperations
.Where(packageOperation => packageOperation.Package != null)
.Select(packageOperation => packageOperation.Package)
.Distinct();
packageManagementEvents.OnParentPackagesUpdated(updatedPackages);
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
packageManagementEvents.OnParentPackagesUpdated(updatedPackages);
}
}
@ -425,20 +432,7 @@ namespace ICSharpCode.PackageManagement @@ -425,20 +432,7 @@ namespace ICSharpCode.PackageManagement
updateAction.UpdateDependencies,
updateAction.AllowPrereleaseVersions);
}
void TryInstallingPackageIntoProject()
{
try {
GetInstallOperationsForProject();
if (LicensesAccepted()) {
InstallPackageIntoProject();
}
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
void InstallPackageIntoProject()
{
InstallPackageIntoProject(packageOperations);
@ -464,76 +458,70 @@ namespace ICSharpCode.PackageManagement @@ -464,76 +458,70 @@ namespace ICSharpCode.PackageManagement
{
packageManagementEvents.OnPackageOperationError(ex);
}
public void RemoveOrManagePackage()
{
if (selectedProjects.HasMultipleProjects()) {
if (IsProjectPackage(package)) {
ManagePackage();
try {
if (selectedProjects.HasMultipleProjects()) {
if (IsProjectPackage(package)) {
ManagePackage();
} else {
RemovePackage();
}
} else {
RemovePackage();
}
} else {
RemovePackage();
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
}
public void RemovePackage()
{
ClearReportedMessages();
logger.LogRemovingPackage();
if (IsProjectPackage(package)) {
TryUninstallingPackageFromProject();
} else {
TrySolutionPackageUninstall();
}
TryRemovingPackage();
logger.LogAfterPackageOperationCompletes();
}
void LogRemovingPackage()
{
logger.LogRemovingPackage();
}
void TrySolutionPackageUninstall()
{
TryUninstallingPackageFromSolution(package);
}
protected void TryUninstallingPackageFromSolution(IPackage removePackage)
void TryRemovingPackage()
{
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);
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 TryUninstallingPackageFromProject()
}
void LogRemovingPackage()
{
try {
IPackageManagementProject project = GetSingleProjectSelected();
UninstallPackageAction action = project.CreateUninstallPackageAction();
action.Package = package;
actionRunner.Run(action);
} catch (Exception ex) {
ReportError(ex);
logger.LogError(ex);
}
logger.LogRemovingPackage();
}
void UninstallPackageFromSolution()
{
var solutionPackageRepository = PackageManagementServices.Solution.CreateSolutionPackageRepository();
var packageManager = new PackageManager(
solutionPackageRepository.Repository,
solutionPackageRepository.PackagePathResolver,
solutionPackageRepository.FileSystem);
packageManager.UninstallPackage(package);
solutionPackageRepository.Repository.RemovePackage(package);
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;
IsProjectPackageAction = p => {
IsProjectPackageIsCalled = true;
return IsProjectPackageReturnsValue;
};
}
protected override bool IsProjectPackage(NuGet.IPackage package)
public Func<IPackage, bool> IsProjectPackageAction;
protected override bool IsProjectPackage(IPackage package)
{
IsProjectPackageIsCalled = true;
return IsProjectPackageReturnsValue;
return IsProjectPackageAction(package);
}
public bool IsProjectPackageReturnsValue { get; set; }

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

@ -30,7 +30,7 @@ using Rhino.Mocks; @@ -30,7 +30,7 @@ using Rhino.Mocks;
namespace PackageManagement.Tests
{
[TestFixture]
public class PackageViewModelTests
public class PackageViewModelTests
{
TestablePackageViewModel viewModel;
FakePackage fakePackage;
@ -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