// TODO Fix name of method GatherRepoMetrics [Refactor] [Hot :t-rex:]
        private static RepositoryMetrics GatherRepoMetrics(TrackedRepo repo)
        {
            if (!Directory.Exists(repo.Path))
            {
                Console.WriteLine("Repo folder {0} not found", repo.Path);
                return(null);
            }
            var result = new RepositoryMetrics();

            result.Name = repo.Name;
            var projFile = GetProjFullFilename(repo.Path);

            PrepareMetricsXml(projFile);



            XmlDocument doc = new XmlDocument();

            doc.Load(TempXmlPath);
            var enumerator = doc.GetElementsByTagName("Assembly").GetEnumerator();

            if (!enumerator.MoveNext())
            {
                return(null);
            }

            var node = (XmlElement)enumerator.Current;

            return(ParseMetrics(repo.Name, node.GetElementsByTagName("Metrics").Item(0).ChildNodes.GetEnumerator()));
        }
        private static RepositoryMetrics ParseMetrics(string repoName, IEnumerator enumerator)
        {
            var metrics = new RepositoryMetrics();

            metrics.Name = repoName;
            enumerator.Reset();
            while (enumerator.MoveNext())
            {
                var item = enumerator.Current as XmlElement;
                var name = item.GetAttribute("Name");
                int value;
                if (int.TryParse(item.GetAttribute("Value"), out value))
                {
                }
                switch (name)
                {
                case "MaintainabilityIndex":
                    metrics.MaintainabilityIndex = value;
                    break;

                case "CyclomaticComplexity":
                    metrics.CyclomaticComplexity = value;
                    break;

                case "ClassCoupling":
                    metrics.ClassCoupling = value;
                    break;

                case "DepthOfInheritance":
                    metrics.DepthOfInheritance = value;
                    break;

                case "SourceLines":
                    metrics.SourceLines = value;
                    break;

                case "ExecutableLines":
                    metrics.ExecutableLines = value;
                    break;
                }
            }
            return(metrics);
        }
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Specify file config file.");
                return;
            }

            if (!File.Exists(args[0]))
            {
                Console.WriteLine("File not found");
                return;
            }
            Settings settings;

            try
            {
                settings = JsonConvert.DeserializeObject <Settings>(File.ReadAllText(args[0]));
            }
            catch (Exception)
            {
                Console.WriteLine("Failed to parse settings.");
                return;
            }
            var result  = new Dictionary <DateTime, List <RepositoryMetrics> >();
            var curDate = settings.StartDate;

            Console.WriteLine("Preparing repositories.");
            settings.TrackedRepos.ForEach(item =>
            {
                ResetRepo(item.Path);
            });

            while (curDate <= settings.EndDate)
            {
                Console.WriteLine("Parsing {0}", curDate);
                var list = new List <RepositoryMetrics>();
                RepositoryMetrics sum = new RepositoryMetrics
                {
                    Name = "Total"
                };
                list.Add(sum);

                settings.TrackedRepos.ForEach(item =>
                {
                    if (CheckoutRepoOnDate(item.Path, item.Branch, curDate))
                    {
                        var metrics = GatherRepoMetrics(item);
                        sum.Add(metrics);
                    }
                });
                result.Add(curDate, list);
                curDate = curDate.AddDays(1);
            }

            Console.WriteLine("Resetting repositories back to last commit.");
            settings.TrackedRepos.ForEach(item =>
            {
                CheckoutRepoOnDate(item.Path, "master", DateTime.Now);
            });
            Console.WriteLine("------------------------------------------------------------");
            foreach (var pair in result)
            {
                Console.WriteLine(pair.Key);
                pair.Value.ForEach(Console.WriteLine);
            }
            Console.ReadKey();
        }