Beispiel #1
0
        public async Task GetPackagesWithUpdatesAsync_WithMultipleProjects_RetrievesNoUpdates()
        {
            // Arrange
            var testPackageIdentity = new PackageCollectionItem("FakePackage", NuGetVersion.Parse("1.0.0"), installedReferences: null);
            var serviceBroker       = new Mock <IServiceBroker>();
            Mock <INuGetProjectManagerService> projectManagerService = SetupProjectManagerService(serviceBroker);

            IProjectContextInfo projectA = SetupProject(projectManagerService, "FakePackage", "2.0.1");
            IProjectContextInfo projectB = SetupProject(projectManagerService, "FakePackage", "1.0.1", "[1,2)");

            SetupRemotePackageMetadata("FakePackage", "0.0.1", "1.0.0", "2.0.1", "2.0.0", "1.0.1");

            var _target = new UpdatePackageFeed(
                serviceBroker.Object,
                new[] { testPackageIdentity },
                _metadataProvider,
                new[] { projectA, projectB });

            // Act
            IEnumerable <IPackageSearchMetadata> packages = await _target.GetPackagesWithUpdatesAsync(
                searchText : "fake",
                new SearchFilter(includePrerelease : false),
                CancellationToken.None);

            // Assert
            Assert.Empty(packages);
        }
Beispiel #2
0
        public PackageRestoreBar(INuGetSolutionManagerService solutionManager, IPackageRestoreManager packageRestoreManager, IProjectContextInfo projectContextInfo)
        {
            DataContext = this;
            InitializeComponent();
            _uiDispatcher          = Dispatcher.CurrentDispatcher;
            _solutionManager       = solutionManager;
            _packageRestoreManager = packageRestoreManager;
            _projectContextInfo    = projectContextInfo;

            if (_packageRestoreManager != null)
            {
                _packageRestoreManager.PackagesMissingStatusChanged += OnPackagesMissingStatusChanged;

                if (_projectContextInfo?.ProjectStyle == ProjectModel.ProjectStyle.PackageReference)
                {
                    _packageRestoreManager.AssetsFileMissingStatusChanged += OnAssetsFileMissingStatusChanged;
                }
            }

            // Set DynamicResource binding in code
            // The reason we can't set it in XAML is that the VsBrushes class comes from either
            // Microsoft.VisualStudio.Shell.10 or Microsoft.VisualStudio.Shell.11 assembly,
            // depending on whether NuGet runs inside VS10 or VS11.
            StatusMessage.SetResourceReference(TextBlock.ForegroundProperty, VsBrushes.InfoTextKey);
            RestoreBar.SetResourceReference(Border.BackgroundProperty, VsBrushes.InfoBackgroundKey);
            RestoreBar.SetResourceReference(Border.BorderBrushProperty, VsBrushes.ActiveBorderKey);

            // Find storyboards that will be used to smoothly show and hide the restore bar.
            _showRestoreBar = FindResource("ShowSmoothly") as Storyboard;
            _hideRestoreBar = FindResource("HideSmoothly") as Storyboard;
        }
        public static async ValueTask <PackageInstallationInfo> CreateAsync(IProjectContextInfo project, CancellationToken cancellationToken)
        {
            var packageInstallationInfo = new PackageInstallationInfo(project);
            await packageInstallationInfo.InitializeAsync(cancellationToken);

            return(packageInstallationInfo);
        }
Beispiel #4
0
        public async ValueTask <IReadOnlyCollection <IProjectContextInfo> > GetUpgradeableProjectsAsync(
            IReadOnlyCollection <string> projectIds,
            CancellationToken cancellationToken)
        {
            Assumes.NotNullOrEmpty(projectIds);

            cancellationToken.ThrowIfCancellationRequested();

            NuGetProject[] projects = await GetProjectsAsync(projectIds);

            var upgradeableProjects = new List <IProjectContextInfo>();

            IEnumerable <NuGetProject> capableProjects = projects
                                                         .Where(project =>
                                                                project.ProjectStyle == ProjectModel.ProjectStyle.PackagesConfig &&
                                                                project.ProjectServices.Capabilities.SupportsPackageReferences);

            // get all packages.config based projects with no installed packages
            foreach (NuGetProject project in capableProjects)
            {
                IEnumerable <PackageReference> installedPackages = await project.GetInstalledPackagesAsync(cancellationToken);

                if (!installedPackages.Any())
                {
                    IProjectContextInfo upgradeableProject = await ProjectContextInfo.CreateAsync(project, cancellationToken);

                    upgradeableProjects.Add(upgradeableProject);
                }
            }

            return(upgradeableProjects);
        }
        public async Task UpgradeProjectsToPackageReferenceAsync(IEnumerable <IProjectContextInfo> msBuildProjects)
        {
            if (msBuildProjects == null)
            {
                throw new ArgumentNullException(nameof(msBuildProjects));
            }

            List <IProjectContextInfo> projects = Projects.ToList();

            IServiceBroker serviceBroker = UIContext.ServiceBroker;

            using (INuGetProjectUpgraderService projectUpgrader = await serviceBroker.GetProxyAsync <INuGetProjectUpgraderService>(
                       NuGetServices.ProjectUpgraderService,
                       cancellationToken: CancellationToken.None))
            {
                Assumes.NotNull(projectUpgrader);

                foreach (IProjectContextInfo project in msBuildProjects)
                {
                    IProjectContextInfo newProject = await projectUpgrader.UpgradeProjectToPackageReferenceAsync(
                        project.ProjectId,
                        CancellationToken.None);

                    if (newProject != null)
                    {
                        projects.Remove(project);
                        projects.Add(newProject);
                    }
                }
            }

            Projects = projects;
        }
Beispiel #6
0
        private void ProjectChanged(object sender, IProjectContextInfo project)
        {
            _nugetProjects = new List <IProjectContextInfo> {
                project
            };

            UpdateInstalledVersion();
        }
        public void SerializeThenDeserialize_WithValidArguments_RoundTrips(IProjectContextInfo expectedResult)
        {
            IProjectContextInfo actualResult = SerializeThenDeserialize(IProjectContextInfoFormatter.Instance, expectedResult);

            Assert.Equal(expectedResult.ProjectId, actualResult.ProjectId);
            Assert.Equal(expectedResult.ProjectStyle, actualResult.ProjectStyle);
            Assert.Equal(expectedResult.ProjectKind, actualResult.ProjectKind);
        }
        public static async ValueTask <string?> GetUniqueNameOrNameAsync(
            this IProjectContextInfo projectContextInfo,
            IServiceBroker serviceBroker,
            CancellationToken cancellationToken)
        {
            IProjectMetadataContextInfo metadata = await GetMetadataAsync(projectContextInfo, serviceBroker, cancellationToken);

            return(metadata.UniqueName ?? metadata.Name);
        }
        private void OnMigrationLinkClick(object sender, RoutedEventArgs e)
        {
            IProjectContextInfo project = _model.Context.Projects.FirstOrDefault();

            Debug.Assert(project != null);

            NuGetUIThreadHelper.JoinableTaskFactory.RunAsync(async() =>
            {
                await _model.Context.UIActionEngine.UpgradeNuGetProjectAsync(_model.UIController, project);
            })
            .PostOnFailure(nameof(PRMigratorBar), nameof(OnMigrationLinkClick));
        }
Beispiel #10
0
        private PackageManagerControl GetProjectPackageManagerControl(string projectUniqueName)
        {
            return(NuGetUIThreadHelper.JoinableTaskFactory.Run(async() =>
            {
                await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

                var uiShell = ServiceLocator.GetGlobalService <SVsUIShell, IVsUIShell>();
                foreach (var windowFrame in VsUtility.GetDocumentWindows(uiShell))
                {
                    object docView;
                    var hr = windowFrame.GetProperty(
                        (int)__VSFPROPID.VSFPROPID_DocView,
                        out docView);
                    if (hr == VSConstants.S_OK &&
                        docView is PackageManagerWindowPane)
                    {
                        var packageManagerWindowPane = (PackageManagerWindowPane)docView;
                        if (packageManagerWindowPane.Model.IsSolution)
                        {
                            // the window is the solution package manager
                            continue;
                        }

                        var projects = packageManagerWindowPane.Model.Context.Projects;
                        if (projects.Count() != 1)
                        {
                            continue;
                        }

                        IProjectContextInfo existingProject = projects.First();
                        IServiceBroker serviceBroker = packageManagerWindowPane.Model.Context.ServiceBroker;
                        IProjectMetadataContextInfo projectMetadata = await existingProject.GetMetadataAsync(
                            serviceBroker,
                            CancellationToken.None);

                        if (string.Equals(projectMetadata.Name, projectUniqueName, StringComparison.OrdinalIgnoreCase))
                        {
                            var packageManagerControl = VsUtility.GetPackageManagerControl(windowFrame);
                            if (packageManagerControl != null)
                            {
                                return packageManagerControl;
                            }
                        }
                    }
                }

                return null;
            }));
        }
        public static async ValueTask <IInstalledAndTransitivePackages> GetInstalledAndTransitivePackagesAsync(
            this IProjectContextInfo projectContextInfo,
            IServiceBroker serviceBroker,
            CancellationToken cancellationToken)
        {
            Assumes.NotNull(projectContextInfo);
            Assumes.NotNull(serviceBroker);

            cancellationToken.ThrowIfCancellationRequested();

            using (INuGetProjectManagerService projectManager = await GetProjectManagerAsync(serviceBroker, cancellationToken))
            {
                return(await projectManager.GetInstalledAndTransitivePackagesAsync(new string[] { projectContextInfo.ProjectId }, cancellationToken));
            }
        }
        public static async ValueTask <IReadOnlyCollection <NuGetFramework> > GetTargetFrameworksAsync(
            this IProjectContextInfo projectContextInfo,
            IServiceBroker serviceBroker,
            CancellationToken cancellationToken)
        {
            Assumes.NotNull(projectContextInfo);
            Assumes.NotNull(serviceBroker);

            cancellationToken.ThrowIfCancellationRequested();

            using (INuGetProjectManagerService projectManager = await GetProjectManagerAsync(serviceBroker, cancellationToken))
            {
                return(await projectManager.GetTargetFrameworksAsync(new string[] { projectContextInfo.ProjectId }, cancellationToken));
            }
        }
        public static async ValueTask <IProjectMetadataContextInfo> GetMetadataAsync(
            this IProjectContextInfo projectContextInfo,
            IServiceBroker serviceBroker,
            CancellationToken cancellationToken)
        {
            Assumes.NotNull(projectContextInfo);
            Assumes.NotNull(serviceBroker);

            cancellationToken.ThrowIfCancellationRequested();

            using (INuGetProjectManagerService projectManager = await GetProjectManagerAsync(serviceBroker, cancellationToken))
            {
                return(await projectManager.GetMetadataAsync(projectContextInfo.ProjectId, cancellationToken));
            }
        }
Beispiel #14
0
        public async Task GetPackagesWithUpdatesAsync_WithHttpCache_RetrievesUpdate()
        {
            // Arrange
            var testPackageIdentity = new PackageCollectionItem("FakePackage", new NuGetVersion("1.0.0"), null);
            var serviceBroker       = new Mock <IServiceBroker>();
            Mock <INuGetProjectManagerService> projectManagerService = SetupProjectManagerService(serviceBroker);

            IProjectContextInfo projectA = SetupProject(projectManagerService, "FakePackage", "1.0.0");

            SetupRemotePackageMetadata("FakePackage", "0.0.1", "1.0.0", "2.0.0");

            var _target = new UpdatePackageFeed(
                serviceBroker.Object,
                new[] { testPackageIdentity },
                _metadataProvider,
                new[] { projectA },
                optionalCachedUpdates: null,
                NullLogger.Instance);

            // Act
            IEnumerable <IPackageSearchMetadata> packages = await _target.GetPackagesWithUpdatesAsync(
                searchText : "fake",
                new SearchFilter(includePrerelease : false),
                CancellationToken.None);

            Assert.Single(packages);
            IPackageSearchMetadata updateCandidate = packages.Single();

            Assert.Equal("2.0.0", updateCandidate.Identity.Version.ToString());

            SetupRemotePackageMetadata("FakePackage", "0.0.1", "1.0.0", "2.0.1", "2.0.0", "1.0.1");

            packages = await _target.GetPackagesWithUpdatesAsync(
                searchText : "fake",
                new SearchFilter(includePrerelease : false),
                CancellationToken.None);

            Assert.Single(packages);
            updateCandidate = packages.Single();
            Assert.Equal("2.0.1", updateCandidate.Identity.Version.ToString());

            IEnumerable <VersionInfo> actualVersions = await updateCandidate.GetVersionsAsync();

            Assert.NotEmpty(actualVersions);
            Assert.Equal(
                new[] { "2.0.1", "2.0.0", "1.0.1", "1.0.0", "0.0.1" },
                actualVersions.Select(v => v.Version.ToString()).ToArray());
        }
Beispiel #15
0
        private async Task <IVsWindowFrame> FindExistingWindowFrameAsync(Project project)
        {
            await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            var uiShell = (IVsUIShell)GetService(typeof(SVsUIShell));

            foreach (var windowFrame in VsUtility.GetDocumentWindows(uiShell))
            {
                object docView;
                var    hr = windowFrame.GetProperty(
                    (int)__VSFPROPID.VSFPROPID_DocView,
                    out docView);
                if (hr == VSConstants.S_OK &&
                    docView is PackageManagerWindowPane)
                {
                    var packageManagerWindowPane = (PackageManagerWindowPane)docView;
                    if (packageManagerWindowPane.Model.IsSolution)
                    {
                        // the window is the solution package manager
                        continue;
                    }

                    var projects = packageManagerWindowPane.Model.Context.Projects;
                    if (projects.Count() != 1)
                    {
                        continue;
                    }

                    IProjectContextInfo existingProject = projects.First();
                    IServiceBroker      serviceBroker   = await ServiceBrokerProvider.Value.GetAsync();

                    IProjectMetadataContextInfo projectMetadata = await existingProject.GetMetadataAsync(
                        serviceBroker,
                        CancellationToken.None);

                    if (string.Equals(projectMetadata.Name, project.Name, StringComparison.OrdinalIgnoreCase))
                    {
                        return(windowFrame);
                    }
                }
            }

            return(null);
        }
Beispiel #16
0
        private void OnProjectEvent(
            EventHandler <IProjectContextInfo>?eventHandler,
            string memberName,
            object sender,
            NuGetProjectEventArgs e)
        {
            if (eventHandler != null)
            {
                NuGetUIThreadHelper.JoinableTaskFactory.RunAsync(async() =>
                {
                    IProjectContextInfo project = await ProjectContextInfo.CreateAsync(
                        e.NuGetProject,
                        CancellationToken.None);

                    eventHandler(sender, project);
                })
                .PostOnFailure(nameof(NuGetSolutionManagerService), memberName);
            }
        }
Beispiel #17
0
        public async Task GetPackagesWithUpdatesAsync_WithMultipleProjects_RetrievesSingleUpdate3()
        {
            // Arrange
            var testPackageIdentity = new PackageCollectionItem("FakePackage", NuGetVersion.Parse("1.0.0"), null);
            var serviceBroker       = new Mock <IServiceBroker>();
            Mock <INuGetProjectManagerService> projectManagerService = SetupProjectManagerService(serviceBroker);

            // Only one project needs to be updated
            // projectA: 2.0.1 => None
            // projectB: 1.0.0 => 1.0.1
            IProjectContextInfo projectA = SetupProject(projectManagerService, "FakePackage", "2.0.1");
            IProjectContextInfo projectB = SetupProject(projectManagerService, "FakePackage", "1.0.0", "[1,2)");

            SetupRemotePackageMetadata("FakePackage", "0.0.1", "1.0.0", "2.0.1", "2.0.0", "1.0.1");

            var _target = new UpdatePackageFeed(
                serviceBroker.Object,
                new[] { testPackageIdentity },
                _metadataProvider,
                new[] { projectA, projectB },
                optionalCachedUpdates: null,
                NullLogger.Instance);

            // Act
            IEnumerable <IPackageSearchMetadata> packages = await _target.GetPackagesWithUpdatesAsync(
                searchText : "fake",
                new SearchFilter(includePrerelease : false),
                CancellationToken.None);

            // Assert
            // Should retrieve a single update item with the lowest version and full list of available versions
            Assert.Single(packages);
            IPackageSearchMetadata updateCandidate = packages.Single();

            Assert.Equal("1.0.1", updateCandidate.Identity.Version.ToString());

            IEnumerable <VersionInfo> actualVersions = await updateCandidate.GetVersionsAsync();

            Assert.NotEmpty(actualVersions);
            Assert.Equal(
                new[] { "2.0.1", "2.0.0", "1.0.1", "1.0.0", "0.0.1" },
                actualVersions.Select(v => v.Version.ToString()).ToArray());
        }
        public static async ValueTask <bool> IsUpgradeableAsync(
            this IProjectContextInfo projectContextInfo,
            IServiceBroker serviceBroker,
            CancellationToken cancellationToken)
        {
            Assumes.NotNull(projectContextInfo);
            Assumes.NotNull(serviceBroker);

            cancellationToken.ThrowIfCancellationRequested();

            using (INuGetProjectUpgraderService? projectUpgrader = await serviceBroker.GetProxyAsync <INuGetProjectUpgraderService>(
                       NuGetServices.ProjectUpgraderService,
                       cancellationToken: cancellationToken))
            {
                Assumes.NotNull(projectUpgrader);

                return(await projectUpgrader.IsProjectUpgradeableAsync(projectContextInfo.ProjectId, cancellationToken));
            }
        }
        public static async ValueTask <(bool, string?)> TryGetInstalledPackageFilePathAsync(
            this IProjectContextInfo projectContextInfo,
            IServiceBroker serviceBroker,
            PackageIdentity packageIdentity,
            CancellationToken cancellationToken)
        {
            Assumes.NotNull(projectContextInfo);
            Assumes.NotNull(serviceBroker);
            Assumes.NotNull(packageIdentity);

            cancellationToken.ThrowIfCancellationRequested();

            using (INuGetProjectManagerService projectManager = await GetProjectManagerAsync(serviceBroker, cancellationToken))
            {
                return(await projectManager.TryGetInstalledPackageFilePathAsync(
                           projectContextInfo.ProjectId,
                           packageIdentity,
                           cancellationToken));
            }
        }
        public static async ValueTask <IReadOnlyCollection <string> > GetPackageFoldersAsync(
            this IProjectContextInfo projectContextInfo,
            IServiceBroker serviceBroker,
            CancellationToken cancellationToken)
        {
            if (projectContextInfo == null)
            {
                throw new ArgumentNullException(nameof(projectContextInfo));
            }
            if (serviceBroker == null)
            {
                throw new ArgumentNullException(nameof(serviceBroker));
            }

            cancellationToken.ThrowIfCancellationRequested();

            using INuGetProjectManagerService projectManager = await GetProjectManagerAsync(serviceBroker, cancellationToken);

            return(await projectManager.GetPackageFoldersAsync(new string[] { projectContextInfo.ProjectId }, cancellationToken));
        }
Beispiel #21
0
        public async Task GetPackagesWithUpdatesAsync_WithMultiplePackages_SortedByPackageId()
        {
            // Arrange
            var testPackageIdentity  = new PackageCollectionItem("FakePackage", NuGetVersion.Parse("1.0.0"), null);
            var testPackageIdentity2 = new PackageCollectionItem("AFakePackage", NuGetVersion.Parse("1.0.0"), null);
            var testPackageIdentity3 = new PackageCollectionItem("ZFakePackage", NuGetVersion.Parse("1.0.0"), null);
            var serviceBroker        = new Mock <IServiceBroker>();
            Mock <INuGetProjectManagerService> projectManagerService = SetupProjectManagerService(serviceBroker);

            IProjectContextInfo projectA = SetupProject(projectManagerService, "FakePackage", "1.0.0");
            IProjectContextInfo projectB = SetupProject(projectManagerService, "ZFakePackage", "1.0.0");
            IProjectContextInfo projectC = SetupProject(projectManagerService, "AFakePackage", "1.0.0");

            SetupRemotePackageMetadata("FakePackage", "0.0.1", "1.0.0", "2.0.1", "2.0.0", "1.0.1");
            SetupRemotePackageMetadata("ZFakePackage", "0.0.1", "1.0.0", "4.0.0");
            SetupRemotePackageMetadata("AFakePackage", "1.0.0", "3.0.1");

            var _target = new UpdatePackageFeed(
                serviceBroker.Object,
                new[] { testPackageIdentity, testPackageIdentity2, testPackageIdentity3 },
                _metadataProvider,
                new[] { projectA, projectB, projectC },
                optionalCachedUpdates: null,
                NullLogger.Instance);

            // Act
            IEnumerable <IPackageSearchMetadata> packages = await _target.GetPackagesWithUpdatesAsync(
                searchText : "fake",
                new SearchFilter(includePrerelease : false),
                CancellationToken.None);

            IEnumerable <string> actualPackageIds = packages.Select(p => p.Identity.Id);

            // Assert
            var expectedPackageIdsSorted = new List <string>()
            {
                "AFakePackage", "FakePackage", "ZFakePackage"
            };

            Assert.Equal(expectedPackageIdsSorted, actualPackageIds); //Equal considers sort order of collections.
        }
Beispiel #22
0
        public static async Task <NuGetProjectUpgradeWindowModel> CreateAsync(
            IServiceBroker serviceBroker,
            IProjectContextInfo project,
            IList <PackageDependencyInfo> packageDependencyInfos,
            CancellationToken cancellationToken)
        {
            Assumes.NotNull(project);
            Assumes.NotNull(packageDependencyInfos);

            cancellationToken.ThrowIfCancellationRequested();

            string projectName = await project.GetUniqueNameOrNameAsync(serviceBroker, CancellationToken.None);

            string title            = string.Format(CultureInfo.CurrentCulture, Resources.WindowTitle_NuGetMigrator, projectName);
            var    notFoundPackages = new HashSet <PackageIdentity>();
            var    hasIssues        = false;

            IEnumerable <NuGetProjectUpgradeDependencyItem> dependencyItems =
                PackageGraphAnalysisUtilities.GetPackagesWithDependants(packageDependencyInfos)
                .Select(e => new NuGetProjectUpgradeDependencyItem(e.Identity, e));

            foreach (NuGetProjectUpgradeDependencyItem dependencyItem in dependencyItems)
            {
                (bool _, string packagePath) = await project.TryGetInstalledPackageFilePathAsync(
                    serviceBroker,
                    dependencyItem.Identity,
                    cancellationToken);

                InitPackageUpgradeIssues(packagePath, dependencyItem, notFoundPackages, ref hasIssues);
            }

            var upgradeDependencyItems = new ObservableCollection <NuGetProjectUpgradeDependencyItem>(dependencyItems);

            return(new NuGetProjectUpgradeWindowModel(
                       title,
                       upgradeDependencyItems,
                       notFoundPackages,
                       hasIssues));
        }
Beispiel #23
0
        private async Task ExecuteUpgradeNuGetProjectCommandAsync(object sender, EventArgs e)
        {
            await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            if (ShouldMEFBeInitialized())
            {
                await InitializeMEFAsync();
            }

            var project = VsMonitorSelection.GetActiveProject();

            if (!await NuGetProjectUpgradeUtility.IsNuGetProjectUpgradeableAsync(null, project))
            {
                MessageHelper.ShowWarningMessage(Resources.ProjectMigrateErrorMessage, Resources.ErrorDialogBoxTitle);
                return;
            }

            string uniqueName = await project.GetCustomUniqueNameAsync();

            // Close NuGet Package Manager if it is open for this project
            IVsWindowFrame windowFrame = await FindExistingWindowFrameAsync(project);

            windowFrame?.CloseFrame((uint)__FRAMECLOSE.FRAMECLOSE_SaveIfDirty);

            IServiceBroker serviceBroker = await ServiceBrokerProvider.Value.GetAsync();

            NuGetProject nuGetProject = await SolutionManager.Value.GetNuGetProjectAsync(uniqueName);

            IProjectContextInfo projectContextInfo = await ProjectContextInfo.CreateAsync(nuGetProject, CancellationToken.None);

            using (INuGetUI uiController = await UIFactory.Value.CreateAsync(serviceBroker, projectContextInfo))
            {
                await uiController.UIContext.UIActionEngine.UpgradeNuGetProjectAsync(uiController, projectContextInfo);

                uiController.UIContext.UserSettingsManager.PersistSettings();
            }
        }
 internal void RaiseProjectUpdated(IProjectContextInfo project)
 {
     ProjectUpdated?.Invoke(this, project);
 }
 public async Task <bool> IsNuGetProjectUpgradeableAsync(IProjectContextInfo project, CancellationToken cancellationToken)
 {
     return(await project.IsUpgradeableAsync(ServiceBroker, cancellationToken));
 }
        private async ValueTask <IVsWindowFrame> CreateToolWindowAsync(WorkspaceVisualNodeBase workspaceVisualNodeBase, IVsHierarchy hier, uint itemId)
        {
            await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            if (!Guid.TryParse(IProjectContextInfoUtility.GetProjectGuidStringFromVslsQueryString(workspaceVisualNodeBase.VSSelectionMoniker), out Guid projectGuid))
            {
                throw new InvalidOperationException();
            }

            IVsWindowFrame windowFrame = null;

            var uiShell = await _asyncServiceProvider.GetServiceAsync <SVsUIShell, IVsUIShell>();

            Assumes.Present(uiShell);

            uint       toolWindowId;
            bool       foundToolWindowId = _projectGuidToToolWindowId.TryGetValue(projectGuid.ToString(), out toolWindowId);
            const uint FTW_none          = 0;

            if (foundToolWindowId)
            {
                ErrorHandler.ThrowOnFailure(
                    uiShell.FindToolWindowEx(
                        FTW_none,                                  //grfFTW - badly-documented enum value.
                        typeof(PackageManagerToolWindowPane).GUID, // rguidPersistenceSlot
                        toolWindowId,                              // dwToolWindowId
                        out windowFrame));

                if (windowFrame != null)
                {
                    ((IVsWindowFrame2)windowFrame).ActivateOwnerDockedWindow();
                }
                else
                {
                    _projectGuidToToolWindowId.Remove(projectGuid.ToString());
                }
            }

            if (windowFrame == null)
            {
                IServiceBroker serviceBroker = await ServiceBrokerProvider.Value.GetAsync();

                IProjectContextInfo projectContextInfo = await IProjectContextInfoUtility.CreateAsync(serviceBroker, projectGuid.ToString(), CancellationToken.None);

                INuGetUI uiController = await UIFactory.Value.CreateAsync(serviceBroker, projectContextInfo);

                // This model takes ownership of --- and Dispose() responsibility for --- the INuGetUI instance.
                var model   = new PackageManagerModel(uiController, isSolution: false, editorFactoryGuid: GuidList.NuGetEditorType);
                var control = await PackageManagerControl.CreateAsync(model, OutputConsoleLogger.Value);

                var caption = string.Format(CultureInfo.CurrentCulture, Resx.Label_NuGetWindowCaption, Path.GetFileNameWithoutExtension(workspaceVisualNodeBase.NodeMoniker));

                int[] pfDefaultPosition = null;

                var windowPane = new PackageManagerToolWindowPane(control, projectGuid.ToString());
                ErrorHandler.ThrowOnFailure(
                    uiShell.CreateToolWindow(
                        (uint)__VSCREATETOOLWIN.CTW_fInitNew,
                        ++_maxToolWindowId,                        // dwToolWindowId
                        windowPane,                                // ToolWindowPane
                        Guid.Empty,                                // rclsidTool = GUID_NULL
                        typeof(PackageManagerToolWindowPane).GUID, // rguidPersistenceSlot
                        Guid.Empty,                                // reserved - do not use - GUID_NULL
                        null,                                      // IServiceProvider
                        caption,
                        pfDefaultPosition,
                        out windowFrame));
                _projectGuidToToolWindowId.Add(projectGuid.ToString(), _maxToolWindowId);
                windowPane.Closed += WindowPane_Closed;

                if (windowFrame != null)
                {
                    WindowFrameHelper.AddF1HelpKeyword(windowFrame, keywordValue: F1KeywordValuePmUI);
                    WindowFrameHelper.DisableWindowAutoReopen(windowFrame);
                    WindowFrameHelper.DockToolWindow(windowFrame);
                }
            }

            return(windowFrame);
        }
Beispiel #27
0
        public async Task UpgradeNuGetProjectAsync(INuGetUI uiService, IProjectContextInfo project)
        {
            Assumes.NotNull(uiService);
            Assumes.NotNull(project);

            INuGetUIContext context = uiService.UIContext;
            // Restore the project before proceeding
            string solutionDirectory = await context.SolutionManagerService.GetSolutionDirectoryAsync(CancellationToken.None);

            await context.PackageRestoreManager.RestoreMissingPackagesInSolutionAsync(
                solutionDirectory,
                uiService.ProjectContext,
                new LoggerAdapter(uiService.ProjectContext),
                CancellationToken.None);

            IServiceBroker serviceBroker = context.ServiceBroker;
            NuGetProjectUpgradeWindowModel upgradeInformationWindowModel;

            using (INuGetProjectManagerService projectManager = await serviceBroker.GetProxyAsync <INuGetProjectManagerService>(
                       NuGetServices.ProjectManagerService,
                       CancellationToken.None))
            {
                Assumes.NotNull(projectManager);

                IReadOnlyCollection <PackageDependencyInfo> packagesDependencyInfo = await projectManager.GetInstalledPackagesDependencyInfoAsync(
                    project.ProjectId,
                    includeUnresolved : true,
                    CancellationToken.None);

                upgradeInformationWindowModel = await NuGetProjectUpgradeWindowModel.CreateAsync(
                    serviceBroker,
                    project,
                    packagesDependencyInfo.ToList(),
                    CancellationToken.None);
            }

            var result = uiService.ShowNuGetUpgradeWindow(upgradeInformationWindowModel);

            if (!result)
            {
                // raise upgrade telemetry event with Cancelled status
                var packagesCount = upgradeInformationWindowModel.UpgradeDependencyItems.Count;

                var upgradeTelemetryEvent       = new UpgradeInformationTelemetryEvent();
                IEnumerable <string> projectIds = await ProjectUtility.GetSortedProjectIdsAsync(
                    uiService.UIContext.ServiceBroker,
                    uiService.Projects,
                    CancellationToken.None);

                upgradeTelemetryEvent.SetResult(
                    projectIds,
                    NuGetOperationStatus.Cancelled,
                    packagesCount);

                TelemetryActivity.EmitTelemetryEvent(upgradeTelemetryEvent);

                return;
            }

            var    progressDialogData = new ProgressDialogData(Resources.NuGetUpgrade_WaitMessage);
            string projectName        = await project.GetUniqueNameOrNameAsync(
                uiService.UIContext.ServiceBroker,
                CancellationToken.None);

            string backupPath;

            var windowTitle = string.Format(
                CultureInfo.CurrentCulture,
                Resources.WindowTitle_NuGetMigrator,
                projectName);

            using (IModalProgressDialogSession progressDialogSession = await context.StartModalProgressDialogAsync(windowTitle, progressDialogData, uiService))
            {
                backupPath = await PackagesConfigToPackageReferenceMigrator.DoUpgradeAsync(
                    context,
                    uiService,
                    project,
                    upgradeInformationWindowModel.UpgradeDependencyItems,
                    upgradeInformationWindowModel.NotFoundPackages,
                    progressDialogSession.Progress,
                    progressDialogSession.UserCancellationToken);
            }

            if (!string.IsNullOrEmpty(backupPath))
            {
                string htmlLogFile = GenerateUpgradeReport(projectName, backupPath, upgradeInformationWindowModel);

                Process process = null;
                try
                {
                    process = Process.Start(htmlLogFile);
                }
                catch { }
            }
        }
 private void OnAfterProjectRenamed(object sender, IProjectContextInfo e)
 {
     AfterProjectRenamed?.Invoke(this, e);
 }
 private void OnProjectAdded(object sender, IProjectContextInfo e)
 {
     ProjectAdded?.Invoke(this, e);
 }
        internal static async Task <string> DoUpgradeAsync(
            INuGetUIContext context,
            INuGetUI uiService,
            IProjectContextInfo project,
            IEnumerable <NuGetProjectUpgradeDependencyItem> upgradeDependencyItems,
            IEnumerable <PackageIdentity> notFoundPackages,
            IProgress <ProgressDialogData> progress,
            CancellationToken token)
        {
            var startTime     = DateTimeOffset.Now;
            var packagesCount = 0;
            var status        = NuGetOperationStatus.Succeeded;

            var upgradeInformationTelemetryEvent = new UpgradeInformationTelemetryEvent();

            using (var telemetry = TelemetryActivity.Create(upgradeInformationTelemetryEvent))
            {
                try
                {
                    // 0. Fail if any package was not found
                    if (notFoundPackages.Any())
                    {
                        status = NuGetOperationStatus.Failed;
                        var notFoundPackageIds = string.Join(",", notFoundPackages.Select(t => t.Id));
                        uiService.ProjectContext.Log(MessageLevel.Error, string.Format(CultureInfo.CurrentCulture, Resources.Migrator_PackageNotFound, notFoundPackageIds));
                        return(null);
                    }

                    IServiceBroker serviceBroker = await BrokeredServicesUtilities.GetRemoteServiceBrokerAsync();

                    using (INuGetProjectUpgraderService projectUpgrader = await serviceBroker.GetProxyAsync <INuGetProjectUpgraderService>(
                               NuGetServices.ProjectUpgraderService,
                               token))
                    {
                        Assumes.NotNull(projectUpgrader);

                        string backupPath;

                        // 1. Backup files (csproj and packages.config) that will change
                        try
                        {
                            backupPath = await projectUpgrader.BackupProjectAsync(project.ProjectId, token);
                        }
                        catch (Exception ex)
                        {
                            status = NuGetOperationStatus.Failed;

                            uiService.ShowError(ex);
                            uiService.ProjectContext.Log(
                                MessageLevel.Info,
                                string.Format(CultureInfo.CurrentCulture, Resources.Upgrader_BackupFailed));

                            return(null);
                        }

                        // 2. Uninstall all packages currently in packages.config
                        var progressData = new ProgressDialogData(Resources.NuGetUpgrade_WaitMessage, Resources.NuGetUpgrade_Progress_Uninstalling);
                        progress.Report(progressData);

                        // Don't uninstall packages we couldn't find - that will just fail
                        PackageIdentity[] packagesToUninstall = upgradeDependencyItems.Select(d => d.Identity)
                                                                .Where(p => !notFoundPackages.Contains(p))
                                                                .ToArray();

                        try
                        {
                            await projectUpgrader.UninstallPackagesAsync(project.ProjectId, packagesToUninstall, token);
                        }
                        catch (Exception ex)
                        {
                            status = NuGetOperationStatus.Failed;
                            // log error message
                            uiService.ShowError(ex);
                            uiService.ProjectContext.Log(MessageLevel.Info,
                                                         string.Format(CultureInfo.CurrentCulture, Resources.Upgrade_UninstallFailed));

                            return(null);
                        }

                        // Reload the project, and get a reference to the reloaded project
                        await projectUpgrader.SaveProjectAsync(project.ProjectId, token);

                        IProjectContextInfo upgradedProject = await projectUpgrader.UpgradeProjectToPackageReferenceAsync(
                            project.ProjectId,
                            token);

                        // Ensure we use the updated project for installing, and don't display preview or license acceptance windows.
                        context.Projects = new[] { upgradedProject };
                        var nuGetUI = (NuGetUI)uiService;
                        nuGetUI.Projects             = new[] { upgradedProject };
                        nuGetUI.DisplayPreviewWindow = false;

                        // 4. Install the requested packages
                        var ideExecutionContext = uiService.ProjectContext.ExecutionContext as IDEExecutionContext;
                        if (ideExecutionContext != null)
                        {
                            await ideExecutionContext.SaveExpandedNodeStates(context.SolutionManager);
                        }

                        progressData = new ProgressDialogData(Resources.NuGetUpgrade_WaitMessage, Resources.NuGetUpgrade_Progress_Installing);
                        progress.Report(progressData);

                        List <PackageIdentity> packagesToInstall = GetPackagesToInstall(upgradeDependencyItems).ToList();
                        packagesCount = packagesToInstall.Count;

                        try
                        {
                            await projectUpgrader.InstallPackagesAsync(
                                project.ProjectId,
                                packagesToInstall,
                                token);

                            if (ideExecutionContext != null)
                            {
                                await ideExecutionContext.CollapseAllNodes(context.SolutionManager);
                            }

                            return(backupPath);
                        }
                        catch (Exception ex)
                        {
                            status = NuGetOperationStatus.Failed;

                            uiService.ShowError(ex);
                            uiService.ProjectContext.Log(MessageLevel.Info,
                                                         string.Format(CultureInfo.CurrentCulture, Resources.Upgrade_InstallFailed, backupPath));
                            uiService.ProjectContext.Log(MessageLevel.Info,
                                                         string.Format(CultureInfo.CurrentCulture, Resources.Upgrade_RevertSteps, "https://aka.ms/nugetupgraderevertv1"));

                            return(null);
                        }
                    }
                }
                catch (Exception ex)
                {
                    status = NuGetOperationStatus.Failed;
                    uiService.ShowError(ex);
                    return(null);
                }
                finally
                {
                    IEnumerable <string> projectIds = await ProjectUtility.GetSortedProjectIdsAsync(uiService.Projects, token);

                    upgradeInformationTelemetryEvent.SetResult(projectIds, status, packagesCount);
                }
            }
        }