Skip to content
This repository was archived by the owner on Aug 29, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/App/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ static async Task<int> PublishReleaseAsync(PublishSubOptions options)

private static async Task CreateRelease(GitHubClient github, string owner, string repository, string milestone, string asset)
{
var releaseNotesBuilder = new ReleaseNotesBuilder(github, owner, repository, milestone);
var releaseNotesBuilder = new ReleaseNotesBuilder(new DefaultGitHubClient(github, owner, repository), owner, repository, milestone);

var result = await releaseNotesBuilder.BuildReleaseNotes();

Expand Down
63 changes: 63 additions & 0 deletions src/Compiler/DefaultGitHubClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
namespace ReleaseNotesCompiler
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Octokit;

public class DefaultGitHubClient : IGitHubClient
{
GitHubClient gitHubClient;
string user;
string repository;

public DefaultGitHubClient(GitHubClient gitHubClient, string user, string repository)
{
this.gitHubClient = gitHubClient;
this.user = user;
this.repository = repository;
}

public async Task<int> GetNumberOfCommitsBetween(Milestone previousMilestone, Milestone currentMilestone)
{
try
{
if (previousMilestone == null)
{
var gitHubClientRepositoryCommitsCompare = await gitHubClient.Repository.Commits.Compare(user, repository, "master", currentMilestone.Title);
return gitHubClientRepositoryCommitsCompare.AheadBy;
}

var compareResult = await gitHubClient.Repository.Commits.Compare(user, repository, previousMilestone.Title, "master");
return compareResult.AheadBy;
}
catch (NotFoundException)
{
//If there is not tag yet the Compare will return a NotFoundException
//we can safely ignore
return 0;
}
}

public async Task<List<Issue>> GetIssues(Milestone targetMilestone)
{
var allIssues = await gitHubClient.AllIssuesForMilestone(targetMilestone);
return allIssues.Where(x => x.State == ItemState.Closed).ToList();
}

public List<Milestone> GetMilestones()
{
var milestonesClient = gitHubClient.Issue.Milestone;
var closed = milestonesClient.GetForRepository(user, repository, new MilestoneRequest
{
State = ItemState.Closed
}).Result;
var open = milestonesClient.GetForRepository(user, repository, new MilestoneRequest
{
State = ItemState.Open
}).Result;
return closed.Concat(open).ToList();
}
}
}
13 changes: 13 additions & 0 deletions src/Compiler/IGitHubClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace ReleaseNotesCompiler
{
using System.Collections.Generic;
using System.Threading.Tasks;
using Octokit;

public interface IGitHubClient
{
Task<int> GetNumberOfCommitsBetween(Milestone previousMilestone, Milestone currentMilestone);
Task<List<Issue>> GetIssues(Milestone targetMilestone);
List<Milestone> GetMilestones();
}
}
74 changes: 25 additions & 49 deletions src/Compiler/ReleaseNotesBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ namespace ReleaseNotesCompiler

public class ReleaseNotesBuilder
{
GitHubClient gitHubClient;
IGitHubClient gitHubClient;
string user;
string repository;
string milestoneTitle;
List<Milestone> milestones;
Milestone targetMilestone;

public ReleaseNotesBuilder(GitHubClient gitHubClient, string user, string repository, string milestoneTitle)
public ReleaseNotesBuilder(IGitHubClient gitHubClient, string user, string repository, string milestoneTitle)
{
this.gitHubClient = gitHubClient;
this.user = user;
Expand All @@ -28,27 +28,35 @@ public ReleaseNotesBuilder(GitHubClient gitHubClient, string user, string reposi

public async Task<string> BuildReleaseNotes()
{
GetMilestones();
LoadMilestones();

GetTargetMilestone();
var issues = await GetIssues(targetMilestone);
var stringBuilder = new StringBuilder();
var previousMilestone = GetPreviousMilestone();
var numberOfCommits = await gitHubClient.GetNumberOfCommitsBetween(previousMilestone, targetMilestone);

var issuesText = String.Format(issues.Count == 1 ? "{0} issue" : "{0} issues", issues.Count);

var numberOfCommits = await GetNumberOfCommits(previousMilestone);
if (numberOfCommits > 0)
if (issues.Count > 0)
{
var commitsLink = GetCommitsLink(previousMilestone);
var issuesText = String.Format(issues.Count == 1 ? "{0} issue" : "{0} issues", issues.Count);

var commitsText = String.Format(numberOfCommits == 1 ? "{0} commit" : "{0} commits", numberOfCommits);
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());
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
else if (numberOfCommits > 0)
{
stringBuilder.AppendFormat(@"As part of this release we had [{0}]({1}) closed.", issuesText, targetMilestone.HtmlUrl());
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();

Expand All @@ -62,27 +70,6 @@ public async Task<string> BuildReleaseNotes()
return stringBuilder.ToString();
}

async Task<int> GetNumberOfCommits(Milestone previousMilestone)
{
try
{
if (previousMilestone == null)
{
var gitHubClientRepositoryCommitsCompare = await gitHubClient.Repository.Commits.Compare(user, repository, "master", targetMilestone.Title);
return gitHubClientRepositoryCommitsCompare.AheadBy;
}

var compareResult = await gitHubClient.Repository.Commits.Compare(user, repository, previousMilestone.Title, "master");
return compareResult.AheadBy;
}
catch (NotFoundException)
{
//If there is not tag yet the Compare will return a NotFoundException
//we can safely ignore
return 0;
}
}

Milestone GetPreviousMilestone()
{
var currentVersion = targetMilestone.Version();
Expand Down Expand Up @@ -131,33 +118,22 @@ static async Task AddFooter(StringBuilder stringBuilder)
}
}

void GetMilestones()
void LoadMilestones()
{
var milestonesClient = gitHubClient.Issue.Milestone;
var closed = milestonesClient.GetForRepository(user, repository,new MilestoneRequest
{
State = ItemState.Closed
}).Result;
var open = milestonesClient.GetForRepository(user, repository,new MilestoneRequest
{
State = ItemState.Open
}).Result;
milestones = closed.Concat(open).ToList();
milestones = gitHubClient.GetMilestones();
}

async Task<List<Issue>> GetIssues(Milestone milestone)
{
var allIssues = await gitHubClient.AllIssuesForMilestone(milestone);
var issues = new List<Issue>();
foreach (var issue in allIssues.Where(x => x.State == ItemState.Closed))
var issues = await gitHubClient.GetIssues(milestone);
foreach (var issue in issues)
{
CheckForValidLabels(issue);
issues.Add(issue);
}
return issues;
}

void CheckForValidLabels(Issue issue)
static void CheckForValidLabels(Issue issue)
{
var count = issue.Labels.Count(l =>
l.Name == "Bug" ||
Expand Down
2 changes: 2 additions & 0 deletions src/Compiler/ReleaseNotesCompiler.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="DefaultGitHubClient.cs" />
<Compile Include="IGitHubClient.cs" />
<Compile Include="ReleaseManager.cs" />
<Compile Include="ReleaseNotesBuilder.cs" />
<Compile Include="OctokitExtensions.cs" />
Expand Down
35 changes: 35 additions & 0 deletions src/Tests/FakeGitHubClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
namespace ReleaseNotesCompiler.Tests
{
using System.Collections.Generic;
using System.Threading.Tasks;
using Octokit;
using IGitHubClient = ReleaseNotesCompiler.IGitHubClient;

public class FakeGitHubClient : IGitHubClient
{
public List<Milestone> Milestones { get; set; }
public List<Issue> Issues { get; set; }
public int NumberOfCommits { get; set; }

public FakeGitHubClient()
{
Milestones = new List<Milestone>();
Issues = new List<Issue>();
}

public Task<int> GetNumberOfCommitsBetween(Milestone previousMilestone, Milestone currentMilestone)
{
return Task.FromResult(NumberOfCommits);
}

public Task<List<Issue>> GetIssues(Milestone targetMilestone)
{
return Task.FromResult(Issues);
}

public List<Milestone> GetMilestones()
{
return Milestones;
}
}
}
41 changes: 41 additions & 0 deletions src/Tests/ReleaseNotesBuilderIntegrationTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
namespace ReleaseNotesCompiler.Tests
{
using System.Diagnostics;
using NUnit.Framework;
using ReleaseNotesCompiler;

[TestFixture]
public class ReleaseNotesBuilderIntegrationTests
{
[Test]
[Explicit]
public async void SingleMilestone()
{
var gitHubClient = ClientBuilder.Build();

var releaseNotesBuilder = new ReleaseNotesBuilder(new DefaultGitHubClient(gitHubClient, "Particular", "NServiceBus.Unity"), "Particular", "NServiceBus.Unity", "6.0.1");
var result = await releaseNotesBuilder.BuildReleaseNotes();
Debug.WriteLine(result);
ClipBoardHelper.SetClipboard(result);
}

[Test]
[Explicit]
public async void SingleMilestone3()
{
var gitHubClient = ClientBuilder.Build();

var releaseNotesBuilder = new ReleaseNotesBuilder(new DefaultGitHubClient(gitHubClient, "Particular", "ServiceControl"), "Particular", "ServiceControl", "1.0.0-Beta4");
var result = await releaseNotesBuilder.BuildReleaseNotes();
Debug.WriteLine(result);
ClipBoardHelper.SetClipboard(result);
}

[Test]
[Explicit]
public void OctokitTests()
{
ClientBuilder.Build();
}
}
}
Loading