diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs index 0f0f12a98b..2da62d8fac 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackage.cs @@ -66,6 +66,8 @@ namespace ICSharpCode.PackageManagement.Design return new FakePackage(id, version); } + public bool IsProjectPackage { get { return true; } } + public string Id { get; set; } public SemanticVersion Version { get; set; } public string Title { get; set; } @@ -82,8 +84,6 @@ namespace ICSharpCode.PackageManagement.Design public int RatingsCount { get; set; } public double Rating { get; set; } - public bool HasProjectContent() { return true; } - public IEnumerable AssemblyReferences { get { return AssemblyReferenceList; } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageFromRepository.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageFromRepository.cs index 10450ae787..63b4e0eed5 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageFromRepository.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageFromRepository.cs @@ -27,5 +27,6 @@ namespace ICSharpCode.PackageManagement bool HasDependencies { get; } DateTime? LastUpdated { get; } Uri GalleryUrl { get; } + bool IsProjectPackage { get; } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageFromRepository.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageFromRepository.cs index bf93044c15..8a0bee62f0 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageFromRepository.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageFromRepository.cs @@ -35,7 +35,9 @@ namespace ICSharpCode.PackageManagement this.package = package; this.Repository = repository; } - + + public bool IsProjectPackage { get { return this.HasProjectContent(); } } + public IPackageRepository Repository { get; private set; } public IEnumerable AssemblyReferences { diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs index 6a98e7e107..89c7a99367 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageViewModel.cs @@ -119,7 +119,7 @@ namespace ICSharpCode.PackageManagement get { if (selectedProjects.HasSingleProjectSelected()) { return selectedProjects.GetSingleProjectSelected(package.Repository).IsPackageInstalled(package) - || (selectedProjects.IsPackageInstalledInSolution(package) && !package.HasProjectContent()); + || (IsPackageInstalled() && !package.IsProjectPackage); } return IsPackageInstalled(); } @@ -127,9 +127,7 @@ namespace ICSharpCode.PackageManagement protected bool IsPackageInstalled() { - return selectedProjects.IsPackageInstalledInSolution(package); - // It works same without second condition .... - //|| selectedProjects.IsPackageInstalled(package); + return IsPackageInstalledInSolution(package); } public IEnumerable Dependencies { @@ -200,14 +198,13 @@ namespace ICSharpCode.PackageManagement get { return package.Published.HasValue; } } - public void OnPackagePropertyChanged() { + public void PackageChanged() { OnPropertyChanged(model => model.IsAdded); - OnPropertyChanged(model => model.IsManaged); } public void AddOrManagePackage() { if (selectedProjects.HasMultipleProjects()) { - if (package.HasProjectContent()) { + if (package.IsProjectPackage) { ManagePackage(); } else { @@ -225,7 +222,7 @@ namespace ICSharpCode.PackageManagement logger.LogAddingPackage(); using (IDisposable operation = StartOperation(package)) { - if (package.HasProjectContent()) { + if (package.IsProjectPackage) { TryInstallingPackage(); } else { @@ -234,7 +231,6 @@ namespace ICSharpCode.PackageManagement } logger.LogAfterPackageOperationCompletes(); - OnPackagePropertyChanged(); } protected virtual IDisposable StartOperation(IPackageFromRepository package) @@ -290,7 +286,7 @@ namespace ICSharpCode.PackageManagement bool IsPackageInstalledInSolution(IPackage package) { - return selectedProjects.IsPackageInstalledInSolution(package); + return selectedProjects.Solution.IsPackageInstalled(package); } void TryInstallingSolutionPackage() @@ -322,6 +318,7 @@ namespace ICSharpCode.PackageManagement installAction.IgnoreDependencies, installAction.AllowPrereleaseVersions); packageManagementEvents.OnParentPackageInstalled(package); + PackageChanged(); } } catch (Exception ex) { ReportError(ex); @@ -335,6 +332,7 @@ namespace ICSharpCode.PackageManagement GetInstallPackageOperations(); if (LicensesAccepted()) { InstallPackage(); + PackageChanged(); } } catch (Exception ex) { ReportError(ex); @@ -370,7 +368,7 @@ namespace ICSharpCode.PackageManagement public void RemoveOrManagePackage() { if (selectedProjects.HasMultipleProjects()) { - if (package.HasProjectContent()) { + if (package.IsProjectPackage) { ManagePackage(); } else { @@ -387,14 +385,13 @@ namespace ICSharpCode.PackageManagement ClearReportedMessages(); logger.LogRemovingPackage(); - if (package.HasProjectContent()) { + if (package.IsProjectPackage) { TryUninstallingPackage(); } else { TryUninstallingSolutionPackage(); } logger.LogAfterPackageOperationCompletes(); - OnPackagePropertyChanged(); } void LogRemovingPackage() @@ -409,6 +406,7 @@ namespace ICSharpCode.PackageManagement var packageManager = new NuGet.PackageManager(solutionPackageRepository.Repository, solutionPackageRepository.PackagePathResolver, solutionPackageRepository.FileSystem); packageManager.UninstallPackage(package.Id, package.Version); packageManagementEvents.OnParentPackageUninstalled(package); + PackageChanged(); } catch (Exception ex) { ReportError(ex); logger.LogError(ex); @@ -422,6 +420,7 @@ namespace ICSharpCode.PackageManagement UninstallPackageAction action = project.CreateUninstallPackageAction(); action.Package = package; actionRunner.Run(action); + PackageChanged(); } catch (Exception ex) { ReportError(ex); logger.LogError(ex); @@ -438,14 +437,14 @@ namespace ICSharpCode.PackageManagement // Solution selected // Project-level/Solution-level Package Management if (IsAdded) { - if (package.HasProjectContent()) { + if (package.IsProjectPackage) { return true; // [Manage] Button } return false; // [Remove] Button } - // package.HasProjectContent() is too slow on uninstalled packages + // package.IsProjectPackage() is too slow on uninstalled packages // check ([Add] or [Manage]) after user press on [Add] Package Button - return false; // [Add] Button -> redirect to [Manage] if (package.HasProjectContent()) + return false; // [Add] Button -> redirect to [Manage] if (package.IsProjectPackage()) } } @@ -477,15 +476,28 @@ namespace ICSharpCode.PackageManagement } logger.LogAfterPackageOperationCompletes(); - OnPackagePropertyChanged(); } void TryManagePackagesForSelectedProjects(IList projects) { try { + packageOperations = new PackageOperation[0]; + if (!IsPackageInstalled()) { + IPackageManagementSelectedProject firstSelectedProject = ( + from project in projects + where project.IsSelected + select project).FirstOrDefault(); + + if (firstSelectedProject != null) { + InstallPackageAction installAction = firstSelectedProject.Project.CreateInstallPackageAction(); + installAction.AllowPrereleaseVersions = parent.IncludePrerelease; + packageOperations = firstSelectedProject.Project.GetInstallPackageOperations(package, installAction); + } + } IList actions = GetProcessPackageActionsForSelectedProjects(projects); - if (actions.Any() && (IsPackageInstalled() || LicensesAccepted())) { + if (actions.Any() && LicensesAccepted()) { RunActionsIfAnyExist(actions); + PackageChanged(); } } catch (Exception ex) { ReportError(ex); @@ -519,29 +531,26 @@ namespace ICSharpCode.PackageManagement return CreateUninstallPackageManageActionForSelectedProject(selectedProject); } - protected ProcessPackageAction CreateUpdatePackageManageActionForSelectedProject(IPackageManagementSelectedProject selectedProject) + ProcessPackageAction CreateInstallPackageManageActionForSelectedProject(IPackageManagementSelectedProject selectedProject) { - - // TODO? Fix UpdatedPackageViewModelTests to comply with this condition - if (selectedProject.Project.GetPackages().Where(p => p.Id == package.Id).Any() && - !selectedProject.Project.GetPackages().Where(p => p.Id == package.Id && p.Version == package.Version).Any()) { - return CreateUpdatePackageAction(selectedProject); + if (!selectedProject.Project.IsPackageInstalled(package)) { + return CreateInstallPackageAction(selectedProject); } return null; } - ProcessPackageAction CreateInstallPackageManageActionForSelectedProject(IPackageManagementSelectedProject selectedProject) + ProcessPackageAction CreateUninstallPackageManageActionForSelectedProject(IPackageManagementSelectedProject selectedProject) { - //if (!selectedProject.Project.GetPackages().Where(p => p.Id == package.Id && p.Version == package.Version).Any()) { - return CreateInstallPackageAction(selectedProject); - //} - //return null; + if (selectedProject.Project.IsPackageInstalled(package)) { + return CreateUninstallPackageAction(selectedProject); + } + return null; } - ProcessPackageAction CreateUninstallPackageManageActionForSelectedProject(IPackageManagementSelectedProject selectedProject) + protected ProcessPackageAction CreateUpdatePackageManageActionForSelectedProject(IPackageManagementSelectedProject selectedProject) { - if (selectedProject.Project.GetPackages().Where(p => p.Id == package.Id && p.Version == package.Version).Any()) { - return CreateUninstallPackageAction(selectedProject); + if (!selectedProject.Project.IsPackageInstalled(package)) { + return CreateUpdatePackageAction(selectedProject); } return null; } @@ -561,6 +570,7 @@ namespace ICSharpCode.PackageManagement project.Logger = logger; ProcessPackageOperationsAction action = CreateInstallPackageAction(project); + action.AllowPrereleaseVersions = parent.IncludePrerelease; action.Package = package; return action; } @@ -581,6 +591,7 @@ namespace ICSharpCode.PackageManagement project.Logger = logger; ProcessPackageOperationsAction action = project.CreateUpdatePackageAction(); + action.AllowPrereleaseVersions = parent.IncludePrerelease; action.Package = package; return action; } @@ -591,32 +602,6 @@ namespace ICSharpCode.PackageManagement actionRunner.Run(actions); } } - - IEnumerable GetPackagesRequiringLicenseAcceptance(IPackageManagementSelectedProject selectedProject) - { - IPackageManagementProject project = selectedProject.Project; - project.Logger = logger; - InstallPackageAction installAction = project.CreateInstallPackageAction(); - installAction.AllowPrereleaseVersions = parent.IncludePrerelease; - IEnumerable operations = project.GetInstallPackageOperations(package, installAction); - return GetPackagesRequiringLicenseAcceptance(operations); - } - - IEnumerable GetPackagesRequiringLicenseAcceptance(IEnumerable operations) - { - foreach (PackageOperation operation in operations) { - if (PackageOperationRequiresLicenseAcceptance(operation)) { - yield return operation.Package; - } - } - } - - bool PackageOperationRequiresLicenseAcceptance(PackageOperation operation) - { - return - (operation.Action == PackageAction.Install) && - operation.Package.RequireLicenseAcceptance && - !IsPackageInstalledInSolution(operation.Package); - } + } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs index 4e1d71aa93..62ce4d10fa 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs @@ -95,18 +95,18 @@ namespace ICSharpCode.PackageManagement if (PackageViewModels == null) return; var operation = e as ParentPackageOperationEventArgs; if (operation != null && operation.Package != null) { - foreach (var found in PackageViewModels) { - if (found.Id == operation.Package.Id) { + foreach (var packageViewModel in PackageViewModels) { + if (packageViewModel.Id == operation.Package.Id) { // Do not compare package.Version here // On update, two packages are changed - found.OnPackagePropertyChanged(); + packageViewModel.PackageChanged(); } } } else { // Unknown operation/package -> refresh all items - foreach (var found in this.PackageViewModels) { - found.OnPackagePropertyChanged(); + foreach (var packageViewModel in this.PackageViewModels) { + packageViewModel.PackageChanged(); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackagesViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackagesViewModel.cs index 41d6c3e931..9c608ddb9e 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackagesViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/RecentPackagesViewModel.cs @@ -45,19 +45,19 @@ namespace ICSharpCode.PackageManagement void RegisterEvents() { - packageManagementEvents.ParentPackageInstalled += OnNewRecentPackage; + packageManagementEvents.ParentPackageInstalled += OnAddRecentPackage; packageManagementEvents.ParentPackageUninstalled += OnPackageChanged; - packageManagementEvents.ParentPackagesUpdated += OnNewRecentPackage; + packageManagementEvents.ParentPackagesUpdated += OnAddRecentPackage; } protected override void OnDispose() { - packageManagementEvents.ParentPackageInstalled -= OnNewRecentPackage; + packageManagementEvents.ParentPackageInstalled -= OnAddRecentPackage; packageManagementEvents.ParentPackageUninstalled -= OnPackageChanged; - packageManagementEvents.ParentPackagesUpdated -= OnNewRecentPackage; + packageManagementEvents.ParentPackagesUpdated -= OnAddRecentPackage; } - void OnNewRecentPackage(object sender, EventArgs e) + void OnAddRecentPackage(object sender, EventArgs e) { ReadPackages(); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs index 00a399a35f..b1ec5061ed 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/UpdatedPackageViewModel.cs @@ -35,13 +35,21 @@ namespace ICSharpCode.PackageManagement } protected override ProcessPackageAction CreatePackageManageAction(IPackageManagementSelectedProject selectedProject) - { - return base.CreateUpdatePackageManageActionForSelectedProject(selectedProject); + { // Modify PackageViewModel logic + if (selectedProject.IsSelected) { + return base.CreateUpdatePackageManageActionForSelectedProject(selectedProject); + } + return null; } protected override IDisposable StartOperation(IPackageFromRepository package) - { + { // Modify PackageViewModel logic return package.StartUpdateOperation(); } + + protected override ProcessPackageOperationsAction CreateInstallPackageAction(IPackageManagementProject project) + { // Modify UpdatePackageAction logic + return project.CreateUpdatePackageAction(); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs index 195ce8a27b..805546d575 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/PackageViewModelTests.cs @@ -821,7 +821,11 @@ namespace PackageManagement.Tests bool managed = viewModel.IsManaged; - Assert.IsTrue(managed); + // Assert.IsTrue(managed); + // Only installed project-level package "IsManaged" + Assert.IsFalse(managed); + bool added = viewModel.IsAdded; + Assert.IsFalse(added); } [Test] @@ -834,7 +838,11 @@ namespace PackageManagement.Tests bool managed = viewModel.IsManaged; - Assert.IsTrue(managed); + // Assert.IsTrue(managed); + // Only installed project-level package "IsManaged" + Assert.IsFalse(managed); + bool added = viewModel.IsAdded; + Assert.IsFalse(added); } [Test] @@ -893,8 +901,10 @@ namespace PackageManagement.Tests public void ManagePackage_TwoProjectsSelectedAndUserAcceptsSelectedProjects_IsAddedPropertyChanged() { CreateViewModelWithTwoProjectsSelected("Project A", "Project B"); + viewModel.FakePackageManagementEvents.ProjectsToSelect.Add("Project A"); + viewModel.FakePackageManagementEvents.ProjectsToSelect.Add("Project B"); UserAcceptsProjectSelection(); - + string propertyChangedName = null; viewModel.PropertyChanged += (sender, e) => propertyChangedName = e.PropertyName; diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackageViewModelTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackageViewModelTests.cs index fd766d409f..3bda47e1de 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackageViewModelTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatedPackageViewModelTests.cs @@ -49,7 +49,6 @@ namespace PackageManagement.Tests viewModelParent = MockRepository.GenerateStub(); viewModel = new TestableUpdatedPackageViewModel(viewModelParent, fakeSolution); fakeProject = fakeSolution.FakeProjectToReturnFromGetProject; - fakeSolution.AddPackageToSharedLocalRepository("","0.0.0.0"); fakeActionRunner = viewModel.FakeActionRunner; fakePackageManagementEvents = viewModel.FakePackageManagementEvents; } @@ -135,6 +134,7 @@ namespace PackageManagement.Tests CreateViewModelWithTwoProjectsSelected("Project A", "Project B"); fakePackageManagementEvents.ProjectsToSelect.Add("Project B"); fakePackageManagementEvents.OnSelectProjectsReturnValue = true; + viewModel.ManagePackage(); FakePackage expectedPackage = viewModel.FakePackage;