Skip to content
This repository was archived by the owner on Aug 29, 2020. It is now read-only.
14 changes: 3 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,9 @@ Generates release notes for a milestone in a GitHub repo based on issues associa

### Conventions

* All closed issues for a milestone will be included.
* All issues must have exactly one `Type: xxx` label. E.g. `Type: Bug`, `Type: Feature`, `Type: Refactoring`, etc. Only issues labelled `Type: Bug` and `Type: Feature `will be included in the release notes. Issues with other `Type: xxx` labels will be included in the milestone but excluded from the release notes.
* All closed issues/PR's for a milestone will be included.
* Issues/PR's with a label `Type: Bug` will be included in a `Bugs` section

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what about the Bug label (without the type)?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will fix

* Issues/PR's not labeled as `Type: Bug` will be included in a `Features/Improvements` section
* Milestones are named `{major.minor.patch}`.
* The version is picked up from the build number (GFV) and that info is used to find the milestone.
* Release notes are generated as markdown.

### Plans

* The build server will compile the release notes either for each commit or daily
* Build will fail if release notes can't be generated
* No milestone found is considered a exception
* Want to be able to output in a manner compatible with http://www.semanticreleasenotes.org/
* We'll generate release notes as X for inclusion in our nugets
* For each milestone a corresponding GitHub release will be created with the same name and set to tag master with the same tag when published
5 changes: 3 additions & 2 deletions src/App/FodyWeavers.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<Costura/>
<Costura/>

</Weavers>
25 changes: 12 additions & 13 deletions src/App/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ static async Task<int> PublishReleaseAsync(PublishSubOptions options)
}
}

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

Expand All @@ -175,56 +175,55 @@ private static async Task CreateRelease(GitHubClient github, string owner, strin
if (!string.IsNullOrEmpty(targetCommitish))
releaseUpdate.TargetCommitish = targetCommitish;

var release = await github.Release.Create(owner, repository, releaseUpdate);
var release = await github.Repository.Release.Create(owner, repository, releaseUpdate);

if (File.Exists(asset))
{
var upload = new ReleaseAssetUpload { FileName = Path.GetFileName(asset), ContentType = "application/octet-stream", RawData = File.Open(asset, FileMode.Open) };

await github.Release.UploadAsset(release, upload);
await github.Repository.Release.UploadAsset(release, upload);
}
}

private static async Task AttachToRelease(GitHubClient github, string owner, string repository, string milestone, string asset)
static async Task AttachToRelease(GitHubClient github, string owner, string repository, string milestone, string asset)
{
if (!File.Exists(asset))
return;

var releases = await github.Release.GetAll(owner, repository);
var releases = await github.Repository.Release.GetAll(owner, repository);
var release = releases.FirstOrDefault(r => r.Name == milestone);
if (release == null)
return;

var upload = new ReleaseAssetUpload { FileName = Path.GetFileName(asset), ContentType = "application/octet-stream", RawData = File.Open(asset, FileMode.Open) };

await github.Release.UploadAsset(release, upload);
await github.Repository.Release.UploadAsset(release, upload);
}

private static async Task CloseMilestone(GitHubClient github, string owner, string repository, string milestoneTitle)
static async Task CloseMilestone(GitHubClient github, string owner, string repository, string milestoneTitle)
{
var milestoneClient = github.Issue.Milestone;
var openMilestones = await milestoneClient.GetAllForRepository(owner, repository, new MilestoneRequest { State = ItemState.Open });
var openMilestones = await milestoneClient.GetAllForRepository(owner, repository, new MilestoneRequest { State = ItemStateFilter.Open });
var milestone = openMilestones.FirstOrDefault(m => m.Title == milestoneTitle);
if (milestone == null)
return;

await milestoneClient.Update(owner, repository, milestone.Number, new MilestoneUpdate { State = ItemState.Closed });
}

private static async Task PublishRelease(GitHubClient github, string owner, string repository, string milestone)
static async Task PublishRelease(GitHubClient github, string owner, string repository, string milestone)
{
var releases = await github.Release.GetAll(owner, repository);
var releases = await github.Repository.Release.GetAll(owner, repository);
var release = releases.FirstOrDefault(r => r.Name == milestone);
if (release == null)
return;

var releaseUpdate = new ReleaseUpdate
{
Draft = false,

Draft = false
};

await github.Release.Edit(owner, repository, release.Id, releaseUpdate);
await github.Repository.Release.Edit(owner, repository, release.Id, releaseUpdate);
}
}
}
32 changes: 17 additions & 15 deletions src/App/ReleaseNotesCompiler.CLI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ReleaseNotesCompiler.CLI</RootNamespace>
<AssemblyName>ReleaseNotesCompiler.CLI</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<NuGetPackageImportStamp>fe4af16d</NuGetPackageImportStamp>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
Expand All @@ -38,8 +40,8 @@
<Reference Include="CommandLine">
<HintPath>..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll</HintPath>
</Reference>
<Reference Include="Octokit, Version=0.16.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Octokit.0.16.0\lib\net45\Octokit.dll</HintPath>
<Reference Include="Octokit, Version=0.22.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Octokit.0.22.0\lib\net45\Octokit.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
Expand Down Expand Up @@ -70,14 +72,6 @@
<Content Include="FodyWeavers.xml" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\GitVersionTask.1.2.0\Build\GitVersionTask.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GitVersionTask.1.2.0\Build\GitVersionTask.targets'))" />
<Error Condition="!Exists('..\packages\NuGetPackager.0.1.3\build\NuGetPackager.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NuGetPackager.0.1.3\build\NuGetPackager.targets'))" />
<Error Condition="!Exists('..\packages\Fody.1.28.3\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.1.28.3\build\Fody.targets'))" />
</Target>
<UsingTask TaskName="CosturaCleanup" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" TaskFactory="CodeTaskFactory">
<ParameterGroup>
<Config Output="false" Required="true" ParameterType="Microsoft.Build.Framework.ITaskItem" />
Expand Down Expand Up @@ -114,7 +108,15 @@ foreach (var item in filesToCleanup)
<Target Name="CleanReferenceCopyLocalPaths" AfterTargets="AfterBuild;NonWinFodyTarget">
<CosturaCleanup Config="FodyWeavers.xml" Files="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')" />
</Target>
<Import Project="..\packages\GitVersionTask.1.2.0\Build\GitVersionTask.targets" Condition="Exists('..\packages\GitVersionTask.1.2.0\Build\GitVersionTask.targets')" />
<Import Project="..\packages\NuGetPackager.0.1.3\build\NuGetPackager.targets" Condition="Exists('..\packages\NuGetPackager.0.1.3\build\NuGetPackager.targets')" />
<Import Project="..\packages\Fody.1.28.3\build\Fody.targets" Condition="Exists('..\packages\Fody.1.28.3\build\Fody.targets')" />
<Import Project="..\packages\Fody.1.29.4\build\dotnet\Fody.targets" Condition="Exists('..\packages\Fody.1.29.4\build\dotnet\Fody.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Fody.1.29.4\build\dotnet\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.1.29.4\build\dotnet\Fody.targets'))" />
<Error Condition="!Exists('..\packages\GitVersionTask.3.6.4\build\dotnet\GitVersionTask.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\GitVersionTask.3.6.4\build\dotnet\GitVersionTask.targets'))" />
<Error Condition="!Exists('..\packages\NuGetPackager.0.6.0\build\NuGetPackager.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NuGetPackager.0.6.0\build\NuGetPackager.targets'))" />
</Target>
<Import Project="..\packages\GitVersionTask.3.6.4\build\dotnet\GitVersionTask.targets" Condition="Exists('..\packages\GitVersionTask.3.6.4\build\dotnet\GitVersionTask.targets')" />
<Import Project="..\packages\NuGetPackager.0.6.0\build\NuGetPackager.targets" Condition="Exists('..\packages\NuGetPackager.0.6.0\build\NuGetPackager.targets')" />
</Project>
10 changes: 5 additions & 5 deletions src/App/packages.config
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommandLineParser" version="1.9.71" targetFramework="net45" />
<package id="Costura.Fody" version="1.3.2.0" targetFramework="net45" developmentDependency="true" />
<package id="Fody" version="1.28.3" targetFramework="net45" developmentDependency="true" />
<package id="GitVersionTask" version="1.2.0" targetFramework="net45" developmentDependency="true" />
<package id="NuGetPackager" version="0.1.3" targetFramework="net45" />
<package id="Octokit" version="0.16.0" targetFramework="net45" />
<package id="Costura.Fody" version="1.3.3.0" targetFramework="net45" developmentDependency="true" />
<package id="Fody" version="1.29.4" targetFramework="net45" developmentDependency="true" />
<package id="GitVersionTask" version="3.6.4" targetFramework="net45" developmentDependency="true" />
<package id="NuGetPackager" version="0.6.0" targetFramework="net45" developmentDependency="true" />
<package id="Octokit" version="0.22.0" targetFramework="net45" />
</packages>
18 changes: 7 additions & 11 deletions src/Compiler/DefaultGitHubClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ public async Task<int> GetNumberOfCommitsBetween(Milestone previousMilestone, Mi
{
if (previousMilestone == null)
{
var gitHubClientRepositoryCommitsCompare = await gitHubClient.Repository.Commits.Compare(user, repository, "master", currentMilestone.Title);
var gitHubClientRepositoryCommitsCompare = await gitHubClient.Repository.Commit.Compare(user, repository, "master", currentMilestone.Title);
return gitHubClientRepositoryCommitsCompare.AheadBy;
}

var compareResult = await gitHubClient.Repository.Commits.Compare(user, repository, previousMilestone.Title, "master");
var compareResult = await gitHubClient.Repository.Commit.Compare(user, repository, previousMilestone.Title, "master");
return compareResult.AheadBy;
}
catch (NotFoundException)
Expand All @@ -45,18 +45,14 @@ public async Task<List<Issue>> GetIssues(Milestone targetMilestone)
return allIssues.Where(x => x.State == ItemState.Closed).ToList();
}

public List<Milestone> GetMilestones()
public Task<IReadOnlyList<Milestone>> GetMilestones()
{
var milestonesClient = gitHubClient.Issue.Milestone;
var closed = milestonesClient.GetAllForRepository(user, repository, new MilestoneRequest
return milestonesClient.GetAllForRepository(user, repository, new MilestoneRequest
{
State = ItemState.Closed
}).Result;
var open = milestonesClient.GetAllForRepository(user, repository, new MilestoneRequest
{
State = ItemState.Open
}).Result;
return closed.Concat(open).ToList();
State = ItemStateFilter.All
});

}
}
}
2 changes: 1 addition & 1 deletion src/Compiler/IGitHubClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ public interface IGitHubClient
{
Task<int> GetNumberOfCommitsBetween(Milestone previousMilestone, Milestone currentMilestone);
Task<List<Issue>> GetIssues(Milestone targetMilestone);
List<Milestone> GetMilestones();
Task<IReadOnlyList<Milestone>> GetMilestones();
}
}
13 changes: 13 additions & 0 deletions src/Compiler/IssueExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace ReleaseNotesCompiler
{
using System.Linq;
using Octokit;

static class IssueExtensions
{
public static bool IsBug(this Issue issue)
{
return issue.Labels.Any(label => label.Name == "Type: Bug" || label.Name == "Bug");
}
}
}
4 changes: 2 additions & 2 deletions src/Compiler/OctokitExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ public static async Task<IEnumerable<Issue>> AllIssuesForMilestone(this GitHubCl
var closedIssueRequest = new RepositoryIssueRequest
{
Milestone = milestone.Number.ToString(),
State = ItemState.Closed
State = ItemStateFilter.Closed
};
var openIssueRequest = new RepositoryIssueRequest
{
Milestone = milestone.Number.ToString(),
State = ItemState.Open
State = ItemStateFilter.Open
};
var parts = milestone.Url.AbsolutePath.Split('/');
var user = parts[2];
Expand Down
114 changes: 0 additions & 114 deletions src/Compiler/ReleaseManager.cs

This file was deleted.

Loading