diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageFromRepositoryExtensions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageFromRepositoryExtensions.cs index f41e8c8ac8..fa48451b4a 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageFromRepositoryExtensions.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageFromRepositoryExtensions.cs @@ -11,5 +11,10 @@ namespace ICSharpCode.PackageManagement { return package.Repository.StartInstallOperation(package.Id); } + + public static IDisposable StartUpdateOperation(this IPackageFromRepository package) + { + return package.Repository.StartUpdateOperation(package.Id); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageRepositoryExtensions.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageRepositoryExtensions.cs index ea584ac8ef..bd3577e50c 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageRepositoryExtensions.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageRepositoryExtensions.cs @@ -12,5 +12,10 @@ namespace ICSharpCode.PackageManagement { return repository.StartOperation(RepositoryOperationNames.Install, mainPackageId); } + + public static IDisposable StartUpdateOperation(this IPackageRepository repository, string mainPackageId = null) + { + return repository.StartOperation(RepositoryOperationNames.Update, mainPackageId); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs index 1539de7afc..910d3a7dd5 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs @@ -181,12 +181,17 @@ namespace ICSharpCode.PackageManagement { ClearReportedMessages(); logger.LogAddingPackage(); - using (IDisposable operation = package.StartInstallOperation()) { + using (IDisposable operation = StartInstallOperation(package)) { TryInstallingPackage(); } logger.LogAfterPackageOperationCompletes(); } + protected virtual IDisposable StartInstallOperation(IPackageFromRepository package) + { + return package.StartInstallOperation(); + } + void ClearReportedMessages() { packageManagementEvents.OnPackageOperationsStarting(); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs index f90ea9c6a7..62ef4572e3 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs @@ -24,5 +24,10 @@ namespace ICSharpCode.PackageManagement { return project.CreateUpdatePackageAction(); } + + protected override IDisposable StartInstallOperation(IPackageFromRepository package) + { + return package.StartUpdateOperation(); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackageViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackageViewModelTests.cs index 5c08ef3f77..1ba38f04ec 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackageViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackageViewModelTests.cs @@ -128,5 +128,34 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedPackage, actualPackage); } + + [Test] + public void AddPackage_PackageRepositoryIsOperationAwareAndPackageAddedSuccessfully_UpdateOperationStartedForPackage() + { + CreateViewModel(); + var operationAwareRepository = new FakeOperationAwarePackageRepository(); + FakePackage fakePackage = viewModel.FakePackage; + fakePackage.FakePackageRepository = operationAwareRepository; + fakePackage.Id = "MyPackage"; + + viewModel.AddPackage(); + + Assert.AreEqual(RepositoryOperationNames.Update, operationAwareRepository.OperationStarted); + Assert.AreEqual("MyPackage", operationAwareRepository.MainPackageIdForOperationStarted); + } + + [Test] + public void AddPackage_PackageRepositoryIsOperationAwareAndPackageAddedSuccessfully_UpdateperationStartedIsDisposed() + { + CreateViewModel(); + var operationAwareRepository = new FakeOperationAwarePackageRepository(); + FakePackage fakePackage = viewModel.FakePackage; + fakePackage.FakePackageRepository = operationAwareRepository; + fakePackage.Id = "MyPackage"; + + viewModel.AddPackage(); + + operationAwareRepository.AssertOperationIsDisposed(); + } } }