A game about forced loneliness, made by TACStudios
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}