Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit d8cfa43

Browse files
author
Dragan
committed
PM: Solution-Packages Update etc..
Tests OK Uninstall older solution-level packages before installing update package Remove uninstaled solution-level package from .nuget/packages.config PackageViewModel.PackageChanged protected from reentrant events because of exception on SD exit
1 parent e8ef120 commit d8cfa43

3 files changed

Lines changed: 97 additions & 53 deletions

File tree

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

Lines changed: 74 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class PackageViewModel : ViewModelBase<PackageViewModel>
3636
IPackageFromRepository package;
3737
IEnumerable<PackageOperation> packageOperations = new PackageOperation[0];
3838
PackageViewModelOperationLogger logger;
39-
IPackageActionRunner actionRunner;
39+
readonly IPackageActionRunner actionRunner;
4040
IPackageViewModelParent parent;
4141

4242
public PackageViewModel(
@@ -207,9 +207,13 @@ protected virtual bool IsProjectPackage(IPackage package) {
207207
return package.IsProjectPackage();
208208
}
209209

210+
bool packageIsChanging = false;
210211
public void PackageChanged() {
212+
if (packageIsChanging) return;
213+
else packageIsChanging = true;
211214
OnPropertyChanged(model => model.IsManaged);
212215
OnPropertyChanged(model => model.IsAdded);
216+
packageIsChanging = false;
213217
}
214218

215219
public void AddOrManagePackage() {
@@ -233,10 +237,10 @@ public void AddPackage()
233237

234238
using (IDisposable operation = StartOperation(package)) {
235239
if (IsProjectPackage(package)) {
236-
TryInstallingPackage();
240+
TryProjectPackageInstall();
237241
}
238242
else {
239-
TryInstallingSolutionPackage();
243+
TrySolutionPackageInstall();
240244
}
241245
}
242246

@@ -253,7 +257,7 @@ void ClearReportedMessages()
253257
packageManagementEvents.OnPackageOperationsStarting();
254258
}
255259

256-
void GetInstallPackageOperations()
260+
void ProjectPackageGetInstallOperations()
257261
{
258262
IPackageManagementProject project = GetSingleProjectSelected();
259263
project.Logger = logger;
@@ -262,8 +266,8 @@ void GetInstallPackageOperations()
262266
packageOperations = project.GetInstallPackageOperations(package, installAction);
263267
}
264268

265-
IEnumerable<PackageOperation> GetInstallPackageOperations(IEnumerable<IPackageManagementSelectedProject> projects) {
266-
IEnumerable<PackageOperation> installPackageOperations = new PackageOperation[0];
269+
void ProjectPackageGetInstallOperations(IEnumerable<IPackageManagementSelectedProject> projects) {
270+
packageOperations = new PackageOperation[0];
267271
IPackageManagementSelectedProject firstSelectedProject = (
268272
from project in projects
269273
where project.IsSelected
@@ -272,11 +276,24 @@ where project.IsSelected
272276
if (firstSelectedProject != null) {
273277
InstallPackageAction installAction = firstSelectedProject.Project.CreateInstallPackageAction();
274278
installAction.AllowPrereleaseVersions = parent.IncludePrerelease;
275-
installPackageOperations = firstSelectedProject.Project.GetInstallPackageOperations(package, installAction);
279+
packageOperations = firstSelectedProject.Project.GetInstallPackageOperations(package, installAction);
276280
}
277-
return installPackageOperations;
278281
}
279282

283+
void SolutionPackageGetInstallOperations(
284+
ISolutionPackageRepository solutionRepository,
285+
InstallPackageAction installAction,
286+
IPackageFromRepository installPackage) {
287+
288+
var resolverFactory = new PackageOperationsResolverFactory();
289+
var resolver = resolverFactory.CreateInstallPackageOperationResolver(
290+
solutionRepository.Repository,
291+
installPackage.Repository,
292+
logger,
293+
installAction);
294+
packageOperations = resolver.ResolveOperations(installPackage);
295+
}
296+
280297
IPackageManagementProject GetSingleProjectSelected()
281298
{
282299
return selectedProjects.GetSingleProjectSelected(package.Repository);
@@ -304,44 +321,27 @@ IList<IPackage> GetPackagesToBeInstalled()
304321
return packages;
305322
}
306323

307-
bool PackageRequiresLicenseAcceptance(IPackage package)
324+
bool PackageRequiresLicenseAcceptance(IPackage iPackage)
308325
{
309-
return package.RequireLicenseAcceptance && !IsPackageInstalled(package);
326+
return iPackage.RequireLicenseAcceptance && !IsPackageInstalled(iPackage);
310327
}
311328

312-
bool IsPackageInstalled(IPackage package)
329+
bool IsPackageInstalled(IPackage iPackage)
313330
{
314-
return selectedProjects.Solution.IsPackageInstalled(package);
331+
return selectedProjects.Solution.IsPackageInstalled(iPackage);
315332
}
316333

317-
void TryInstallingSolutionPackage()
334+
protected virtual void TrySolutionPackageInstall()
318335
{
319336
try {
337+
var solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
320338
var installAction = new InstallPackageAction(null, packageManagementEvents);
339+
installAction.Package = package;
321340
installAction.IgnoreDependencies = false;
322341
installAction.AllowPrereleaseVersions = parent.IncludePrerelease;
323-
324-
var solutionRepository = selectedProjects.Solution.CreateSolutionPackageRepository();
325-
326-
var resolverFactory = new PackageOperationsResolverFactory();
327-
var resolver = resolverFactory.CreateInstallPackageOperationResolver(
328-
solutionRepository.Repository,
329-
package.Repository,
330-
logger,
331-
installAction);
332-
packageOperations = resolver.ResolveOperations(package);
333-
342+
SolutionPackageGetInstallOperations(solutionRepository, installAction, package);
334343
if (LicensesAccepted()) {
335-
var packageManager = new PackageManager(
336-
package.Repository,
337-
solutionRepository.PackagePathResolver,
338-
solutionRepository.FileSystem,
339-
solutionRepository.Repository);
340-
packageManager.InstallPackage(
341-
package.Id,
342-
package.Version,
343-
installAction.IgnoreDependencies,
344-
installAction.AllowPrereleaseVersions);
344+
SolutionPackageInstall(solutionRepository, installAction, package);
345345
packageManagementEvents.OnParentPackageInstalled(package);
346346
}
347347
} catch (Exception ex) {
@@ -350,31 +350,47 @@ void TryInstallingSolutionPackage()
350350
}
351351
}
352352

353-
void TryInstallingPackage()
353+
void SolutionPackageInstall(
354+
ISolutionPackageRepository solutionRepository,
355+
InstallPackageAction installAction,
356+
IPackageFromRepository installPackage) {
357+
var packageManager = new PackageManager(
358+
installPackage.Repository,
359+
solutionRepository.PackagePathResolver,
360+
solutionRepository.FileSystem,
361+
solutionRepository.Repository);
362+
packageManager.InstallPackage(
363+
installPackage.Id,
364+
installPackage.Version,
365+
installAction.IgnoreDependencies,
366+
installAction.AllowPrereleaseVersions);
367+
}
368+
369+
void TryProjectPackageInstall()
354370
{
355371
try {
356-
GetInstallPackageOperations();
372+
ProjectPackageGetInstallOperations();
357373
if (LicensesAccepted()) {
358-
InstallPackage();
374+
ProjectPackageInstall();
359375
}
360376
} catch (Exception ex) {
361377
ReportError(ex);
362378
logger.LogError(ex);
363379
}
364380
}
365-
366-
void InstallPackage()
381+
382+
void ProjectPackageInstall()
367383
{
368-
InstallPackage(packageOperations);
384+
ProjectPackageInstall(packageOperations);
369385
}
370386

371-
void InstallPackage(IEnumerable<PackageOperation> packageOperations)
387+
void ProjectPackageInstall(IEnumerable<PackageOperation> installOperations)
372388
{
373389
IPackageManagementProject project = GetSingleProjectSelected();
374390
ProcessPackageOperationsAction action = CreateInstallPackageAction(project);
375391
action.AllowPrereleaseVersions = parent.IncludePrerelease;
376392
action.Package = package;
377-
action.Operations = packageOperations;
393+
action.Operations = installOperations;
378394
actionRunner.Run(action);
379395
}
380396

@@ -409,9 +425,9 @@ public void RemovePackage()
409425
logger.LogRemovingPackage();
410426

411427
if (IsProjectPackage(package)) {
412-
TryUninstallingPackage();
428+
TryProjectPackageUninstall();
413429
} else {
414-
TryUninstallingSolutionPackage();
430+
TrySolutionPackageUninstall();
415431
}
416432

417433
logger.LogAfterPackageOperationCompletes();
@@ -422,20 +438,28 @@ void LogRemovingPackage()
422438
logger.LogRemovingPackage();
423439
}
424440

425-
void TryUninstallingSolutionPackage()
441+
void TrySolutionPackageUninstall() {
442+
TrySolutionPackageUninstall(package);
443+
}
444+
445+
protected void TrySolutionPackageUninstall(IPackage removePackage)
426446
{
427447
try {
428448
var solutionPackageRepository = PackageManagementServices.Solution.CreateSolutionPackageRepository();
429-
var packageManager = new NuGet.PackageManager(solutionPackageRepository.Repository, solutionPackageRepository.PackagePathResolver, solutionPackageRepository.FileSystem);
430-
packageManager.UninstallPackage(package.Id, package.Version);
431-
packageManagementEvents.OnParentPackageUninstalled(package);
449+
var packageManager = new PackageManager(
450+
solutionPackageRepository.Repository,
451+
solutionPackageRepository.PackagePathResolver,
452+
solutionPackageRepository.FileSystem);
453+
packageManager.UninstallPackage(removePackage);
454+
solutionPackageRepository.Repository.RemovePackage(removePackage);
455+
packageManagementEvents.OnParentPackageUninstalled(removePackage);
432456
} catch (Exception ex) {
433457
ReportError(ex);
434458
logger.LogError(ex);
435459
}
436460
}
437461

438-
void TryUninstallingPackage()
462+
void TryProjectPackageUninstall()
439463
{
440464
try {
441465
IPackageManagementProject project = GetSingleProjectSelected();
@@ -558,7 +582,7 @@ protected ProcessPackageAction CreateUpdatePackageManageActionForSelectedProject
558582
}
559583

560584
bool LicensesAccepted(IEnumerable<IPackageManagementSelectedProject> projects) {
561-
packageOperations = GetInstallPackageOperations(projects);
585+
ProjectPackageGetInstallOperations(projects);
562586
return LicensesAccepted();
563587
}
564588

src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,11 @@ protected void OnPackageChanged(object sender, EventArgs e)
112112
{
113113
if (IsReadingPackages) return;
114114
if (PackageViewModels == null) return;
115+
115116
// refresh all because we don't know if any dependant package is (un)installed
116117
foreach (var packageViewModel in this.PackageViewModels) {
117-
packageViewModel.PackageChanged();
118+
if (!IsReadingPackages)
119+
packageViewModel.PackageChanged();
118120
}
119121
}
120122

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,30 @@ public class UpdatedPackageViewModel : PackageViewModel
2626
public UpdatedPackageViewModel(
2727
IPackageViewModelParent parent,
2828
IPackageFromRepository package,
29-
PackageManagementSelectedProjects selectedProjects,
29+
SelectedProjectsForUpdatedPackages selectedProjects,
3030
IPackageManagementEvents packageManagementEvents,
3131
IPackageActionRunner actionRunner,
3232
ILogger logger)
33-
: base(parent, package, selectedProjects, packageManagementEvents, actionRunner, logger)
33+
: base(
34+
parent,
35+
package,
36+
selectedProjects,
37+
packageManagementEvents,
38+
actionRunner,
39+
logger)
3440
{
41+
this.selectedProjects = selectedProjects;
42+
}
43+
44+
SelectedProjectsForUpdatedPackages selectedProjects;
45+
46+
protected override void TrySolutionPackageInstall()
47+
{
48+
var repository = selectedProjects.Solution.CreateSolutionPackageRepository();
49+
foreach (var packageToUpdate in repository.Repository.FindPackagesById(this.Id)) {
50+
TrySolutionPackageUninstall(packageToUpdate);
51+
}
52+
base.TrySolutionPackageInstall();
3553
}
3654

3755
protected override ProcessPackageAction CreatePackageManageAction(IPackageManagementSelectedProject selectedProject)

0 commit comments

Comments
 (0)