private BuildStatistics CreateCommitsStats(BuildCommits buildCommits, BuildInfo buildInfo) { var result = new BuildStatistics(buildInfo); var buildCommit = buildCommits.BuildCommit; var compareList = new List <Commit>(); compareList.Add(buildCommit); compareList.AddRange(buildCommits.PreviousCommits); var tracker = new FilesStatisticsTracker(); for (int i = 0; i < compareList.Count; i++) { var commitA = compareList.ElementAtOrDefault(i); var commitB = compareList.ElementAtOrDefault(i + 1); if (commitA == null || commitB == null) { break; } var commitStats = new CommitStats(); commitStats.LocalDateTime = commitA.Author.When.LocalDateTime; commitStats.Commit = commitA.Sha; commitStats.Author = commitA.Author.Name; var diff = this.repository.Diff.Compare <Patch>(commitB.Tree, commitA.Tree); foreach (var file in diff) { tracker.AddAuthor(file.Path, file.OldPath, commitA.Author.Name); tracker.IncreaseRevision(file.Path, file.OldPath); var fileStats = new FileStats(); fileStats.Path = file.Path; fileStats.OldPath = file.OldPath; fileStats.NumberOfModifiedLines = file.LinesAdded + file.LinesDeleted; fileStats.BuildResult = buildInfo.BuildResult; fileStats.GitObjectId = file.Oid.Sha; commitStats.AddFileStats(fileStats); } result.AddStats(commitStats); } foreach (var loopStat in result.CommitStats) { foreach (var loopFile in loopStat.FileStats) { loopFile.NumberOfDistinctCommitters = tracker.GetDisctinctAuthorsCount(loopFile.Path); loopFile.NumberOfRevisions = tracker.GetRevisionsCount(loopFile.Path); } } return(result); }
private static List <BuildCommits> CreateBuildCommits(List <Commit> buildCommits, Dictionary <string, List <BuildInfo> > buildsMap) { var result = new List <BuildCommits>(); foreach (var loopCommit in buildCommits) { var queue = new Queue <Commit>(); // Create a path from current commit to the next build commit. var start = loopCommit.Parents.LastOrDefault(); if (start != null) { queue.Enqueue(start); } var walkPath = new BuildCommits(loopCommit); bool nextBuildCommitFound = false; while (queue.Any()) { var toCompare = queue.Dequeue(); walkPath.PreviousCommits.Add(toCompare); if (buildsMap.ContainsKey(toCompare.Sha)) { nextBuildCommitFound = true; break; } var next = toCompare.Parents.LastOrDefault(); if (next != null) { queue.Enqueue(next); } } if (nextBuildCommitFound) { result.Add(walkPath); } } return(result); }