暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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