| File: Commands\Workload\WorkloadHistoryRecorder.cs | Web Access |
| Project: src\sdk\src\Cli\dotnet\dotnet.csproj (dotnet) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. #nullable disable using Microsoft.DotNet.Cli.Commands.Workload.Install; using Microsoft.NET.Sdk.WorkloadManifestReader; namespace Microsoft.DotNet.Cli.Commands.Workload; internal class WorkloadHistoryRecorder { public WorkloadHistoryRecord HistoryRecord { get; set; } = new(); private readonly IWorkloadResolver _workloadResolver; private readonly IInstaller _workloadInstaller; private readonly Func<IWorkloadResolver> _workloadResolverFunc; public WorkloadHistoryRecorder(IWorkloadResolver workloadResolver, IInstaller workloadInstaller, Func<IWorkloadResolver> workloadResolverFunc) { _workloadResolver = workloadResolver; _workloadInstaller = workloadInstaller; _workloadResolverFunc = workloadResolverFunc; HistoryRecord.CommandLineArgs = Environment.GetCommandLineArgs(); } public void Run(Action workloadAction) { HistoryRecord.TimeStarted = DateTimeOffset.Now; HistoryRecord.StateBeforeCommand = GetWorkloadState(); try { workloadAction(); HistoryRecord.Succeeded = true; } catch (Exception ex) { HistoryRecord.Succeeded = false; HistoryRecord.ErrorMessage = ex.ToString(); throw; } finally { HistoryRecord.StateAfterCommand = GetWorkloadState(); HistoryRecord.TimeCompleted = DateTimeOffset.Now; _workloadInstaller.WriteWorkloadHistoryRecord(HistoryRecord, _workloadResolver.GetSdkFeatureBand()); } } private WorkloadHistoryState GetWorkloadState() { var resolver = _workloadResolverFunc(); if (resolver.GetWorkloadManifestProvider() is SdkDirectoryWorkloadManifestProvider sdkProvider) { sdkProvider.CorruptionFailureMode = ManifestCorruptionFailureMode.Ignore; } var currentWorkloadVersion = resolver.GetWorkloadVersion().Version; return new WorkloadHistoryState() { ManifestVersions = resolver.GetInstalledManifests().ToDictionary(manifest => manifest.Id.ToString(), manifest => $"{manifest.Version}/{manifest.ManifestFeatureBand}"), InstalledWorkloads = [.. _workloadInstaller.GetWorkloadInstallationRecordRepository() .GetInstalledWorkloads(new SdkFeatureBand(_workloadResolver.GetSdkFeatureBand())).Select(id => id.ToString())], WorkloadSetVersion = currentWorkloadVersion }; } }