private (string, NetSdkManagedInstaller, INuGetPackageDownloader) GetTestInstaller([CallerMemberName] string identifier = "", bool failingInstaller = false)
        {
            var testDirectory = _testAssetsManager.CreateTestDirectory(identifier).Path;
            var dotnetRoot    = Path.Combine(testDirectory, "dotnet");
            INuGetPackageDownloader nugetInstaller = failingInstaller ? new FailingNuGetPackageDownloader(testDirectory) :  new MockNuGetPackageDownloader(dotnetRoot);
            var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), new string[] { dotnetRoot });
            var sdkFeatureBand   = new SdkFeatureBand("6.0.100");

            return(dotnetRoot, new NetSdkManagedInstaller(_reporter, sdkFeatureBand, workloadResolver, nugetInstaller, dotnetRoot), nugetInstaller);
        }
示例#2
0
        public WorkloadUpdateCommand(
            ParseResult parseResult,
            IReporter reporter = null,
            IWorkloadResolver workloadResolver               = null,
            IInstaller workloadInstaller                     = null,
            INuGetPackageDownloader nugetPackageDownloader   = null,
            IWorkloadManifestUpdater workloadManifestUpdater = null,
            string dotnetDir      = null,
            string userProfileDir = null,
            string tempDirPath    = null,
            string version        = null)
            : base(parseResult)
        {
            _printDownloadLinkOnly =
                parseResult.GetValueForOption(WorkloadUpdateCommandParser.PrintDownloadLinkOnlyOption);
            _fromCacheOption       = parseResult.GetValueForOption(WorkloadUpdateCommandParser.FromCacheOption);
            _reporter              = reporter ?? Reporter.Output;
            _includePreviews       = parseResult.GetValueForOption(WorkloadUpdateCommandParser.IncludePreviewsOption);
            _fromPreviousSdk       = parseResult.GetValueForOption(WorkloadUpdateCommandParser.FromPreviousSdkOption);
            _adManifestOnlyOption  = parseResult.GetValueForOption(WorkloadUpdateCommandParser.AdManifestOnlyOption);
            _downloadToCacheOption = parseResult.GetValueForOption(WorkloadUpdateCommandParser.DownloadToCacheOption);
            _verbosity             = parseResult.GetValueForOption(WorkloadUpdateCommandParser.VerbosityOption);
            _dotnetPath            = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            _userProfileDir        = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath;
            _sdkVersion            = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.GetValueForOption(WorkloadUpdateCommandParser.VersionOption), version, _dotnetPath, _userProfileDir);
            _tempDirPath           = tempDirPath ?? (string.IsNullOrWhiteSpace(parseResult.GetValueForOption(WorkloadUpdateCommandParser.TempDirOption)) ?
                                                     Path.GetTempPath() :
                                                     parseResult.GetValueForOption(WorkloadUpdateCommandParser.TempDirOption));
            _printRollbackDefinitionOnly = parseResult.GetValueForOption(WorkloadUpdateCommandParser.PrintRollbackOption);
            _fromRollbackDefinition      = parseResult.GetValueForOption(WorkloadUpdateCommandParser.FromRollbackFileOption);

            var configOption = parseResult.GetValueForOption(WorkloadUpdateCommandParser.ConfigOption);
            var sourceOption = parseResult.GetValueForOption <string[]>(WorkloadUpdateCommandParser.SourceOption);

            _packageSourceLocation = string.IsNullOrEmpty(configOption) && (sourceOption == null || !sourceOption.Any()) ? null :
                                     new PackageSourceLocation(string.IsNullOrEmpty(configOption) ? null : new FilePath(configOption), sourceFeedOverrides:  sourceOption);

            var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString(), _userProfileDir);

            _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, _sdkVersion.ToString(), _userProfileDir);
            var sdkFeatureBand      = new SdkFeatureBand(_sdkVersion);
            var restoreActionConfig = _parseResult.ToRestoreActionConfig();

            _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(_reporter,
                                                                                                    sdkFeatureBand, _workloadResolver, _verbosity, _userProfileDir, nugetPackageDownloader,
                                                                                                    dotnetDir, _tempDirPath, packageSourceLocation: _packageSourceLocation, restoreActionConfig,
                                                                                                    elevationRequired: !_printDownloadLinkOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption));
            var tempPackagesDir = new DirectoryPath(Path.Combine(_tempDirPath, "dotnet-sdk-advertising-temp"));

            _nugetPackageDownloader = nugetPackageDownloader ?? new NuGetPackageDownloader(tempPackagesDir,
                                                                                           filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger()),
                                                                                           _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger(), restoreActionConfig: restoreActionConfig);
            _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadResolver, _nugetPackageDownloader, _userProfileDir, _tempDirPath,
                                                                                              _workloadInstaller.GetWorkloadInstallationRecordRepository(), _packageSourceLocation);
        }
示例#3
0
            public IEnumerable <WorkloadId> GetInstalledWorkloads(SdkFeatureBand sdkFeatureBand)
            {
                SdkFeatureBand featureBand = new SdkFeatureBand(new ReleaseVersion(6, 0, 100));

                if (sdkFeatureBand.Equals(featureBand))
                {
                    return(new[] { new WorkloadId("xamarin-android") });
                }

                throw new Exception($"Should not pass other feature band {sdkFeatureBand}");
            }
示例#4
0
        private (string, FileBasedInstaller, INuGetPackageDownloader) GetTestInstaller([CallerMemberName] string testName          = "", bool failingInstaller = false, string identifier = "", bool manifestDownload = false,
                                                                                       PackageSourceLocation packageSourceLocation = null)
        {
            var testDirectory = _testAssetsManager.CreateTestDirectory(testName, identifier: identifier).Path;
            var dotnetRoot    = Path.Combine(testDirectory, "dotnet");
            INuGetPackageDownloader nugetInstaller = failingInstaller ? new FailingNuGetPackageDownloader(testDirectory) :  new MockNuGetPackageDownloader(dotnetRoot, manifestDownload);
            var workloadResolver = WorkloadResolver.CreateForTests(new MockManifestProvider(new[] { _manifestPath }), dotnetRoot);
            var sdkFeatureBand   = new SdkFeatureBand("6.0.100");

            return(dotnetRoot, new FileBasedInstaller(_reporter, sdkFeatureBand, workloadResolver, userProfileDir: testDirectory, nugetInstaller, dotnetRoot, packageSourceLocation: packageSourceLocation), nugetInstaller);
        }
示例#5
0
        public WorkloadListCommand(
            ParseResult result,
            IReporter reporter = null,
            IWorkloadInstallationRecordRepository workloadRecordRepo = null,
            string currentSdkVersion = null,
            string dotnetDir         = null,
            string userProfileDir    = null,
            string tempDirPath       = null,
            INuGetPackageDownloader nugetPackageDownloader   = null,
            IWorkloadManifestUpdater workloadManifestUpdater = null,
            IWorkloadResolver workloadResolver = null
            ) : base(result)
        {
            _reporter = reporter ?? Reporter.Output;
            _machineReadableOption = result.GetValueForOption(WorkloadListCommandParser.MachineReadableOption);
            _verbosity             = result.GetValueForOption(WorkloadListCommandParser.VerbosityOption);

            _dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            ReleaseVersion currentSdkReleaseVersion = new(currentSdkVersion ?? Product.Version);

            _currentSdkFeatureBand = new SdkFeatureBand(currentSdkReleaseVersion);

            _includePreviews = result.GetValueForOption(WorkloadListCommandParser.IncludePreviewsOption);
            _tempDirPath     = tempDirPath ??
                               (string.IsNullOrWhiteSpace(
                                    result.GetValueForOption(WorkloadListCommandParser.TempDirOption))
                               ? Path.GetTempPath()
                               : result.GetValueForOption(WorkloadListCommandParser.TempDirOption));
            _targetSdkVersion = result.GetValueForOption(WorkloadListCommandParser.VersionOption);
            _userProfileDir   = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath;
            var workloadManifestProvider =
                new SdkDirectoryWorkloadManifestProvider(_dotnetPath,
                                                         string.IsNullOrWhiteSpace(_targetSdkVersion)
                        ? currentSdkReleaseVersion.ToString()
                        : _targetSdkVersion,
                                                         _userProfileDir);
            DirectoryPath tempPackagesDir =
                new(Path.Combine(_userProfileDir, "sdk-advertising-temp"));
            NullLogger nullLogger = new NullLogger();

            _nugetPackageDownloader = nugetPackageDownloader ??
                                      new NuGetPackageDownloader(tempPackagesDir, null,
                                                                 new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, nullLogger),
                                                                 verboseLogger: nullLogger,
                                                                 restoreActionConfig: _parseResult.ToRestoreActionConfig());
            workloadResolver ??= WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, currentSdkReleaseVersion.ToString(), _userProfileDir);

            _workloadRecordRepo = workloadRecordRepo ??
                                  WorkloadInstallerFactory.GetWorkloadInstaller(reporter, _currentSdkFeatureBand, workloadResolver, _verbosity, _userProfileDir,
                                                                                elevationRequired: false).GetWorkloadInstallationRecordRepository();

            _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter,
                                                                                              workloadResolver, _nugetPackageDownloader, _userProfileDir, _tempDirPath, _workloadRecordRepo);
        }
示例#6
0
        private void UpdateWorkloadsWithInstallRecord(
            IEnumerable <WorkloadId> workloadIds,
            SdkFeatureBand sdkFeatureBand,
            IEnumerable <ManifestVersionUpdate> manifestsToUpdate,
            DirectoryPath?offlineCache = null)
        {
            if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs))
            {
                var installer = _workloadInstaller.GetPackInstaller();
                IEnumerable <PackInfo> workloadPackToUpdate = new List <PackInfo>();

                var transaction = new CliTransaction();

                transaction.RollbackStarted = () =>
                {
                    Reporter.WriteLine(LocalizableStrings.RollingBackInstall);
                };
                // Don't hide the original error if roll back fails, but do log the rollback failure
                transaction.RollbackFailed = ex =>
                {
                    Reporter.WriteLine(string.Format(LocalizableStrings.RollBackFailedMessage, ex.Message));
                };

                transaction.Run(
                    action: context =>
                {
                    bool rollback = !string.IsNullOrWhiteSpace(_fromRollbackDefinition);

                    foreach (var manifestUpdate in manifestsToUpdate)
                    {
                        _workloadInstaller.InstallWorkloadManifest(manifestUpdate, context, offlineCache, rollback);
                    }

                    _workloadResolver.RefreshWorkloadManifests();

                    workloadPackToUpdate = GetUpdatablePacks(installer);

                    installer.InstallWorkloadPacks(workloadPackToUpdate, sdkFeatureBand, context, offlineCache);
                },
                    rollback: () =>
                {
                    //  Nothing to roll back at this level, InstallWorkloadManifest and InstallWorkloadPacks handle the transaction rollback
                });
            }
            else
            {
                var installer = _workloadInstaller.GetWorkloadInstaller();
                foreach (var workloadId in workloadIds)
                {
                    installer.InstallWorkload(workloadId);
                }
            }
        }
        public void GivenManagedInstallItCanInstallManifestVersion()
        {
            var(_, installer, nugetDownloader) = GetTestInstaller(manifestDownload: true);
            var featureBand     = new SdkFeatureBand("6.0.100");
            var manifestId      = new ManifestId("test-manifest-1");
            var manifestVersion = new ManifestVersion("5.0.0");

            installer.InstallWorkloadManifest(manifestId, manifestVersion, featureBand);

            var mockNugetInstaller = nugetDownloader as MockNuGetPackageDownloader;

            mockNugetInstaller.DownloadCallParams.Count.Should().Be(1);
            mockNugetInstaller.DownloadCallParams[0].ShouldBeEquivalentTo((new PackageId($"{manifestId}.manifest-{featureBand}"), new NuGetVersion(manifestVersion.ToString()), null as DirectoryPath?));
        }
示例#8
0
        public override int Execute()
        {
            try
            {
                Reporter.WriteLine();

                var featureBand           = new SdkFeatureBand(_sdkVersion);
                var installedWorkloads    = _workloadInstaller.GetWorkloadInstallationRecordRepository().GetInstalledWorkloads(featureBand);
                var unrecognizedWorkloads = _workloadIds.Where(workloadId => !installedWorkloads.Contains(workloadId));
                if (unrecognizedWorkloads.Any())
                {
                    throw new Exception(string.Format(LocalizableStrings.WorkloadNotInstalled, string.Join(" ", unrecognizedWorkloads)));
                }

                foreach (var workloadId in _workloadIds)
                {
                    Reporter.WriteLine(string.Format(LocalizableStrings.RemovingWorkloadInstallationRecord, workloadId));
                    _workloadInstaller.GetWorkloadInstallationRecordRepository()
                    .DeleteWorkloadInstallationRecord(workloadId, featureBand);
                }

                if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs))
                {
                    var installer = _workloadInstaller.GetPackInstaller();

                    installer.GarbageCollectInstalledWorkloadPacks();
                }
                else
                {
                    var installer = _workloadInstaller.GetWorkloadInstaller();
                    foreach (var workloadId in _workloadIds)
                    {
                        installer.UninstallWorkload(workloadId);
                    }
                }

                Reporter.WriteLine();
                Reporter.WriteLine(string.Format(LocalizableStrings.UninstallSucceeded, string.Join(" ", _workloadIds)));
                Reporter.WriteLine();
            }
            catch (Exception e)
            {
                _workloadInstaller.Shutdown();
                // Don't show entire stack trace
                throw new GracefulException(string.Format(LocalizableStrings.WorkloadUninstallFailed, e.Message), e, isUserError: false);
            }

            return(_workloadInstaller.ExitCode);
        }
        public WorkloadUpdateCommand(
            ParseResult parseResult,
            IReporter reporter = null,
            IWorkloadResolver workloadResolver               = null,
            IInstaller workloadInstaller                     = null,
            INuGetPackageDownloader nugetPackageDownloader   = null,
            IWorkloadManifestUpdater workloadManifestUpdater = null,
            string dotnetDir   = null,
            string userHome    = null,
            string tempDirPath = null,
            string version     = null)
            : base(parseResult)
        {
            _printDownloadLinkOnly =
                parseResult.ValueForOption <bool>(WorkloadUpdateCommandParser.PrintDownloadLinkOnlyOption);
            _fromCacheOption       = parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.FromCacheOption);
            _reporter              = reporter ?? Reporter.Output;
            _includePreviews       = parseResult.ValueForOption <bool>(WorkloadUpdateCommandParser.IncludePreviewsOption);
            _downloadToCacheOption = parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.DownloadToCacheOption);
            _verbosity             = parseResult.ValueForOption <VerbosityOptions>(WorkloadUpdateCommandParser.VerbosityOption);
            _sdkVersion            = string.IsNullOrEmpty(parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.VersionOption)) ?
                                     new ReleaseVersion(version ?? Product.Version) :
                                     new ReleaseVersion(parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.VersionOption));
            _tempDirPath = tempDirPath ?? (string.IsNullOrWhiteSpace(parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.TempDirOption)) ?
                                           Path.GetTempPath() :
                                           parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.TempDirOption));

            var configOption    = parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.ConfigOption);
            var addSourceOption = parseResult.ValueForOption <string[]>(WorkloadUpdateCommandParser.AddSourceOption);

            _packageSourceLocation = string.IsNullOrEmpty(configOption) && (addSourceOption == null || !addSourceOption.Any()) ? null :
                                     new PackageSourceLocation(string.IsNullOrEmpty(configOption) ? null : new FilePath(configOption), sourceFeedOverrides:  addSourceOption);

            _dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            _workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString());
            _workloadResolver         = workloadResolver ?? WorkloadResolver.Create(_workloadManifestProvider, _dotnetPath, _sdkVersion.ToString());
            var sdkFeatureBand = new SdkFeatureBand(_sdkVersion);

            _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, _workloadResolver, _verbosity, nugetPackageDownloader,
                                                                                                    dotnetDir, packageSourceLocation: _packageSourceLocation);
            _userHome = userHome ?? CliFolderPathCalculator.DotnetHomePath;
            var tempPackagesDir = new DirectoryPath(Path.Combine(_tempDirPath, "dotnet-sdk-advertising-temp"));

            _nugetPackageDownloader  = nugetPackageDownloader ?? new NuGetPackageDownloader(tempPackagesDir, filePermissionSetter: null, new NullLogger());
            _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadManifestProvider, _nugetPackageDownloader, _userHome, _tempDirPath, _packageSourceLocation);
        }
示例#10
0
        public WorkloadUpdateCommand(
            ParseResult parseResult,
            IReporter reporter = null,
            IWorkloadResolver workloadResolver               = null,
            IInstaller workloadInstaller                     = null,
            INuGetPackageDownloader nugetPackageDownloader   = null,
            IWorkloadManifestUpdater workloadManifestUpdater = null,
            string dotnetDir      = null,
            string userProfileDir = null,
            string tempDirPath    = null,
            string version        = null)
            : base(parseResult, reporter: reporter, tempDirPath: tempDirPath, nugetPackageDownloader: nugetPackageDownloader)
        {
            _printDownloadLinkOnly =
                parseResult.GetValueForOption(WorkloadUpdateCommandParser.PrintDownloadLinkOnlyOption);
            _fromCacheOption       = parseResult.GetValueForOption(WorkloadUpdateCommandParser.FromCacheOption);
            _includePreviews       = parseResult.GetValueForOption(WorkloadUpdateCommandParser.IncludePreviewsOption);
            _fromPreviousSdk       = parseResult.GetValueForOption(WorkloadUpdateCommandParser.FromPreviousSdkOption);
            _adManifestOnlyOption  = parseResult.GetValueForOption(WorkloadUpdateCommandParser.AdManifestOnlyOption);
            _downloadToCacheOption = parseResult.GetValueForOption(WorkloadUpdateCommandParser.DownloadToCacheOption);
            _dotnetPath            = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            _userProfileDir        = userProfileDir ?? CliFolderPathCalculator.DotnetUserProfileFolderPath;
            _sdkVersion            = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.GetValueForOption(WorkloadUpdateCommandParser.VersionOption), version, _dotnetPath, _userProfileDir);

            _printRollbackDefinitionOnly = parseResult.GetValueForOption(WorkloadUpdateCommandParser.PrintRollbackOption);
            _fromRollbackDefinition      = parseResult.GetValueForOption(WorkloadUpdateCommandParser.FromRollbackFileOption);

            var configOption = parseResult.GetValueForOption(WorkloadUpdateCommandParser.ConfigOption);
            var sourceOption = parseResult.GetValueForOption <string[]>(WorkloadUpdateCommandParser.SourceOption);

            _packageSourceLocation = string.IsNullOrEmpty(configOption) && (sourceOption == null || !sourceOption.Any()) ? null :
                                     new PackageSourceLocation(string.IsNullOrEmpty(configOption) ? null : new FilePath(configOption), sourceFeedOverrides: sourceOption);

            var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString(), _userProfileDir);

            _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, _sdkVersion.ToString(), _userProfileDir);
            var sdkFeatureBand = new SdkFeatureBand(_sdkVersion);

            _workloadInstaller = workloadInstaller ?? WorkloadInstallerFactory.GetWorkloadInstaller(Reporter,
                                                                                                    sdkFeatureBand, _workloadResolver, Verbosity, _userProfileDir, VerifySignatures, PackageDownloader,
                                                                                                    dotnetDir, TempDirectoryPath, packageSourceLocation: _packageSourceLocation, RestoreActionConfiguration,
                                                                                                    elevationRequired: !_printDownloadLinkOnly && !_printRollbackDefinitionOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption));
            _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(Reporter, _workloadResolver, PackageDownloader, _userProfileDir, TempDirectoryPath,
                                                                                              _workloadInstaller.GetWorkloadInstallationRecordRepository(), _packageSourceLocation);
        }
示例#11
0
        public WorkloadListCommand(
            ParseResult result,
            IReporter reporter = null,
            IWorkloadInstallationRecordRepository workloadRecordRepo = null,
            string currentSdkVersion = null,
            string dotnetDir         = null,
            string userHome          = null,
            string tempDirPath       = null,
            INuGetPackageDownloader nugetPackageDownloader   = null,
            IWorkloadManifestUpdater workloadManifestUpdater = null
            ) : base(result)
        {
            _reporter = reporter ?? Reporter.Output;
            _machineReadableOption = result.ValueForOption <bool>(WorkloadListCommandParser.MachineReadableOption);
            _verbosity             = result.ValueForOption <VerbosityOptions>(WorkloadListCommandParser.VerbosityOption);

            _dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            ReleaseVersion currentSdkReleaseVersion = new(currentSdkVersion ?? Product.Version);

            _currentSdkFeatureBand = new SdkFeatureBand(currentSdkReleaseVersion);
            _workloadRecordRepo    = workloadRecordRepo ??
                                     new NetSdkManagedInstallationRecordRepository(_dotnetPath);
            _includePreviews = result.ValueForOption <bool>(WorkloadListCommandParser.IncludePreviewsOption);
            _tempDirPath     = tempDirPath ??
                               (string.IsNullOrWhiteSpace(
                                    result.ValueForOption <string>(WorkloadListCommandParser.TempDirOption))
                               ? Path.GetTempPath()
                               : result.ValueForOption <string>(WorkloadListCommandParser.TempDirOption));
            _targetSdkVersion         = result.ValueForOption <string>(WorkloadListCommandParser.VersionOption);
            _workloadManifestProvider =
                new SdkDirectoryWorkloadManifestProvider(_dotnetPath,
                                                         string.IsNullOrWhiteSpace(_targetSdkVersion)
                        ? currentSdkReleaseVersion.ToString()
                        : _targetSdkVersion);
            _userHome = userHome ?? CliFolderPathCalculator.DotnetHomePath;
            DirectoryPath tempPackagesDir =
                new(Path.Combine(_userHome, ".dotnet", "sdk-advertising-temp"));

            _nugetPackageDownloader = nugetPackageDownloader ??
                                      new NuGetPackageDownloader(tempPackagesDir, null,
                                                                 new NullLogger());
            _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter,
                                                                                              _workloadManifestProvider, _nugetPackageDownloader, _userHome, _tempDirPath);
        }
示例#12
0
        public WorkloadRepairCommand(
            ParseResult parseResult,
            IReporter reporter = null,
            IWorkloadResolver workloadResolver             = null,
            IInstaller workloadInstaller                   = null,
            INuGetPackageDownloader nugetPackageDownloader = null,
            string dotnetDir      = null,
            string tempDirPath    = null,
            string version        = null,
            string userProfileDir = null)
            : base(parseResult)
        {
            _reporter   = reporter ?? Reporter.Output;
            _verbosity  = parseResult.GetValueForOption(WorkloadRepairCommandParser.VerbosityOption);
            _dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath;
            _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.GetValueForOption(WorkloadRepairCommandParser.VersionOption), version, _dotnetPath, userProfileDir);

            var configOption = parseResult.GetValueForOption(WorkloadRepairCommandParser.ConfigOption);
            var sourceOption = parseResult.GetValueForOption(WorkloadRepairCommandParser.SourceOption);

            _packageSourceLocation = string.IsNullOrEmpty(configOption) && (sourceOption == null || !sourceOption.Any()) ? null :
                                     new PackageSourceLocation(string.IsNullOrEmpty(configOption) ? null : new FilePath(configOption), sourceFeedOverrides: sourceOption);

            var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(_dotnetPath, _sdkVersion.ToString(), userProfileDir);

            _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, _dotnetPath, _sdkVersion.ToString(), userProfileDir);
            var sdkFeatureBand = new SdkFeatureBand(_sdkVersion);

            tempDirPath = tempDirPath ?? (string.IsNullOrWhiteSpace(parseResult.GetValueForOption(WorkloadInstallCommandParser.TempDirOption)) ?
                                          Path.GetTempPath() :
                                          parseResult.GetValueForOption(WorkloadInstallCommandParser.TempDirOption));
            var        tempPackagesDir = new DirectoryPath(Path.Combine(tempDirPath, "dotnet-sdk-advertising-temp"));
            NullLogger nullLogger      = new NullLogger();

            nugetPackageDownloader ??= new NuGetPackageDownloader(
                tempPackagesDir,
                filePermissionSetter: null,
                new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, nullLogger), nullLogger, restoreActionConfig: _parseResult.ToRestoreActionConfig());
            _workloadInstaller = workloadInstaller ??
                                 WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand,
                                                                               _workloadResolver, _verbosity, userProfileDir, nugetPackageDownloader, dotnetDir, tempDirPath,
                                                                               _packageSourceLocation, _parseResult.ToRestoreActionConfig());
        }
示例#13
0
        public void UpdateWorkloads(bool includePreviews = false)
        {
            _reporter.WriteLine();
            var featureBand = new SdkFeatureBand(string.Join('.', _sdkVersion.Major, _sdkVersion.Minor, _sdkVersion.SdkFeatureBand));

            var workloadIds = _workloadInstaller.GetWorkloadInstallationRecordRepository().GetInstalledWorkloads(featureBand);

            _workloadManifestUpdater.UpdateAdvertisingManifestsAsync(includePreviews).Wait();
            var manifestsToUpdate = _workloadManifestUpdater.CalculateManifestUpdates();

            UpdateWorkloadsWithInstallRecord(workloadIds, featureBand, manifestsToUpdate);

            if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs))
            {
                _workloadInstaller.GetPackInstaller().GarbageCollectInstalledWorkloadPacks();
            }

            _reporter.WriteLine();
            _reporter.WriteLine(string.Format(LocalizableStrings.UpdateSucceeded, string.Join(" ", workloadIds)));
            _reporter.WriteLine();
        }
示例#14
0
        public WorkloadListCommand(
            ParseResult result,
            IReporter reporter = null,
            IWorkloadInstallationRecordRepository workloadRecordRepo = null,
            string version = null) : base(result)
        {
            _reporter = reporter ?? Reporter.Output;
            _machineReadableOption = result.ValueForOption <bool>(WorkloadListCommandParser.MachineReadableOption);
            _verbosity             = result.ValueForOption <VerbosityOptions>(WorkloadListCommandParser.VerbosityOption);

            var sdkVersion = new ReleaseVersion(version ?? Product.Version);
            var dotnetPath = Path.GetDirectoryName(Environment.ProcessPath);
            var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, sdkVersion.ToString());
            var workloadResolver         = WorkloadResolver.Create(workloadManifestProvider, dotnetPath, sdkVersion.ToString());

            _sdkFeatureBand     = new SdkFeatureBand(sdkVersion);
            _workloadRecordRepo = workloadRecordRepo ??
                                  WorkloadInstallerFactory
                                  .GetWorkloadInstaller(_reporter, _sdkFeatureBand, workloadResolver, _verbosity)
                                  .GetWorkloadInstallationRecordRepository();
            _sdkVersion = result.ValueForOption <string>(WorkloadUpdateCommandParser.SdkVersionOption);
        }
        public void UpdateWorkloads(bool includePreviews = false, DirectoryPath?offlineCache = null)
        {
            _reporter.WriteLine();
            var featureBand =
                new SdkFeatureBand(string.Join('.', _sdkVersion.Major, _sdkVersion.Minor, _sdkVersion.SdkFeatureBand));

            var workloadIds = GetUpdatableWorkloads();

            _workloadManifestUpdater.UpdateAdvertisingManifestsAsync(includePreviews, offlineCache).Wait();
            var manifestsToUpdate = _workloadManifestUpdater.CalculateManifestUpdates()
                                    .Select(m => (m.manifestId, m.existingVersion, m.newVersion));

            UpdateWorkloadsWithInstallRecord(workloadIds, featureBand, manifestsToUpdate, offlineCache);

            if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs))
            {
                _workloadInstaller.GetPackInstaller().GarbageCollectInstalledWorkloadPacks();
            }

            _reporter.WriteLine();
            _reporter.WriteLine(string.Format(LocalizableStrings.UpdateSucceeded, string.Join(" ", workloadIds)));
            _reporter.WriteLine();
        }
示例#16
0
        public WorkloadListHelper(
            VerbosityOptions verbosity = VerbosityOptions.normal,
            string targetSdkVersion    = null,
            bool?verifySignatures      = null,
            IReporter reporter         = null,
            IWorkloadInstallationRecordRepository workloadRecordRepo = null,
            string currentSdkVersion           = null,
            string dotnetDir                   = null,
            string userProfileDir              = null,
            IWorkloadResolver workloadResolver = null
            )
        {
            string         dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            ReleaseVersion currentSdkReleaseVersion = new(currentSdkVersion ?? Product.Version);

            _currentSdkFeatureBand = new SdkFeatureBand(currentSdkReleaseVersion);

            _targetSdkVersion = targetSdkVersion;
            userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath;
            var workloadManifestProvider =
                new SdkDirectoryWorkloadManifestProvider(dotnetPath,
                                                         string.IsNullOrWhiteSpace(_targetSdkVersion)
                        ? currentSdkReleaseVersion.ToString()
                        : _targetSdkVersion,
                                                         userProfileDir);

            WorkloadResolver = workloadResolver ?? NET.Sdk.WorkloadManifestReader.WorkloadResolver.Create(
                workloadManifestProvider, dotnetPath,
                currentSdkReleaseVersion.ToString(), userProfileDir);

            WorkloadRecordRepo = workloadRecordRepo ??
                                 WorkloadInstallerFactory.GetWorkloadInstaller(reporter, _currentSdkFeatureBand,
                                                                               WorkloadResolver, verbosity, userProfileDir,
                                                                               verifySignatures ?? !SignCheck.IsDotNetSigned(),
                                                                               elevationRequired: false).GetWorkloadInstallationRecordRepository();
        }
示例#17
0
        public WorkloadUninstallCommand(
            ParseResult parseResult,
            IReporter reporter = null,
            IWorkloadResolver workloadResolver             = null,
            INuGetPackageDownloader nugetPackageDownloader = null,
            string dotnetDir = null,
            string version   = null)
            : base(parseResult)
        {
            _reporter    = reporter ?? Reporter.Output;
            _workloadIds = parseResult.ValueForArgument <IEnumerable <string> >(WorkloadUninstallCommandParser.WorkloadIdArgument)
                           .Select(workloadId => new WorkloadId(workloadId)).ToList().AsReadOnly();
            var dotnetPath = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);

            _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption <string>(WorkloadUninstallCommandParser.VersionOption), version, dotnetPath);
            var verbosity = parseResult.ValueForOption <VerbosityOptions>(WorkloadUninstallCommandParser.VerbosityOption);
            var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, _sdkVersion.ToString());

            workloadResolver ??= WorkloadResolver.Create(workloadManifestProvider, dotnetPath, _sdkVersion.ToString());
            nugetPackageDownloader ??= new NuGetPackageDownloader(new DirectoryPath(Path.GetTempPath()), filePermissionSetter: null, verboseLogger: new NullLogger());
            var sdkFeatureBand = new SdkFeatureBand(_sdkVersion);

            _workloadInstaller = WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand, workloadResolver, verbosity, nugetPackageDownloader, dotnetPath);
        }
示例#18
0
        public void UpdateWorkloads(bool includePreviews = false, DirectoryPath?offlineCache = null)
        {
            _reporter.WriteLine();
            var featureBand =
                new SdkFeatureBand(_sdkVersion);

            var workloadIds = GetUpdatableWorkloads();

            _workloadManifestUpdater.UpdateAdvertisingManifestsAsync(includePreviews, offlineCache).Wait();

            var manifestsToUpdate = string.IsNullOrWhiteSpace(_fromRollbackDefinition) ?
                                    _workloadManifestUpdater.CalculateManifestUpdates().Select(m => (m.manifestId, m.existingVersion, m.newVersion)) :
                                    _workloadManifestUpdater.CalculateManifestRollbacks(_fromRollbackDefinition);

            UpdateWorkloadsWithInstallRecord(workloadIds, featureBand, manifestsToUpdate, offlineCache);

            WorkloadInstallCommand.TryRunGarbageCollection(_workloadInstaller, _reporter, _verbosity, offlineCache);

            _workloadManifestUpdater.DeleteUpdatableWorkloadsFile();

            _reporter.WriteLine();
            _reporter.WriteLine(string.Format(LocalizableStrings.UpdateSucceeded, string.Join(" ", workloadIds)));
            _reporter.WriteLine();
        }
示例#19
0
 /// <summary>
 /// Sends an <see cref="InstallRequestMessage"/> to create or delete a workload installation record.
 /// </summary>
 /// <param name="requestType">The action to perform on the workload record.</param>
 /// <param name="workloadId">The workload identifier.</param>
 /// <param name="sdkFeatureBand">The SDK feature band associated with the record.</param>
 /// <returns></returns>
 public InstallResponseMessage SendWorkloadRecordRequest(InstallRequestType requestType, WorkloadId workloadId, SdkFeatureBand sdkFeatureBand)
 {
     return(Send(new InstallRequestMessage
     {
         RequestType = requestType,
         WorkloadId = workloadId.ToString(),
         SdkFeatureBand = sdkFeatureBand.ToString(),
     }));
 }
示例#20
0
 public void InstallWorkloadManifest(ManifestId manifestId, ManifestVersion manifestVersion, SdkFeatureBand sdkFeatureBand) => throw new System.NotImplementedException();
 public void WriteWorkloadInstallationRecord(WorkloadId workloadId, SdkFeatureBand sdkFeatureBand) => throw new System.NotImplementedException();
 public IEnumerable <WorkloadId> GetInstalledWorkloads(SdkFeatureBand sdkFeatureBand)
 {
     return(InstalledWorkloads);
 }
 public void DeleteWorkloadInstallationRecord(WorkloadId workloadId, SdkFeatureBand sdkFeatureBand)
 {
     WorkloadInstallRecord.Remove(workloadId);
 }
示例#24
0
        internal static void GetInstalledWorkloads(IWorkloadResolver workloadResolver, SdkFeatureBand sdkFeatureBand,
                                                   InstalledWorkloadsCollection installedWorkloads)
        {
            IEnumerable <string> visualStudioWorkloadIds     = GetAvailableVisualStudioWorkloads(workloadResolver);
            HashSet <string>     installedWorkloadComponents = new();

            // Visual Studio instances contain a large set of packages and we have to perform a linear
            // search to determine whether a matching SDK was installed and look for each installable
            // workload from the SDK. The search is optimized to only scan each set of packages once.
            foreach (ISetupInstance2 instance in GetVisualStudioInstances())
            {
                ISetupPackageReference[] packages = instance.GetPackages();
                bool hasMatchingSdk = false;
                installedWorkloadComponents.Clear();

                for (int i = 0; i < packages.Length; i++)
                {
                    string packageId = packages[i].GetId();

                    if (string.IsNullOrWhiteSpace(packageId))
                    {
                        // Visual Studio already verifies the setup catalog at build time. If the package ID is empty
                        // the catalog is likely corrupted.
                        continue;
                    }

                    if (packageId.StartsWith(s_visualStudioSdkPackageIdPrefix))
                    {
                        // After trimming the package prefix we should be left with a valid semantic version. If we can't
                        // parse the version we'll skip this instance.
                        if (!ReleaseVersion.TryParse(packageId.Substring(s_visualStudioSdkPackageIdPrefix.Length),
                                                     out ReleaseVersion visualStudioSdkVersion))
                        {
                            break;
                        }

                        SdkFeatureBand visualStudioSdkFeatureBand = new SdkFeatureBand(visualStudioSdkVersion);

                        // The feature band of the SDK in VS must match that of the SDK on which we're running.
                        if (!visualStudioSdkFeatureBand.Equals(sdkFeatureBand))
                        {
                            break;
                        }

                        hasMatchingSdk = true;

                        continue;
                    }

                    if (visualStudioWorkloadIds.Contains(packageId, StringComparer.OrdinalIgnoreCase))
                    {
                        // Normalize back to an SDK style workload ID.
                        installedWorkloadComponents.Add(packageId.Replace('.', '-'));
                    }
                }

                if (hasMatchingSdk)
                {
                    foreach (string id in installedWorkloadComponents)
                    {
                        installedWorkloads.Add(id, $"VS {instance.GetInstallationVersion()}");
                    }
                }
            }
        }
示例#25
0
        public void ItParsesVersionsCorrectly(string version, string expectedParsedVersion)
        {
            var parsedVersion = new SdkFeatureBand(version).ToString();

            parsedVersion.Should().Be(expectedParsedVersion);
        }
示例#26
0
 public IEnumerable <string> GetInstalledWorkloads(SdkFeatureBand sdkFeatureBand) => throw new System.NotImplementedException();
示例#27
0
 private void UpdateWorkloadsWithInstallRecord(
     IEnumerable <WorkloadId> workloadIds,
     SdkFeatureBand sdkFeatureBand,
     IEnumerable <(ManifestId manifestId, ManifestVersion existingVersion, ManifestVersion newVersion)> manifestsToUpdate)
示例#28
0
        private void ReinstallWorkloadsBasedOnCurrentManifests(IEnumerable <WorkloadId> workloadIds, SdkFeatureBand sdkFeatureBand)
        {
            if (_workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs))
            {
                var installer = _workloadInstaller.GetPackInstaller();

                var packsToInstall = workloadIds
                                     .SelectMany(workloadId => _workloadResolver.GetPacksInWorkload(workloadId))
                                     .Distinct()
                                     .Select(packId => _workloadResolver.TryGetPackInfo(packId))
                                     .Where(pack => pack != null);

                foreach (var packId in packsToInstall)
                {
                    CliTransaction.RunNew(context => installer.RepairWorkloadPack(packId, sdkFeatureBand, context));
                }
            }
            else
            {
                throw new NotImplementedException();
            }
        }
示例#29
0
        public void ItDiscardsPreleaseLabelsCorrectly(string version, string expectedParsedVersion)
        {
            var parsedVersion = new SdkFeatureBand(version).ToStringWithoutPrerelease();

            parsedVersion.Should().Be(expectedParsedVersion);
        }
示例#30
0
 public void RollBackWorkloadPackInstall(PackInfo packInfo, SdkFeatureBand sdkFeatureBand)
 {
     RolledBackPacks.Add(packInfo);
 }