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 installationPaths) { List processPaths = GetPathsFromEnvVariable( PATH_ENVIRONMENT_VARIABLE, EnvironmentVariableTarget.Process); List machinePaths = GetPathsFromEnvVariable( PATH_ENVIRONMENT_VARIABLE, EnvironmentVariableTarget.Machine); List pathsToLookup = new List(); 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 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 GetPathsFromEnvVariable( string variableName, EnvironmentVariableTarget target) { string value = Environment.GetEnvironmentVariable(variableName, target); return new List(value.Split(Path.PathSeparator)); } static void EnsureIsInProcessPathEnvVariable( string toolPath, List 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"; } }