示例#1
0
        public NetSdkManagedInstaller(IReporter reporter,
                                      SdkFeatureBand sdkFeatureBand,
                                      IWorkloadResolver workloadResolver,
                                      string userProfileDir,
                                      INuGetPackageDownloader nugetPackageDownloader = null,
                                      string dotnetDir           = null,
                                      string tempDirPath         = null,
                                      VerbosityOptions verbosity = VerbosityOptions.normal,
                                      PackageSourceLocation packageSourceLocation = null,
                                      RestoreActionConfig restoreActionConfig     = null)
        {
            _userProfileDir  = userProfileDir;
            _dotnetDir       = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            _tempPackagesDir = new DirectoryPath(tempDirPath ?? Path.GetTempPath());
            ILogger logger = verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger();

            _restoreActionConfig    = restoreActionConfig;
            _nugetPackageDownloader = nugetPackageDownloader ??
                                      new NuGetPackageDownloader(_tempPackagesDir, filePermissionSetter: null,
                                                                 new FirstPartyNuGetPackageSigningVerifier(_tempPackagesDir), logger,
                                                                 restoreActionConfig: _restoreActionConfig);
            bool userLocal = WorkloadFileBasedInstall.IsUserLocal(_dotnetDir, sdkFeatureBand.ToString());

            _workloadMetadataDir          = Path.Combine(userLocal ? _userProfileDir : _dotnetDir, "metadata", "workloads");
            _reporter                     = reporter;
            _sdkFeatureBand               = sdkFeatureBand;
            _workloadResolver             = workloadResolver;
            _installationRecordRepository = new NetSdkManagedInstallationRecordRepository(_workloadMetadataDir);
            _packageSourceLocation        = packageSourceLocation;
        }
 // begin-snippet: argument_models_notify_with_model
 public void Notify(
     NotificationArgs notificationArgs,
     DryRunOptions dryRunOptions,
     VerbosityOptions verbosityOptions)
 {
     // send notification
 }
示例#3
0
        public static LoggerVerbosity ToLoggerVerbosity(this VerbosityOptions verbosityOptions)
        {
            LoggerVerbosity verbosity = Build.Framework.LoggerVerbosity.Normal;

            switch (verbosityOptions)
            {
            case VerbosityOptions.d:
            case VerbosityOptions.detailed:
                verbosity = Build.Framework.LoggerVerbosity.Detailed;
                break;

            case VerbosityOptions.diag:
            case VerbosityOptions.diagnostic:
                verbosity = Build.Framework.LoggerVerbosity.Diagnostic;
                break;

            case VerbosityOptions.m:
            case VerbosityOptions.minimal:
                verbosity = Build.Framework.LoggerVerbosity.Minimal;
                break;

            case VerbosityOptions.n:
            case VerbosityOptions.normal:
                verbosity = Build.Framework.LoggerVerbosity.Normal;
                break;

            case VerbosityOptions.q:
            case VerbosityOptions.quiet:
                verbosity = Build.Framework.LoggerVerbosity.Quiet;
                break;
            }


            return(verbosity);
        }
        public static IInstaller GetWorkloadInstaller(
            IReporter reporter,
            SdkFeatureBand sdkFeatureBand,
            IWorkloadResolver workloadResolver,
            VerbosityOptions verbosity,
            INuGetPackageDownloader nugetPackageDownloader = null,
            string dotnetDir = null,
            PackageSourceLocation packageSourceLocation = null)
        {
            var installType = GetWorkloadInstallType(sdkFeatureBand, string.IsNullOrWhiteSpace(dotnetDir)
                ? Path.GetDirectoryName(Environment.ProcessPath)
                : dotnetDir);

            if (installType == InstallType.Msi)
            {
                if (!OperatingSystem.IsWindows())
                {
                    throw new InvalidOperationException(LocalizableStrings.OSDoesNotSupportMsi);
                }

                return(new NetSdkMsiInstaller());
            }

            if (!CanWriteToDotnetRoot(dotnetDir))
            {
                throw new GracefulException(LocalizableStrings.InadequatePermissions);
            }

            return(new NetSdkManagedInstaller(reporter, sdkFeatureBand, workloadResolver, nugetPackageDownloader, verbosity: verbosity, dotnetDir: dotnetDir, packageSourceLocation: packageSourceLocation));
        }
示例#5
0
 public static bool VerbosityIsDetailedOrDiagnostic(this VerbosityOptions verbosity)
 {
     return(verbosity.Equals(VerbosityOptions.diag) ||
            verbosity.Equals(VerbosityOptions.diagnostic) ||
            verbosity.Equals(VerbosityOptions.d) ||
            verbosity.Equals(VerbosityOptions.detailed));
 }
示例#6
0
        /// <summary>
        /// Creates a new <see cref="NetSdkMsiInstallerClient"/> instance. If the current host process is not elevated,
        /// the elevated server process will also be started by running an additional command.
        /// </summary>
        /// <param name="nugetPackageDownloader"></param>
        /// <param name="verbosity"></param>
        /// <param name="packageSourceLocation"></param>
        /// <returns></returns>
        public static NetSdkMsiInstallerClient Create(
            SdkFeatureBand sdkFeatureBand,
            IWorkloadResolver workloadResolver,
            INuGetPackageDownloader nugetPackageDownloader = null,
            VerbosityOptions verbosity = VerbosityOptions.normal,
            PackageSourceLocation packageSourceLocation = null,
            IReporter reporter = null,
            string tempDirPath = null,
            RestoreActionConfig restoreActionConfig = null)
        {
            TimestampedFileLogger         logger           = new(Path.Combine(Path.GetTempPath(), $"Microsoft.NET.Workload_{DateTime.Now:yyyyMMdd_HHmmss}.log"));
            InstallClientElevationContext elevationContext = new(logger);

            if (nugetPackageDownloader == null)
            {
                DirectoryPath tempPackagesDir = new(string.IsNullOrWhiteSpace(tempDirPath) ? Path.GetTempPath() : tempDirPath);

                nugetPackageDownloader = new NuGetPackageDownloader(tempPackagesDir,
                                                                    filePermissionSetter: null, new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir),
                                                                    new NullLogger(), restoreActionConfig: restoreActionConfig);
            }

            return(new NetSdkMsiInstallerClient(elevationContext, logger, workloadResolver, sdkFeatureBand, nugetPackageDownloader,
                                                verbosity, packageSourceLocation, reporter));
        }
示例#7
0
        public NetSdkMsiInstallerClient(InstallElevationContextBase elevationContext,
                                        ISetupLogger logger,
                                        IWorkloadResolver workloadResolver,
                                        SdkFeatureBand sdkFeatureBand,
                                        INuGetPackageDownloader nugetPackageDownloader = null,
                                        VerbosityOptions verbosity = VerbosityOptions.normal,
                                        PackageSourceLocation packageSourceLocation = null,
                                        IReporter reporter = null) : base(elevationContext, logger, reporter)
        {
            _packageSourceLocation  = packageSourceLocation;
            _nugetPackageDownloader = nugetPackageDownloader;
            _sdkFeatureBand         = sdkFeatureBand;
            _workloadResolver       = workloadResolver;
            _dependent = $"{DependentPrefix},{sdkFeatureBand},{HostArchitecture}";

            Log?.LogMessage($"Executing: {CurrentProcess.GetCommandLine()}, PID: {CurrentProcess.Id}, PPID: {ParentProcess.Id}");
            Log?.LogMessage($"{nameof(IsElevated)}: {IsElevated}");
            Log?.LogMessage($"{nameof(Is64BitProcess)}: {Is64BitProcess}");
            Log?.LogMessage($"{nameof(RebootPending)}: {RebootPending}");
            Log?.LogMessage($"{nameof(ProcessorArchitecture)}: {ProcessorArchitecture}");
            Log?.LogMessage($"{nameof(HostArchitecture)}: {HostArchitecture}");
            Log?.LogMessage($"{nameof(SdkDirectory)}: {SdkDirectory}");
            Log?.LogMessage($"SDK feature band: {_sdkFeatureBand}");

            if (IsElevated)
            {
                // Turn off automatic updates. We don't want MU to potentially patch the SDK
                // and it also reduces the risk of hitting ERROR_INSTALL_ALREADY_RUNNING.
                UpdateAgent.Stop();
            }
        }
示例#8
0
        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 version   = null)
            : base(parseResult)
        {
            _printDownloadLinkOnly =
                parseResult.ValueForOption <bool>(WorkloadInstallCommandParser.PrintDownloadLinkOnlyOption);
            _fromCacheOption = parseResult.ValueForOption <string>(WorkloadInstallCommandParser.FromCacheOption);
            _reporter        = reporter ?? Reporter.Output;
            _includePreviews = parseResult.ValueForOption <bool>(WorkloadUpdateCommandParser.IncludePreviewsOption);
            _verbosity       = parseResult.ValueForOption <VerbosityOptions>(WorkloadUpdateCommandParser.VerbosityOption);
            _sdkVersion      = new ReleaseVersion(version ??
                                                  (string.IsNullOrWhiteSpace(parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.SdkVersionOption)) ?
                                                   Product.Version : parseResult.ValueForOption <string>(WorkloadUpdateCommandParser.SdkVersionOption)));

            var 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);
            userHome           = userHome ?? CliFolderPathCalculator.DotnetHomePath;
            var tempPackagesDir = new DirectoryPath(Path.Combine(userHome, ".dotnet", "sdk-advertising-temp"));

            _nugetPackageDownloader  = nugetPackageDownloader ?? new NuGetPackageDownloader(tempPackagesDir, filePermissionSetter: null, new NullLogger());
            _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadManifestProvider, _nugetPackageDownloader, userHome);
        }
            // begin-snippet: argument_models_notify_with_interceptor

            public Task <int> Interceptor(InterceptorExecutionDelegate next, CommandContext ctx,
                                          DryRunOptions dryRunOptions, VerbosityOptions verbosityOptions)
            {
                IEnumerable <IArgumentModel> models = ctx.InvocationPipeline.All
                                                      .SelectMany(s => s.Invocation.FlattenedArgumentModels);

                return(next());
            }
示例#10
0
        public WorkloadInstallCommand(
            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,
            IReadOnlyCollection <string> workloadIds = null)
            : base(parseResult)
        {
            _reporter              = reporter ?? Reporter.Output;
            _skipManifestUpdate    = parseResult.ValueForOption <bool>(WorkloadInstallCommandParser.SkipManifestUpdateOption);
            _includePreviews       = parseResult.ValueForOption <bool>(WorkloadInstallCommandParser.IncludePreviewOption);
            _printDownloadLinkOnly = parseResult.ValueForOption <bool>(WorkloadInstallCommandParser.PrintDownloadLinkOnlyOption);
            _fromCacheOption       = parseResult.ValueForOption <string>(WorkloadInstallCommandParser.FromCacheOption);
            _downloadToCacheOption = parseResult.ValueForOption <string>(WorkloadInstallCommandParser.DownloadToCacheOption);
            _workloadIds           = workloadIds ?? parseResult.ValueForArgument <IEnumerable <string> >(WorkloadInstallCommandParser.WorkloadIdArgument).ToList().AsReadOnly();
            _verbosity             = parseResult.ValueForOption <VerbosityOptions>(WorkloadInstallCommandParser.VerbosityOption);
            _dotnetPath            = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
            _sdkVersion            = WorkloadOptionsExtensions.GetValidatedSdkVersion(parseResult.ValueForOption <string>(WorkloadInstallCommandParser.VersionOption), version, _dotnetPath);
            _sdkFeatureBand        = new SdkFeatureBand(string.Join('.', _sdkVersion.Major, _sdkVersion.Minor, _sdkVersion.SdkFeatureBand));
            _tempDirPath           = tempDirPath ?? (string.IsNullOrWhiteSpace(parseResult.ValueForOption <string>(WorkloadInstallCommandParser.TempDirOption)) ?
                                                     Path.GetTempPath() :
                                                     parseResult.ValueForOption <string>(WorkloadInstallCommandParser.TempDirOption));

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

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

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

            _workloadResolver = workloadResolver ?? WorkloadResolver.Create(sdkWorkloadManifestProvider, _dotnetPath, _sdkVersion.ToString());
            var sdkFeatureBand      = new SdkFeatureBand(_sdkVersion);
            var tempPackagesDir     = new DirectoryPath(Path.Combine(_tempDirPath, "dotnet-sdk-advertising-temp"));
            var restoreActionConfig = _parseResult.ToRestoreActionConfig();

            _nugetPackageDownloader = nugetPackageDownloader ??
                                      new NuGetPackageDownloader(tempPackagesDir,
                                                                 filePermissionSetter: null,
                                                                 new FirstPartyNuGetPackageSigningVerifier(tempPackagesDir, _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger()),
                                                                 _verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger(), restoreActionConfig: restoreActionConfig);
            _workloadInstaller = workloadInstaller ??
                                 WorkloadInstallerFactory.GetWorkloadInstaller(_reporter, sdkFeatureBand,
                                                                               _workloadResolver, _verbosity, _nugetPackageDownloader, _dotnetPath, _tempDirPath,
                                                                               _packageSourceLocation, restoreActionConfig, elevationRequired: !_printDownloadLinkOnly && string.IsNullOrWhiteSpace(_downloadToCacheOption));
            _userHome = userHome ?? CliFolderPathCalculator.DotnetHomePath;
            _workloadManifestUpdater = workloadManifestUpdater ?? new WorkloadManifestUpdater(_reporter, _workloadResolver, _nugetPackageDownloader, _userHome, _tempDirPath,
                                                                                              _workloadInstaller.GetWorkloadInstallationRecordRepository(), _packageSourceLocation);

            ValidateWorkloadIdsInput();
        }
示例#11
0
 public static IInstaller GetWorkloadInstaller(
     IReporter reporter,
     SdkFeatureBand sdkFeatureBand,
     IWorkloadResolver workloadResolver,
     VerbosityOptions verbosity,
     INuGetPackageDownloader nugetPackageDownloader = null,
     string dotnetDir = null)
 {
     return(new NetSdkManagedInstaller(reporter, sdkFeatureBand, workloadResolver, nugetPackageDownloader, verbosity: verbosity, dotnetDir: dotnetDir));
 }
示例#12
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);
        }
示例#13
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);
        }
示例#14
0
        public WorkloadSearchCommand(
            ParseResult result,
            IReporter reporter = null,
            IWorkloadResolver workloadResolver = null,
            string version = null) : base(result)
        {
            _reporter       = reporter ?? Reporter.Output;
            _verbosity      = result.ValueForOption <VerbosityOptions>(WorkloadSearchCommandParser.VerbosityOption);
            _workloadIdStub = result.ValueForArgument <string>(WorkloadSearchCommandParser.WorkloadIdStubArgument);
            _sdkVersion     = new ReleaseVersion(version ?? Product.Version) ?? new ReleaseVersion(result.ValueForOption <string>(WorkloadSearchCommandParser.VersionOption));
            var dotnetPath = Path.GetDirectoryName(Environment.ProcessPath);
            var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, _sdkVersion.ToString());

            _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, dotnetPath, _sdkVersion.ToString());
        }
示例#15
0
        public WorkloadInstallCommand(
            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)
        {
            _reporter              = reporter ?? Reporter.Output;
            _skipManifestUpdate    = parseResult.ValueForOption <bool>(WorkloadInstallCommandParser.SkipManifestUpdateOption);
            _includePreviews       = parseResult.ValueForOption <bool>(WorkloadInstallCommandParser.IncludePreviewOption);
            _printDownloadLinkOnly = parseResult.ValueForOption <bool>(WorkloadInstallCommandParser.PrintDownloadLinkOnlyOption);
            _fromCacheOption       = parseResult.ValueForOption <string>(WorkloadInstallCommandParser.FromCacheOption);
            _downloadToCacheOption = parseResult.ValueForOption <string>(WorkloadInstallCommandParser.DownloadToCacheOption);
            _workloadIds           = parseResult.ValueForArgument <IEnumerable <string> >(WorkloadInstallCommandParser.WorkloadIdArgument).ToList().AsReadOnly();
            _verbosity             = parseResult.ValueForOption <VerbosityOptions>(WorkloadInstallCommandParser.VerbosityOption);
            _sdkVersion            = string.IsNullOrEmpty(parseResult.ValueForOption <string>(WorkloadInstallCommandParser.VersionOption)) ?
                                     new ReleaseVersion(version ?? Product.Version) :
                                     new ReleaseVersion(parseResult.ValueForOption <string>(WorkloadInstallCommandParser.VersionOption));
            _tempDirPath = tempDirPath ?? (string.IsNullOrWhiteSpace(parseResult.ValueForOption <string>(WorkloadInstallCommandParser.TempDirOption)) ?
                                           Path.GetTempPath() :
                                           parseResult.ValueForOption <string>(WorkloadInstallCommandParser.TempDirOption));

            var configOption    = parseResult.ValueForOption <string>(WorkloadInstallCommandParser.ConfigOption);
            var addSourceOption = parseResult.ValueForOption <string[]>(WorkloadInstallCommandParser.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, _dotnetPath, _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);
        }
示例#16
0
        public static IInstaller GetWorkloadInstaller(
            IReporter reporter,
            SdkFeatureBand sdkFeatureBand,
            IWorkloadResolver workloadResolver,
            VerbosityOptions verbosity,
            string userProfileDir,
            bool verifySignatures,
            INuGetPackageDownloader nugetPackageDownloader = null,
            string dotnetDir   = null,
            string tempDirPath = null,
            PackageSourceLocation packageSourceLocation = null,
            RestoreActionConfig restoreActionConfig     = null,
            bool elevationRequired = true)
        {
            dotnetDir = string.IsNullOrWhiteSpace(dotnetDir) ? Path.GetDirectoryName(Environment.ProcessPath) : dotnetDir;
            var installType = GetWorkloadInstallType(sdkFeatureBand, dotnetDir);

            if (installType == InstallType.Msi)
            {
                if (!OperatingSystem.IsWindows())
                {
                    throw new InvalidOperationException(LocalizableStrings.OSDoesNotSupportMsi);
                }

                return(NetSdkMsiInstallerClient.Create(verifySignatures, sdkFeatureBand, workloadResolver,
                                                       nugetPackageDownloader, verbosity, packageSourceLocation, reporter, tempDirPath));
            }

            if (elevationRequired && !WorkloadFileBasedInstall.IsUserLocal(dotnetDir, sdkFeatureBand.ToString()) && !CanWriteToDotnetRoot(dotnetDir))
            {
                throw new GracefulException(LocalizableStrings.InadequatePermissions, isUserError: false);
            }

            userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath;

            return(new FileBasedInstaller(reporter,
                                          sdkFeatureBand,
                                          workloadResolver,
                                          userProfileDir,
                                          nugetPackageDownloader,
                                          dotnetDir: dotnetDir,
                                          tempDirPath: tempDirPath,
                                          verbosity: verbosity,
                                          packageSourceLocation: packageSourceLocation,
                                          restoreActionConfig: restoreActionConfig));
        }
示例#17
0
        public WorkloadSearchCommand(
            ParseResult result,
            IReporter reporter = null,
            IWorkloadResolver workloadResolver = null,
            string version        = null,
            string userProfileDir = null) : base(result)
        {
            _reporter       = reporter ?? Reporter.Output;
            _verbosity      = result.GetValueForOption(WorkloadSearchCommandParser.VerbosityOption);
            _workloadIdStub = result.GetValueForArgument(WorkloadSearchCommandParser.WorkloadIdStubArgument);
            var dotnetPath = Path.GetDirectoryName(Environment.ProcessPath);

            userProfileDir ??= CliFolderPathCalculator.DotnetUserProfileFolderPath;
            _sdkVersion = WorkloadOptionsExtensions.GetValidatedSdkVersion(result.GetValueForOption(WorkloadSearchCommandParser.VersionOption), version, dotnetPath, userProfileDir);
            var workloadManifestProvider = new SdkDirectoryWorkloadManifestProvider(dotnetPath, _sdkVersion.ToString(), userProfileDir);

            _workloadResolver = workloadResolver ?? WorkloadResolver.Create(workloadManifestProvider, dotnetPath, _sdkVersion.ToString(), userProfileDir);
        }
示例#18
0
 public NetSdkManagedInstaller(
     IReporter reporter,
     SdkFeatureBand sdkFeatureBand,
     IWorkloadResolver workloadResolver,
     INuGetPackageDownloader nugetPackageDownloader = null,
     string dotnetDir           = null,
     VerbosityOptions verbosity = VerbosityOptions.normal)
 {
     _dotnetDir              = dotnetDir ?? Path.GetDirectoryName(Environment.ProcessPath);
     _tempPackagesDir        = new DirectoryPath(Path.Combine(_dotnetDir, "metadata", "temp"));
     _nugetPackageDownloader = nugetPackageDownloader ??
                               new NuGetPackageDownloader(_tempPackagesDir, filePermissionSetter: null, verbosity.VerbosityIsDetailedOrDiagnostic() ? new NuGetConsoleLogger() : new NullLogger());
     _workloadMetadataDir          = Path.Combine(_dotnetDir, "metadata", "workloads");
     _reporter                     = reporter;
     _sdkFeatureBand               = sdkFeatureBand;
     _workloadResolver             = workloadResolver;
     _installationRecordRepository = new NetSdkManagedInstallationRecordRepository(_dotnetDir);
 }
示例#19
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);
        }
示例#20
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());
        }
示例#21
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);
        }
示例#22
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();
        }
示例#23
0
 /// <summary>
 /// Set the verbosity level of the command.
 /// </summary>
 /// <param name="verbosity"></param>
 /// <returns></returns>
 public DotnetTestTask Verbosity(VerbosityOptions verbosity)
 {
     WithArguments("--verbosity", verbosity.ToString().ToLower());
     return(this);
 }
示例#24
0
        public async Task ExecuteAsync(string vam, string[]?include, string[]?exclude, DeleteOptions delete, VerbosityOptions verbosity, ErrorReportingOptions warnings, ExecutionOptions execution)
        {
            vam = SanitizeVamRootFolder(vam);
            var filter = Filter.From(vam, include, exclude);

            var sw = Stopwatch.StartNew();

            var varFiles = await _operationsFactory.Get <IScanVarPackagesOperation>().ExecuteAsync(vam, filter, verbosity);

            var freeFiles = await _operationsFactory.Get <IScanFilesOperation>().ExecuteAsync(vam);

            var matches = await _operationsFactory.Get <IMatchFilesToPackagesOperation>().ExecuteAsync(varFiles, freeFiles);

            var scenes = await _operationsFactory.Get <IScanJsonFilesOperation>().ExecuteAsync(vam, freeFiles, filter, warnings);

            await _operationsFactory.Get <IUpdateJsonFileReferencesOperation>().ExecuteAsync(scenes, matches, execution);

            await _operationsFactory.Get <IDeleteMatchedFilesOperation>().ExecuteAsync(freeFiles, matches, delete, filter, verbosity, execution);

            await _operationsFactory.Get <IDeleteOrphanMorphFilesOperation>().ExecuteAsync(freeFiles, delete, filter, verbosity, execution);

            _output.WriteLine($"Cleanup complete in {sw.Elapsed.TotalSeconds:0.00} seconds.");
        }
        public async Task ExecuteAsync(IList <FreeFile> files, IList <FreeFilePackageMatch> matches, DeleteOptions delete, IFilter filter, VerbosityOptions verbosity, ExecutionOptions execution)
        {
            var filesToDelete = new HashSet <FreeFile>();

            foreach (var match in matches)
            {
                foreach (var file in match.FreeFiles.Where(f => !filter.IsFiltered(f.LocalPath)).SelectMany(f => f.SelfAndChildren()))
                {
                    filesToDelete.Add(file);
                }
            }

            await DeleteAsync(files, filesToDelete, delete, verbosity, execution);
        }
示例#26
0
 public DotnetBuildTask Verbosity(VerbosityOptions verbosity)
 {
     WithArgumentsKeyFromAttribute(verbosity.ToString().ToLower());
     return(this);
 }
        public async Task ExecuteAsync(IList <FreeFile> files, DeleteOptions delete, IFilter filter, VerbosityOptions verbosity, ExecutionOptions execution)
        {
            var filesToDelete = new HashSet <FreeFile>(files
                                                       .Where(f => !filter.IsFiltered(f.LocalPath)).SelectMany(f => f.SelfAndChildren())
                                                       .Where(f => f.Extension == ".vmi" || f.Extension == ".vmb")
                                                       .Select(f => (basePath: f.LocalPath.Substring(0, f.LocalPath.Length - f.Extension.Length), file: f))
                                                       .GroupBy(x => x.basePath)
                                                       .Where(g => g.Count() == 1)
                                                       .Select(g => g.Single().file));

            await DeleteAsync(files, filesToDelete, delete, verbosity, execution);
        }
示例#28
0
        public Task DeleteAsync(IList <FreeFile> files, ISet <FreeFile> filesToDelete, DeleteOptions delete, VerbosityOptions verbosity, ExecutionOptions execution)
        {
            if (filesToDelete.Count >= files.Sum(f => f.Children == null ? 1 : 1 + f.Children.Count))
            {
                throw new InvalidOperationException($"{Name}: Attempt to delete {filesToDelete.Count}, which is more than the total scanned files.");
            }

            if (filesToDelete.Count == 0)
            {
                Output.WriteLine($"{Name}: Nothing to delete.");
                return(Task.CompletedTask);
            }

            var mbSaved = 0f;

            using (var reporter = new ProgressReporter <ProgressInfo>(StartProgress, ReportProgress, CompleteProgress))
            {
                foreach (var file in filesToDelete)
                {
                    reporter.Report(new ProgressInfo(Interlocked.Increment(ref _processed), filesToDelete.Count, file.LocalPath));

                    if (verbosity == VerbosityOptions.Verbose)
                    {
                        Output.WriteLine($"{(execution == ExecutionOptions.Noop ? "[NOOP]" : "DELETE")}: {file.LocalPath}");
                    }
                    if (execution == ExecutionOptions.Noop)
                    {
                        _logger.Log($"[DELETE(NOOP)] {file.Path}");
                        mbSaved += (file.Size ?? 0f) / 1024f / 1024f;
                    }
                    else
                    {
                        if (DeleteFile(file.Path, delete))
                        {
                            lock (_sync)
                            {
                                mbSaved += (file.Size ?? 0f) / 1024f / 1024f;
                            }
                        }
                        else
                        {
                            Interlocked.Increment(ref _errors);
                        }
                    }
                    lock (_sync)
                    {
                        files.Remove(file);
                    }
                }

                if (execution != ExecutionOptions.Noop)
                {
                    foreach (var folder in filesToDelete.Select(f => FileSystem.Path.GetDirectoryName(f.Path)).Distinct().OrderByDescending(f => f.Length))
                    {
                        if (FileSystem.Directory.Exists(folder) && FileSystem.Directory.GetFileSystemEntries(folder).Length == 0)
                        {
                            if (verbosity == VerbosityOptions.Verbose)
                            {
                                Output.WriteLine($"DELETE (empty folder): {folder}");
                            }
                            FileSystem.Directory.Delete(folder);
                        }
                    }
                }
            }

            if (execution == ExecutionOptions.Noop)
            {
                Output.WriteLine($"{Name}: Did not delete {filesToDelete.Count} files since --noop was specified. Estimated {mbSaved:0.00}MB would have been saved.");
            }
            else
            {
                Output.WriteLine($"{Name}: Deleted {filesToDelete.Count} files. Estimated {mbSaved:0.00}MB saved.");
            }

            if (_errors > 0)
            {
                Output.WriteLine($"{Name}: Could not delete {_errors} files. Enable logging to get more information.");
            }

            return(Task.CompletedTask);
        }
示例#29
0
        public async Task <IList <VarPackage> > ExecuteAsync(string vam, IFilter filter, VerbosityOptions verbosity)
        {
            using (var reporter = new ProgressReporter <ProgressInfo>(StartProgress, ReportProgress, CompleteProgress))
            {
                var packageFiles = _fs.Directory.GetFiles(_fs.Path.Combine(vam, "AddonPackages"), "*.var", SearchOption.AllDirectories);

                var scanPackageBlock = new ActionBlock <string>(
                    f => ExecuteOneAsync(reporter, filter, packageFiles.Length, f),
                    new ExecutionDataflowBlockOptions
                {
                    MaxDegreeOfParallelism = 4
                });

                foreach (var packageFile in packageFiles)
                {
                    scanPackageBlock.Post(packageFile);
                }

                scanPackageBlock.Complete();
                await scanPackageBlock.Completion;
            }

            Output.WriteLine($"Scanned {_files} files in {_packages.Count} var packages.");

            if (_errors.Count > 0)
            {
                if (verbosity == VerbosityOptions.Verbose)
                {
                    foreach (var error in _errors.OrderBy(e => e))
                    {
                        Output.WriteLine(error);
                    }
                }
                else
                {
                    Output.WriteLine($"Warning: {_errors.Count} var packages could not be read. Run with --log or --verbose to see the details.");
                }
            }

            return(_packages.ToList());
        }
示例#30
0
 internal static void TryRunGarbageCollection(IInstaller workloadInstaller, IReporter reporter, VerbosityOptions verbosity, DirectoryPath?offlineCache = null)
 {
     try
     {
         if (workloadInstaller.GetInstallationUnit().Equals(InstallationUnit.Packs))
         {
             workloadInstaller.GetPackInstaller().GarbageCollectInstalledWorkloadPacks(offlineCache);
         }
     }
     catch (Exception e)
     {
         // Garbage collection failed, warn user
         reporter.WriteLine(string.Format(LocalizableStrings.GarbageCollectionFailed,
                                          verbosity.VerbosityIsDetailedOrDiagnostic() ? e.StackTrace.ToString() : e.Message).Yellow());
     }
 }