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"; | |||
|  |     } | |||
|  | } |