Merge pull request #895 from pmiossec/better_loading_plugin_strategy

Better loading plugin strategy
This commit is contained in:
Philippe Miossec
2015-12-25 11:13:55 +01:00
2 changed files with 73 additions and 9 deletions
+71 -8
View File
@@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using StructureMap;
using StructureMap.Graph;
using System.IO;
using Microsoft.Win32;
namespace Sep.Git.Tfs.Core.TfsInterop
{
@@ -12,25 +14,43 @@ namespace Sep.Git.Tfs.Core.TfsInterop
{
public static TfsPlugin Find()
{
var x = new PluginLoader();
var pluginLoader = new PluginLoader();
var explicitVersion = Environment.GetEnvironmentVariable("GIT_TFS_CLIENT");
if (explicitVersion == "11") explicitVersion = "2012"; // GitTfs.Vs2012 was formerly called GitTfs.Vs11
if(!String.IsNullOrEmpty(explicitVersion))
{
return x.Try("GitTfs.Vs" + explicitVersion, "Sep.Git.Tfs.TfsPlugin") ??
x.Fail("Unable to load TFS version specified in GIT_TFS_CLIENT (" + explicitVersion + ")!");
return pluginLoader.TryLoadVsPluginVersion(explicitVersion) ??
pluginLoader.Fail("Unable to load TFS version specified in GIT_TFS_CLIENT (" + explicitVersion + ")!");
}
return x.Try("GitTfs.Vs2013", "Sep.Git.Tfs.TfsPlugin") ??
x.Try("GitTfs.Vs2012", "Sep.Git.Tfs.TfsPlugin") ??
x.Try("GitTfs.Vs2010", "Sep.Git.Tfs.TfsPlugin") ??
x.Try("GitTfs.Vs2015", "Sep.Git.Tfs.TfsPlugin") ??
x.Fail();
return pluginLoader.TryLoadVsPluginVersion("2015", true) ??
pluginLoader.TryLoadVsPluginVersion("2013") ??
pluginLoader.TryLoadVsPluginVersion("2012") ??
pluginLoader.TryLoadVsPluginVersion("2010") ??
pluginLoader.TryLoadVsPluginVersion("2015") ??
pluginLoader.Fail();
}
class PluginLoader
{
private List<Exception> _failures = new List<Exception>();
private static string VsPluginAssemblyFolder { get; set; }
private static readonly Dictionary<string,string> VisualStudioVersions = new Dictionary<string, string>()
{
{"2015", "14.0" },
{"2013", "12.0" },
{"2012", "11.0" },
{"2010", "10.0" },
};
public TfsPlugin TryLoadVsPluginVersion(string version, bool isVisualStudioRequired = false)
{
var assembly = "GitTfs.Vs" + version;
if (isVisualStudioRequired && !IsVisualStudioInstalled(version))
{
return null;
}
return Try(assembly, "Sep.Git.Tfs.TfsPlugin");
}
public TfsPlugin Try(string assembly, string pluginType)
{
@@ -53,6 +73,49 @@ namespace Sep.Git.Tfs.Core.TfsInterop
return null;
}
private static bool IsVisualStudioInstalled(string version)
{
if (!VisualStudioVersions.ContainsKey(version))
{
Trace.WriteLine("Visual Studio " + version + " not supported...");
return false;
}
var versionCode = VisualStudioVersions[version];
//doc: http://blogs.msdn.com/b/heaths/archive/2015/04/13/detection-keys-for-visual-studio-2015.aspx
var isInstalled = TryGetRegString(@"SOFTWARE\Wow6432Node\Microsoft\DevDiv\vs\Servicing\" + versionCode)
|| TryGetRegString(@"SOFTWARE\Microsoft\DevDiv\vs\Servicing\" + versionCode);
if (!isInstalled)
{
Trace.WriteLine("Visual Studio " + version + " not found...");
}
else
{
Trace.WriteLine("Visual Studio " + version + " detected...");
}
return isInstalled;
}
private static bool TryGetRegString(string path)
{
RegistryKey registryKey = Registry.LocalMachine;
try
{
Trace.WriteLine("Trying to get " + registryKey.Name + "\\" + path);
var key = registryKey.OpenSubKey(path);
if (key != null)
{
return true;
}
}
catch (Exception e)
{
Trace.WriteLine("Unable to get registry value " + registryKey.Name + "\\" + path + ": " + e);
}
return false;
}
static Assembly LoadFromSameFolder(object sender, ResolveEventArgs args)
{
string folderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+2 -1
View File
@@ -1 +1,2 @@
Fix for RemoteInfo not populating IgnoreExceptRegex property when setting the RemoteOptions property (#880)
* Fix for RemoteInfo not populating IgnoreExceptRegex property when setting the RemoteOptions property (#880)
* Better loading strategy of the GitTfs.Vs20xx plugin to prevent a crash(#894 & #895)