Skip to content
Snippets Groups Projects
Forked from pregmodfan / fc-pregmod
18568 commits behind the upstream repository.
  • ezsh's avatar
    e0054cd1
    MSBuild based works with Git · e0054cd1
    ezsh authored
    The MSBbuild is on par with the Makefile: it locates Git, inserts commit
    tag, resets the file (all is done if git is found).
    e0054cd1
    History
    MSBuild based works with Git
    ezsh authored
    The MSBbuild is on par with the Makefile: it locates Git, inserts commit
    tag, resets the file (all is done if git is found).
FindToolPath.cs 3.16 KiB
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.Win32;

/*
 Copyright (c) 2014, LoreSoft
 This class was taken from https://github.com/loresoft/msbuildtasks/ and is licensed under BSD-2 license
*/
internal static class ToolPathUtil
{
	public static bool SafeFileExists(string path, string toolName)
	{
		return SafeFileExists(Path.Combine(path, toolName));
	}

	public static bool SafeFileExists(string file)
	{
		Console.WriteLine(String.Format("Testing {0}", file));
		try { return File.Exists(file); }
		catch { } // eat exception

		return false;
	}

	public static string MakeToolName(string name)
	{
		return (Environment.OSVersion.Platform == PlatformID.Unix) ?
			name : name + ".exe";
	}

	public static string FindInRegistry(string toolName)
	{
		try
		{
			RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + toolName, false);
			if (key != null)
			{
				string possiblePath = key.GetValue(null) as string;
				if (SafeFileExists(possiblePath))
					return Path.GetDirectoryName(possiblePath);
			}
		}
		catch (System.Security.SecurityException) { }

		return null;
	}

	public static string FindInPath(string toolName)
	{
		string pathEnvironmentVariable = Environment.GetEnvironmentVariable("PATH") ?? string.Empty;
		string[] paths = pathEnvironmentVariable.Split(new[] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries);
		foreach (string path in paths)
		{
			if (SafeFileExists(path, toolName))
			{
				return path;
			}
		}

		return null;
	}

	public static string FindInProgramFiles(string toolName, params string[] commonLocations)
	{
		foreach (string location in commonLocations)
		{
			string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), location);
			if (SafeFileExists(path, toolName))
			{
				return path;
			}
		}

		return null;
	}

	public static string FindInLocalPath(string toolName, string localPath)
	{
		if (localPath == null)
			return null;

		string path = new DirectoryInfo(localPath).FullName;
		if (SafeFileExists(localPath, toolName))
		{
			return path;
		}

		return null;
	}
}

public class GetToolPath : Microsoft.Build.Utilities.Task
{
	public virtual string ToolName { get; set; }
	public virtual string LocalPath { get; set; }
	public virtual string ToolPath { get; set; }
	public virtual bool Success { get; set; }

	public override bool Execute()
	{
		this.ToolPath = null;
		this.Success = false;
		string tool = ToolPathUtil.MakeToolName(ToolName);

		string toolDir =
					ToolPathUtil.FindInPath(tool) ??
					ToolPathUtil.FindInRegistry(tool) ??
					ToolPathUtil.FindInProgramFiles(tool, tool) ??
					ToolPathUtil.FindInProgramFiles(tool, Path.Combine(tool, "bin")) ??
					ToolPathUtil.FindInLocalPath(tool, LocalPath);


		if (toolDir == null)
		{
			throw new Exception(String.Format("Could not find {0}. Looked in PATH locations and various common folders inside Program Files as well as LocalPath.", tool));
		}

		Console.WriteLine("Found {0} at {1}", tool, toolDir);
		ToolPath = Path.Combine(toolDir, tool);
		Success = true;
		return Success;
	}
}