93 lines
2.8 KiB
C#
93 lines
2.8 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
|
|
namespace Unity.PlasticSCM.Editor.Tool
|
|
{
|
|
internal static class FindTool
|
|
{
|
|
internal static string ObtainToolCommand(
|
|
string toolName, List<string> installationPaths)
|
|
{
|
|
List<string> processPaths = GetPathsFromEnvVariable(
|
|
PATH_ENVIRONMENT_VARIABLE,
|
|
EnvironmentVariableTarget.Process);
|
|
|
|
List<string> machinePaths = GetPathsFromEnvVariable(
|
|
PATH_ENVIRONMENT_VARIABLE,
|
|
EnvironmentVariableTarget.Machine);
|
|
|
|
List<string> pathsToLookup = new List<string>();
|
|
pathsToLookup.AddRange(processPaths);
|
|
pathsToLookup.AddRange(machinePaths);
|
|
pathsToLookup.AddRange(installationPaths);
|
|
|
|
string toolPath = FindToolInPaths(toolName, pathsToLookup);
|
|
|
|
if (string.IsNullOrEmpty(toolPath))
|
|
return null;
|
|
|
|
EnsureIsInProcessPathEnvVariable(toolPath, processPaths);
|
|
|
|
return toolPath;
|
|
}
|
|
|
|
static string FindToolInPaths(
|
|
string toolName,
|
|
List<string> paths)
|
|
{
|
|
foreach (string path in paths)
|
|
{
|
|
if (path == null)
|
|
continue;
|
|
|
|
if (path.Trim() == string.Empty)
|
|
continue;
|
|
|
|
string filePath = CleanFolderPath(path);
|
|
|
|
filePath = Path.Combine(filePath, toolName);
|
|
|
|
if (File.Exists(filePath))
|
|
return Path.GetFullPath(filePath);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
static string CleanFolderPath(string folderPath)
|
|
{
|
|
foreach (char c in Path.GetInvalidPathChars())
|
|
folderPath = folderPath.Replace(c.ToString(), string.Empty);
|
|
|
|
return folderPath;
|
|
}
|
|
|
|
static List<string> GetPathsFromEnvVariable(
|
|
string variableName,
|
|
EnvironmentVariableTarget target)
|
|
{
|
|
string value = Environment.GetEnvironmentVariable(variableName, target);
|
|
return new List<string>(value.Split(Path.PathSeparator));
|
|
}
|
|
|
|
static void EnsureIsInProcessPathEnvVariable(
|
|
string toolPath,
|
|
List<string> processPaths)
|
|
{
|
|
string plasticInstallDir = Path.GetDirectoryName(toolPath);
|
|
|
|
if (processPaths.Contains(plasticInstallDir, StringComparer.OrdinalIgnoreCase))
|
|
return;
|
|
|
|
Environment.SetEnvironmentVariable(
|
|
PATH_ENVIRONMENT_VARIABLE,
|
|
string.Concat(plasticInstallDir, Path.PathSeparator, processPaths),
|
|
EnvironmentVariableTarget.Process);
|
|
}
|
|
|
|
const string PATH_ENVIRONMENT_VARIABLE = "PATH";
|
|
}
|
|
}
|