File: ShellShim\LinuxEnvironmentPath.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.Utils;
using Microsoft.DotNet.Configurer;
using Microsoft.Extensions.EnvironmentAbstractions;
 
namespace Microsoft.DotNet.Cli.ShellShim;
 
internal class LinuxEnvironmentPath : IEnvironmentPath
{
    private readonly IFile _fileSystem;
    private readonly IEnvironmentProvider _environmentProvider;
    private readonly IReporter _reporter;
    private const string PathName = "PATH";
    private readonly BashPathUnderHomeDirectory _packageExecutablePath;
 
    internal static readonly string DotnetCliToolsProfilePath =
        Environment.GetEnvironmentVariable("DOTNET_CLI_TEST_LINUX_PROFILED_PATH") ??
        @"/etc/profile.d/dotnet-cli-tools-bin-path.sh";
 
    internal LinuxEnvironmentPath(
        BashPathUnderHomeDirectory packageExecutablePath,
        IReporter reporter,
        IEnvironmentProvider environmentProvider,
        IFile fileSystem)
    {
        _fileSystem = fileSystem ?? throw new ArgumentNullException(nameof(fileSystem));
        _environmentProvider
            = environmentProvider ?? throw new ArgumentNullException(nameof(environmentProvider));
        _reporter
            = reporter ?? throw new ArgumentNullException(nameof(reporter));
        _packageExecutablePath = packageExecutablePath;
    }
 
    public void AddPackageExecutablePathToUserPath()
    {
        if (PackageExecutablePathExists())
        {
            return;
        }
 
        var script = $"export PATH=\"$PATH:{_packageExecutablePath.PathWithDollar}\"";
        _fileSystem.WriteAllText(DotnetCliToolsProfilePath, script);
    }
 
    private bool PackageExecutablePathExists()
    {
        var value = _environmentProvider.GetEnvironmentVariable(PathName);
        if (value == null)
        {
            return false;
        }
 
        return value
            .Split(':')
            .Any(p => p == _packageExecutablePath.Path || p == _packageExecutablePath.PathWithTilde);
    }
 
    public void PrintAddPathInstructionIfPathDoesNotExist()
    {
        if (!PackageExecutablePathExists())
        {
            if (_fileSystem.Exists(DotnetCliToolsProfilePath))
            {
                _reporter.WriteLine(
                    CliStrings.EnvironmentPathLinuxNeedLogout);
            }
            else
            {
                // similar to https://code.visualstudio.com/docs/setup/mac
                _reporter.WriteLine(
                    string.Format(
                        CliStrings.EnvironmentPathLinuxManualInstructions,
                        _packageExecutablePath.Path));
            }
        }
    }
}