File: WorkloadFileBasedInstall.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.
 
#if DotnetCsproj
using System.Text.Json;
using Microsoft.DotNet.Cli.Commands.Workload;
#endif
 
using Microsoft.NET.Sdk.WorkloadManifestReader;
 
namespace Microsoft.DotNet.Cli;
 
internal static class WorkloadFileBasedInstall
{
    public static bool IsUserLocal(string? dotnetDir, string? sdkFeatureBand)
        => dotnetDir is not null && File.Exists(GetUserInstallFilePath(dotnetDir, sdkFeatureBand));
 
    internal static void SetUserLocal(string dotnetDir, string sdkFeatureBand)
    {
        string filePath = GetUserInstallFilePath(dotnetDir, sdkFeatureBand);
 
        Directory.CreateDirectory(Path.GetDirectoryName(filePath)!);
        File.WriteAllText(filePath, "");
    }
 
    private static string GetUserInstallFilePath(string dotnetDir, string? sdkFeatureBand)
    {
        if (sdkFeatureBand is not null && (sdkFeatureBand.Contains("-") || !sdkFeatureBand.EndsWith("00", StringComparison.Ordinal)))
        {
            // The user passed in the sdk version. Derive the feature band version.
            if (!Version.TryParse(sdkFeatureBand.Split('-')[0], out var sdkVersionParsed))
            {
                throw new FormatException($"'{nameof(sdkFeatureBand)}' should be a version, but get {sdkFeatureBand}");
            }
 
            static int Last2DigitsTo0(int versionBuild)
            {
                return (versionBuild / 100) * 100;
            }
 
            sdkFeatureBand = $"{sdkVersionParsed.Major}.{sdkVersionParsed.Minor}.{Last2DigitsTo0(sdkVersionParsed.Build)}";
        }
 
        return Path.Combine(dotnetDir, "metadata", "workloads", new SdkFeatureBand(sdkFeatureBand).ToString(), "userlocal");
    }
 
#if DotnetCsproj
    public static IEnumerable<WorkloadHistoryRecord> GetWorkloadHistoryRecords(string workloadHistoryDirectory)
    {
        if (!Directory.Exists(workloadHistoryDirectory))
        {
            return [];
        }
 
        List<WorkloadHistoryRecord> historyRecords = [];
 
        foreach (var file in Directory.GetFiles(workloadHistoryDirectory, "*.json"))
        {
            try
            {
                var historyRecord = JsonSerializer.Deserialize<WorkloadHistoryRecord>(File.ReadAllText(file));
                if (historyRecord is not null)
                {
                    historyRecords.Add(historyRecord);
                }
            }
            catch (JsonException)
            {
                // We picked up a file that wasn't in the correct format, but this isn't necessarily a problem, since we take all json files from
                // the workload history directory. Just ignore it.
            }
        }
 
        return historyRecords;
    }
#endif
}