private Release BuildRelease(string milestoneNumber)
        {
            var milestone = (GithubMilestone)null;
            var issues    = (IList <GithubIssue>)null;

            // Fetch the data that we need
            if (string.IsNullOrEmpty(milestoneNumber) || milestoneNumber == NextMilestone)
            {
                milestone = _milestoneProvider.GetMilestone(NextMilestone);
                issues    = milestone != null?_issueProvider.GetAllIssuesByMilestoneThatHasTag(milestone.Number, _packageProvider.GetAllPackagesTags()) : new List <GithubIssue>();

                if (!issues.Any())
                {
                    milestone = _milestoneProvider.GetLatestMilestoneWithIssues("closed");
                    issues    = milestone != null?_issueProvider.GetAllIssuesByMilestoneThatHasTag(milestone.Number, _packageProvider.GetAllPackagesTags()) : new List <GithubIssue>();
                }
            }
            else
            {
                milestone = _milestoneProvider.GetMilestone(milestoneNumber);
                issues    = milestone != null?_issueProvider.GetAllIssuesByMilestoneThatHasTag(milestone.Number, _packageProvider.GetAllPackagesTags()) : new List <GithubIssue>();
            }

            var packageCategories = _packageProvider.GetAllPackagesGroupedByCategory();
            var packageTags       = _packageProvider.GetAllPackagesTags();

            // Lets map it to the format we need
            var release = new Release
            {
                Milestone               = MapMilestone(milestone),
                IssueReporters          = MapIssueReporters(issues),
                PullRequestContributors = MapPullRequestContributors(issues, packageTags),
                PackageCategories       = MapCategories(packageCategories, packageTags, issues)
            };

            return(release);
        }