File: Commands\Workload\WorkloadHistoryRecorder.cs
Web Access
Project: ..\..\..\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();
        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
        };
 
    }
}