protected NuGetPowerShellBaseCommand() { _sourceRepositoryProvider = ServiceLocator.GetInstance <ISourceRepositoryProvider>(); ConfigSettings = ServiceLocator.GetInstance <Configuration.ISettings>(); VsSolutionManager = ServiceLocator.GetInstance <IVsSolutionManager>(); DTE = ServiceLocator.GetInstance <DTE>(); SourceControlManagerProvider = ServiceLocator.GetInstance <ISourceControlManagerProvider>(); _commonOperations = ServiceLocator.GetInstance <ICommonOperations>(); PackageRestoreManager = ServiceLocator.GetInstance <IPackageRestoreManager>(); _deleteOnRestartManager = ServiceLocator.GetInstance <IDeleteOnRestartManager>(); if (_commonOperations != null) { ExecutionContext = new IDEExecutionContext(_commonOperations); } ActivityCorrelationId.StartNew(); }
public async Task LoadNextAsync(IProgress <IItemLoaderState> progress, CancellationToken cancellationToken) { ActivityCorrelationId.StartNew(); cancellationToken.ThrowIfCancellationRequested(); await UpdateStateAndReportAsync( new SearchResultContextInfo(Array.Empty <PackageSearchMetadataContextInfo>(), ImmutableDictionary <string, LoadingStatus> .Empty, hasMoreItems : _state.Results?.HasMoreItems ?? false), progress, cancellationToken); SearchResultContextInfo searchResult = await SearchAsync(cancellationToken); cancellationToken.ThrowIfCancellationRequested(); await UpdateStateAndReportAsync(searchResult, progress, cancellationToken); }
public async Task LoadNextAsync(IProgress <IItemLoaderState> progress, CancellationToken cancellationToken) { ActivityCorrelationId.StartNew(); cancellationToken.ThrowIfCancellationRequested(); NuGetEventTrigger.Instance.TriggerEvent(NuGetEvent.PackageLoadBegin); var nextToken = _state.Results?.NextToken; var cleanState = SearchResult.Empty <IPackageSearchMetadata>(); cleanState.NextToken = nextToken; await UpdateStateAndReportAsync(cleanState, progress, cancellationToken); var searchResult = await SearchAsync(nextToken, cancellationToken); cancellationToken.ThrowIfCancellationRequested(); await UpdateStateAndReportAsync(searchResult, progress, cancellationToken); NuGetEventTrigger.Instance.TriggerEvent(NuGetEvent.PackageLoadEnd); }
public async Task <int> GetTotalCountAsync(int maxCount, CancellationToken cancellationToken) { // Go off the UI thread to perform non-UI operations await TaskScheduler.Default; ActivityCorrelationId.StartNew(); int totalCount = 0; ContinuationToken nextToken = null; do { var searchResult = await SearchAsync(nextToken, cancellationToken); while (searchResult.RefreshToken != null) { searchResult = await _packageFeed.RefreshSearchAsync(searchResult.RefreshToken, cancellationToken); } totalCount += searchResult.Items?.Count() ?? 0; nextToken = searchResult.NextToken; } while (nextToken != null && totalCount <= maxCount); return(totalCount); }
/// <summary> /// The static method which takes in all the possible parameters /// </summary> /// <returns>Returns true if at least one of the packages needed to be restored and got restored</returns> /// <remarks> /// Best use case is 'nuget.exe restore .sln' where there is no project loaded and there is no SolutionManager. /// The references are obtained by parsing of solution file and by using PackagesConfigReader. In this case, /// you don't construct an object of PackageRestoreManager, /// but just the NuGetPackageManager using constructor that does not need the SolutionManager, and, optionally /// register to events and/or specify the source repositories /// </remarks> public static async Task <PackageRestoreResult> RestoreMissingPackagesAsync( PackageRestoreContext packageRestoreContext, INuGetProjectContext nuGetProjectContext, PackageDownloadContext downloadContext) { if (packageRestoreContext == null) { throw new ArgumentNullException(nameof(packageRestoreContext)); } if (nuGetProjectContext == null) { throw new ArgumentNullException(nameof(nuGetProjectContext)); } ActivityCorrelationId.StartNew(); var missingPackages = packageRestoreContext.Packages.Where(p => p.IsMissing).ToList(); if (!missingPackages.Any()) { return(new PackageRestoreResult(true, Enumerable.Empty <PackageIdentity>())); } // It is possible that the dictionary passed in may not have used the PackageReferenceComparer. // So, just to be sure, create a hashset with the keys from the dictionary using the PackageReferenceComparer // Now, we are guaranteed to not restore the same package more than once var hashSetOfMissingPackageReferences = new HashSet <PackageReference>(missingPackages.Select(p => p.PackageReference), new PackageReferenceComparer()); // Before starting to restore package, set the nuGetProjectContext such that satellite files are not copied yet // Satellite files will be copied as a post operation. This helps restore packages in parallel // and not have to determine if the package is a satellite package beforehand if (nuGetProjectContext.PackageExtractionContext == null) { var signedPackageVerifier = new PackageSignatureVerifier( SignatureVerificationProviderFactory.GetSignatureVerificationProviders(), SignedPackageVerifierSettings.Default); nuGetProjectContext.PackageExtractionContext = new PackageExtractionContext( PackageSaveMode.Defaultv2, PackageExtractionBehavior.XmlDocFileSaveMode, new LoggerAdapter(nuGetProjectContext), signedPackageVerifier); } nuGetProjectContext.PackageExtractionContext.CopySatelliteFiles = false; packageRestoreContext.Token.ThrowIfCancellationRequested(); var attemptedPackages = await ThrottledPackageRestoreAsync( hashSetOfMissingPackageReferences, packageRestoreContext, nuGetProjectContext, downloadContext); packageRestoreContext.Token.ThrowIfCancellationRequested(); await ThrottledCopySatelliteFilesAsync( hashSetOfMissingPackageReferences, packageRestoreContext, nuGetProjectContext); return(new PackageRestoreResult( attemptedPackages.All(p => p.Restored), attemptedPackages.Select(p => p.Package.PackageIdentity).ToList())); }
/// <summary> /// Fetch, if not already downloaded, and install the package represented by /// (<paramref name="packageId"/>, <paramref name="version"/>). /// </summary> /// <remarks>It is safe to call it concurrently be cause we operations are done using the FileLock.</remarks> /// <param name="packageId">Name of package to install.</param> /// <param name="version">Version of package to install.</param> public async Task <NugetLocalPackage> InstallPackage(string packageId, PackageVersion version, IEnumerable <string> targetFrameworks, ProgressReport progress) { using (GetLocalRepositoryLock()) { currentProgressReport = progress; try { var identity = new PackageIdentity(packageId, version.ToNuGetVersion()); var resolutionContext = new ResolutionContext( DependencyBehavior.Lowest, true, true, VersionConstraints.None); var repositories = PackageSources.Select(sourceRepositoryProvider.CreateRepository).ToArray(); var projectContext = new EmptyNuGetProjectContext() { ActionType = NuGetActionType.Install, PackageExtractionContext = new PackageExtractionContext(PackageSaveMode.Defaultv3, XmlDocFileSaveMode.Skip, null, NativeLogger), }; ActivityCorrelationId.StartNew(); { var installPath = SettingsUtility.GetGlobalPackagesFolder(settings); // In case it's a package without any TFM (i.e. Visual Studio plugin), we still need to specify one if (!targetFrameworks.Any()) { targetFrameworks = new string[] { "net6.0" } } ; // Old version expects to be installed in GamePackages if (packageId == "Xenko" && version < new PackageVersion(3, 0, 0, 0) && oldRootDirectory != null) { installPath = oldRootDirectory; } var projectPath = Path.Combine("StrideLauncher.json"); var spec = new PackageSpec() { Name = Path.GetFileNameWithoutExtension(projectPath), // make sure this package never collides with a dependency FilePath = projectPath, Dependencies = new List <LibraryDependency>() { new LibraryDependency { LibraryRange = new LibraryRange(packageId, new VersionRange(version.ToNuGetVersion()), LibraryDependencyTarget.Package), } }, RestoreMetadata = new ProjectRestoreMetadata { ProjectPath = projectPath, ProjectName = Path.GetFileNameWithoutExtension(projectPath), ProjectStyle = ProjectStyle.PackageReference, ProjectUniqueName = projectPath, OutputPath = Path.Combine(Path.GetTempPath(), $"StrideLauncher-{packageId}-{version.ToString()}"), OriginalTargetFrameworks = targetFrameworks.ToList(), ConfigFilePaths = settings.GetConfigFilePaths(), PackagesPath = installPath, Sources = SettingsUtility.GetEnabledSources(settings).ToList(), FallbackFolders = SettingsUtility.GetFallbackPackageFolders(settings).ToList() }, }; foreach (var targetFramework in targetFrameworks) { spec.TargetFrameworks.Add(new TargetFrameworkInformation { FrameworkName = NuGetFramework.Parse(targetFramework) }); } using (var context = new SourceCacheContext { MaxAge = DateTimeOffset.UtcNow }) { context.IgnoreFailedSources = true; var dependencyGraphSpec = new DependencyGraphSpec(); dependencyGraphSpec.AddProject(spec); dependencyGraphSpec.AddRestore(spec.RestoreMetadata.ProjectUniqueName); IPreLoadedRestoreRequestProvider requestProvider = new DependencyGraphSpecRequestProvider(new RestoreCommandProvidersCache(), dependencyGraphSpec); var restoreArgs = new RestoreArgs { AllowNoOp = true, CacheContext = context, CachingSourceProvider = new CachingSourceProvider(new PackageSourceProvider(settings)), Log = NativeLogger, }; // Create requests from the arguments var requests = requestProvider.CreateRequests(restoreArgs).Result; foreach (var request in requests) { // Limit concurrency to avoid timeout request.Request.MaxDegreeOfConcurrency = 4; var command = new RestoreCommand(request.Request); // Act var result = await command.ExecuteAsync(); if (!result.Success) { throw new InvalidOperationException($"Could not restore package {packageId}"); } foreach (var install in result.RestoreGraphs.Last().Install) { var package = result.LockFile.Libraries.FirstOrDefault(x => x.Name == install.Library.Name && x.Version == install.Library.Version); if (package != null) { var packagePath = Path.Combine(installPath, package.Path); OnPackageInstalled(this, new PackageOperationEventArgs(new PackageName(install.Library.Name, install.Library.Version.ToPackageVersion()), packagePath)); } } } } if (packageId == "Xenko" && version < new PackageVersion(3, 0, 0, 0)) { UpdateTargetsHelper(); } } // Load the recently installed package var installedPackages = GetPackagesInstalled(new[] { packageId }); return(installedPackages.FirstOrDefault(p => p.Version == version)); } finally { currentProgressReport = null; } } }
private string ChangeActivityCorrelationId() { ActivityCorrelationId.StartNew(); return(ActivityCorrelationId.Current); }
/// <summary> /// Fetch, if not already downloaded, and install the package represented by /// (<paramref name="packageId"/>, <paramref name="version"/>). /// </summary> /// <remarks>It is safe to call it concurrently be cause we operations are done using the FileLock.</remarks> /// <param name="packageId">Name of package to install.</param> /// <param name="version">Version of package to install.</param> public async Task <NugetLocalPackage> InstallPackage(string packageId, PackageVersion version, ProgressReport progress) { using (GetLocalRepositoryLock()) { currentProgressReport = progress; try { var identity = new PackageIdentity(packageId, version.ToNuGetVersion()); var resolutionContext = new ResolutionContext( DependencyBehavior.Lowest, true, true, VersionConstraints.None); var repositories = PackageSources.Select(sourceRepositoryProvider.CreateRepository).ToArray(); var projectContext = new EmptyNuGetProjectContext() { ActionType = NuGetActionType.Install, PackageExtractionContext = new PackageExtractionContext(PackageSaveMode.Defaultv3, XmlDocFileSaveMode.Skip, null, NativeLogger), }; ActivityCorrelationId.StartNew(); { var installPath = SettingsUtility.GetGlobalPackagesFolder(settings); // Old version expects to be installed in GamePackages if (packageId == "Xenko" && version < new PackageVersion(3, 0, 0, 0) && oldRootDirectory != null) { installPath = oldRootDirectory; } var specPath = Path.Combine("TestProject", "project.json"); var spec = new PackageSpec() { Name = "TestProject", // make sure this package never collides with a dependency FilePath = specPath, Dependencies = new List <LibraryDependency>() { new LibraryDependency { LibraryRange = new LibraryRange(packageId, new VersionRange(version.ToNuGetVersion()), LibraryDependencyTarget.Package), } }, TargetFrameworks = { new TargetFrameworkInformation { FrameworkName = NuGetFramework.Parse("net472"), } }, }; using (var context = new SourceCacheContext()) { context.IgnoreFailedSources = true; var provider = RestoreCommandProviders.Create(installPath, new List <string>(), sourceRepositoryProvider.GetRepositories(), context, new LocalPackageFileCache(), NativeLogger); var request = new RestoreRequest(spec, provider, context, null, NativeLogger) { //RequestedRuntimes = { "win7-d3d11" }, ProjectStyle = ProjectStyle.DotnetCliTool, }; var command = new RestoreCommand(request); // Act var result = await command.ExecuteAsync(); if (!result.Success) { throw new InvalidOperationException($"Could not restore package {packageId}"); } foreach (var install in result.RestoreGraphs.Last().Install) { var package = result.LockFile.Libraries.FirstOrDefault(x => x.Name == install.Library.Name && x.Version == install.Library.Version); if (package != null) { var packagePath = Path.Combine(installPath, package.Path); OnPackageInstalled(this, new PackageOperationEventArgs(new PackageName(install.Library.Name, install.Library.Version.ToPackageVersion()), packagePath)); } } } if (packageId == "Xenko" && version < new PackageVersion(3, 0, 0, 0)) { UpdateTargetsHelper(); } } // Load the recently installed package var installedPackages = GetPackagesInstalled(new[] { packageId }); return(installedPackages.FirstOrDefault(p => p.Version == version)); } finally { currentProgressReport = null; } } }
/// <summary> /// Fetch, if not already downloaded, and install the package represented by /// (<paramref name="packageId"/>, <paramref name="version"/>). /// </summary> /// <remarks>It is safe to call it concurrently be cause we operations are done using the FileLock.</remarks> /// <param name="packageId">Name of package to install.</param> /// <param name="version">Version of package to install.</param> public async Task <NugetLocalPackage> InstallPackage(string packageId, PackageVersion version, ProgressReport progress) { // Xenko 2.x still installs in GamePackages var currentManager = IsPackageV2(packageId, version) ? managerV2 : manager; using (GetLocalRepositoryLock()) { currentProgressReport = progress; try { var identity = new PackageIdentity(packageId, version.ToNuGetVersion()); var resolutionContext = new ResolutionContext( DependencyBehavior.Lowest, true, true, VersionConstraints.None); var repositories = PackageSources.Select(sourceRepositoryProvider.CreateRepository).ToArray(); var projectContext = new EmptyNuGetProjectContext() { ActionType = NuGetActionType.Install, PackageExtractionContext = new PackageExtractionContext(NativeLogger), }; ActivityCorrelationId.StartNew(); { // Equivalent to: // await manager.InstallPackageAsync(manager.PackagesFolderNuGetProject, // identity, resolutionContext, projectContext, repositories, // Array.Empty<SourceRepository>(), // This is a list of secondary source respositories, probably empty // CancellationToken.None); using (var sourceCacheContext = new SourceCacheContext()) { var nuGetProject = currentManager.PackagesFolderNuGetProject; var packageIdentity = identity; var nuGetProjectContext = projectContext; var primarySources = repositories; var secondarySources = Array.Empty <SourceRepository>(); var token = CancellationToken.None; var downloadContext = new PackageDownloadContext(sourceCacheContext); // Step-1 : Call PreviewInstallPackageAsync to get all the nuGetProjectActions var nuGetProjectActions = await currentManager.PreviewInstallPackageAsync(nuGetProject, packageIdentity, resolutionContext, nuGetProjectContext, primarySources, secondarySources, token); // Notify that installations started. foreach (var operation in nuGetProjectActions) { if (operation.NuGetProjectActionType == NuGetProjectActionType.Install) { var installPath = GetInstalledPath(operation.PackageIdentity.Id, operation.PackageIdentity.Version.ToPackageVersion()); OnPackageInstalling(this, new PackageOperationEventArgs(new PackageName(operation.PackageIdentity.Id, operation.PackageIdentity.Version.ToPackageVersion()), installPath)); } } NuGetPackageManager.SetDirectInstall(packageIdentity, nuGetProjectContext); // Step-2 : Execute all the nuGetProjectActions if (IsPackageV2(packageId, version)) { await currentManager.ExecuteNuGetProjectActionsAsync( nuGetProject, nuGetProjectActions, nuGetProjectContext, downloadContext, token); } else { // Download and install package in the global cache (can't use NuGetPackageManager anymore since it is designed for V2) foreach (var operation in nuGetProjectActions) { if (operation.NuGetProjectActionType == NuGetProjectActionType.Install) { using (var downloadResult = await PackageDownloader.GetDownloadResourceResultAsync(primarySources, packageIdentity, downloadContext, InstallPath, NativeLogger, token)) { if (downloadResult.Status != DownloadResourceResultStatus.Available) { throw new InvalidOperationException($"Could not download package {packageIdentity}"); } using (var installResult = await GlobalPackagesFolderUtility.AddPackageAsync(packageIdentity, downloadResult.PackageStream, InstallPath, NativeLogger, token)) { if (installResult.Status != DownloadResourceResultStatus.Available) { throw new InvalidOperationException($"Could not install package {packageIdentity}"); } } } } } } NuGetPackageManager.ClearDirectInstall(nuGetProjectContext); // Notify that installations completed. foreach (var operation in nuGetProjectActions) { if (operation.NuGetProjectActionType == NuGetProjectActionType.Install) { var installPath = GetInstalledPath(operation.PackageIdentity.Id, operation.PackageIdentity.Version.ToPackageVersion()); OnPackageInstalled(this, new PackageOperationEventArgs(new PackageName(operation.PackageIdentity.Id, operation.PackageIdentity.Version.ToPackageVersion()), installPath)); } } } } // Load the recently installed package var installedPackages = GetPackagesInstalled(new[] { packageId }); return(installedPackages.FirstOrDefault(p => p.Version == version)); } finally { currentProgressReport = null; } } }