A game about forced loneliness, made by TACStudios
at master 92 lines 2.9 kB view raw
1using System; 2using System.Linq; 3using System.Collections.Generic; 4using System.IO; 5 6namespace Unity.PlasticSCM.Editor.Tool 7{ 8 internal static class FindTool 9 { 10 internal static string ObtainToolCommand( 11 string toolName, List<string> installationPaths) 12 { 13 List<string> processPaths = GetPathsFromEnvVariable( 14 PATH_ENVIRONMENT_VARIABLE, 15 EnvironmentVariableTarget.Process); 16 17 List<string> machinePaths = GetPathsFromEnvVariable( 18 PATH_ENVIRONMENT_VARIABLE, 19 EnvironmentVariableTarget.Machine); 20 21 List<string> pathsToLookup = new List<string>(); 22 pathsToLookup.AddRange(processPaths); 23 pathsToLookup.AddRange(machinePaths); 24 pathsToLookup.AddRange(installationPaths); 25 26 string toolPath = FindToolInPaths(toolName, pathsToLookup); 27 28 if (string.IsNullOrEmpty(toolPath)) 29 return null; 30 31 EnsureIsInProcessPathEnvVariable(toolPath, processPaths); 32 33 return toolPath; 34 } 35 36 static string FindToolInPaths( 37 string toolName, 38 List<string> paths) 39 { 40 foreach (string path in paths) 41 { 42 if (path == null) 43 continue; 44 45 if (path.Trim() == string.Empty) 46 continue; 47 48 string filePath = CleanFolderPath(path); 49 50 filePath = Path.Combine(filePath, toolName); 51 52 if (File.Exists(filePath)) 53 return Path.GetFullPath(filePath); 54 } 55 56 return null; 57 } 58 59 static string CleanFolderPath(string folderPath) 60 { 61 foreach (char c in Path.GetInvalidPathChars()) 62 folderPath = folderPath.Replace(c.ToString(), string.Empty); 63 64 return folderPath; 65 } 66 67 static List<string> GetPathsFromEnvVariable( 68 string variableName, 69 EnvironmentVariableTarget target) 70 { 71 string value = Environment.GetEnvironmentVariable(variableName, target); 72 return new List<string>(value.Split(Path.PathSeparator)); 73 } 74 75 static void EnsureIsInProcessPathEnvVariable( 76 string toolPath, 77 List<string> processPaths) 78 { 79 string plasticInstallDir = Path.GetDirectoryName(toolPath); 80 81 if (processPaths.Contains(plasticInstallDir, StringComparer.OrdinalIgnoreCase)) 82 return; 83 84 Environment.SetEnvironmentVariable( 85 PATH_ENVIRONMENT_VARIABLE, 86 string.Concat(plasticInstallDir, Path.PathSeparator, processPaths), 87 EnvironmentVariableTarget.Process); 88 } 89 90 const string PATH_ENVIRONMENT_VARIABLE = "PATH"; 91 } 92}