using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using Sep.Git.Tfs.Core; using Sep.Git.Tfs.Core.Changes.Git; using Sep.Git.Tfs.Core.TfsInterop; using Sep.Git.Tfs.Util; using StructureMap; using StructureMap.Graph; namespace Sep.Git.Tfs { public class Program { [STAThreadAttribute] public static void Main(string[] args) { try { Environment.ExitCode = MainCore(args); } catch(GitTfsException e) { Trace.WriteLine(e); Console.WriteLine(e.Message); if (!e.RecommendedSolutions.IsEmpty()) { Console.WriteLine("You may be able to resolve this problem."); foreach (var solution in e.RecommendedSolutions) { Console.WriteLine("- " + solution); } } Environment.ExitCode = GitTfsExitCodes.ExceptionThrown; } catch (Exception e) { ReportException(e); Environment.ExitCode = GitTfsExitCodes.ExceptionThrown; } } public static int MainCore(string[] args) { var container = Initialize(); return container.GetInstance().Run(new List(args)); } private static void ReportException(Exception e) { Trace.WriteLine(e); while(e is TargetInvocationException && e.InnerException != null) e = e.InnerException; while (e != null) { Console.WriteLine(e.Message); e = e.InnerException; } } private static IContainer Initialize() { return new Container(Initialize); } private static void Initialize(ConfigurationExpression initializer) { var tfsPlugin = TfsPlugin.Find(); initializer.Scan(x => { Initialize(x); tfsPlugin.Initialize(x); }); initializer.For().Use(() => Console.Out); initializer.For().Add(); AddGitChangeTypes(initializer); DoCustomConfiguration(initializer); tfsPlugin.Initialize(initializer); } public static void AddGitChangeTypes(ConfigurationExpression initializer) { // See git-diff-tree(1). initializer.For().Use().Named(GitChangeInfo.ChangeType.ADD); initializer.For().Use().Named(GitChangeInfo.ChangeType.COPY); initializer.For().Use().Named(GitChangeInfo.ChangeType.MODIFY); //initializer.For().Use().Named(GitChangeInfo.GitChange.TYPECHANGE); initializer.For().Use().Named(GitChangeInfo.ChangeType.DELETE); initializer.For().Use().Named(GitChangeInfo.ChangeType.RENAMEEDIT); //initializer.For().Use().Named(GitChangeInfo.GitChange.UNMERGED); //initializer.For().Use().Named(GitChangeInfo.GitChange.UNKNOWN); } private static void Initialize(IAssemblyScanner scan) { scan.WithDefaultConventions(); scan.TheCallingAssembly(); } private static void DoCustomConfiguration(ConfigurationExpression initializer) { foreach(var type in typeof(Program).Assembly.GetTypes()) { foreach(ConfiguresStructureMap attribute in type.GetCustomAttributes(typeof(ConfiguresStructureMap), false)) { attribute.Initialize(initializer, type); } } } } }