예제 #1
0
        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);
        }
예제 #2
0
        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);
        }