public async Task <string> BuildReleaseNotes() { LoadMilestones(); GetTargetMilestone(); var issues = await GetIssues(targetMilestone); var stringBuilder = new StringBuilder(); var previousMilestone = GetPreviousMilestone(); var numberOfCommits = await gitHubClient.GetNumberOfCommitsBetween(previousMilestone, targetMilestone); if (issues.Count > 0) { var issuesText = String.Format(issues.Count == 1 ? "{0} issue" : "{0} issues", issues.Count); if (numberOfCommits > 0) { var commitsLink = GetCommitsLink(previousMilestone); var commitsText = String.Format(numberOfCommits == 1 ? "{0} commit" : "{0} commits", numberOfCommits); stringBuilder.AppendFormat(@"As part of this release we had [{0}]({1}) which resulted in [{2}]({3}) being closed.", commitsText, commitsLink, issuesText, targetMilestone.HtmlUrl()); } else { stringBuilder.AppendFormat(@"As part of this release we had [{0}]({1}) closed.", issuesText, targetMilestone.HtmlUrl()); } } else if (numberOfCommits > 0) { var commitsLink = GetCommitsLink(previousMilestone); var commitsText = String.Format(numberOfCommits == 1 ? "{0} commit" : "{0} commits", numberOfCommits); stringBuilder.AppendFormat(@"As part of this release we had [{0}]({1}).", commitsText, commitsLink); } stringBuilder.AppendLine(); stringBuilder.AppendLine(targetMilestone.Description); stringBuilder.AppendLine(); AddIssues(stringBuilder, issues); await AddFooter(stringBuilder); return(stringBuilder.ToString()); }