Skip to content

Commit cb571d1

Browse files
Move ChangeLogBuilder.cs to the build project
1 parent d9ecba9 commit cb571d1

File tree

9 files changed

+125
-445
lines changed

9 files changed

+125
-445
lines changed

build/Build.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,8 @@
77
<ItemGroup>
88
<PackageReference Include="Cake.Frosting" Version="3.0.0" />
99
<PackageReference Include="Cake.FileHelpers" Version="6.0.0" />
10+
<PackageReference Include="Ben.Demystifier" Version="0.1.1" />
11+
<PackageReference Include="JetBrains.Annotations" Version="11.1.0" />
12+
<PackageReference Include="Octokit" Version="0.29.0" />
1013
</ItemGroup>
1114
</Project>

docs/_changelog/ChangeLogBuilder/MarkdownBuilder.cs renamed to build/ChangeLogBuilder.cs

Lines changed: 110 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,104 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Collections.Immutable;
4+
using System.Diagnostics;
5+
using System.IO;
46
using System.Linq;
57
using System.Text;
68
using System.Threading.Tasks;
9+
using Cake.Core.IO;
10+
using JetBrains.Annotations;
711
using Octokit;
812

9-
namespace ChangeLogBuilder
13+
namespace Build;
14+
15+
public static class OctokitExtensions
1016
{
17+
public static string ToStr(this User user, string prefix) => user != null
18+
? $" ({prefix} [@{user.Login}]({user.HtmlUrl}))"
19+
: "";
20+
21+
private static string ToStr(this Author user, string prefix) => user != null
22+
? $" ({prefix} {user.ToLink()})"
23+
: "";
24+
25+
private static string ToStr(this Committer user, string prefix) => user != null
26+
? $" ({prefix} {user.Name})"
27+
: "";
28+
29+
public static string ToLink(this Author user) => $"[@{user.Login}]({user.HtmlUrl})";
30+
31+
public static string ToLinkWithName(this Author user, string name) => $"[@{user.Login} ({name})]({user.HtmlUrl})";
32+
33+
public static string ToCommitMessage(this Commit commit)
34+
{
35+
var message = commit.Message.Trim().Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
36+
.FirstOrDefault() ?? "";
37+
return message.Length > 80 ? message.Substring(0, 77) + "..." : message;
38+
}
39+
40+
public static string ToLink(this GitHubCommit commit) => $"[{commit.Sha.Substring(0, 6)}]({commit.HtmlUrl})";
41+
42+
public static string ToByStr(this GitHubCommit commit)
43+
{
44+
if (commit.Author != null)
45+
return commit.Author.ToStr("by");
46+
return commit.Commit.Author != null ? commit.Commit.Author.ToStr("by") : "";
47+
}
48+
}
49+
50+
public class ChangeLogBuilder
51+
{
52+
public class Config
53+
{
54+
[PublicAPI] public string ProductHeader => Environment.GetEnvironmentVariable("GITHUB_PRODUCT");
55+
[PublicAPI] public string Token => Environment.GetEnvironmentVariable("GITHUB_TOKEN");
56+
57+
[PublicAPI] public string RepoOwner => "dotnet";
58+
[PublicAPI] public string RepoName => "BenchmarkDotNet";
59+
[PublicAPI] public string CurrentMilestone { get; }
60+
61+
[PublicAPI] public string PreviousMilestone { get; }
62+
[PublicAPI] public string LastCommit { get; }
63+
64+
public void Deconstruct(out string repoOwner, out string repoName, out string currentMilestone,
65+
out string previousMilestone, out string lastCommit)
66+
{
67+
repoOwner = RepoOwner;
68+
repoName = RepoName;
69+
currentMilestone = CurrentMilestone;
70+
previousMilestone = PreviousMilestone;
71+
lastCommit = LastCommit;
72+
}
73+
74+
public Config(string[] args)
75+
{
76+
CurrentMilestone = args[0];
77+
PreviousMilestone = args[1];
78+
LastCommit = args.Length <= 2 ? CurrentMilestone : args[2];
79+
}
80+
81+
public Config(string currentMilestone, string previousMilestone, string lastCommit)
82+
{
83+
CurrentMilestone = currentMilestone;
84+
PreviousMilestone = previousMilestone;
85+
LastCommit = lastCommit;
86+
}
87+
}
88+
89+
public class AuthorEqualityComparer : IEqualityComparer<Author>
90+
{
91+
public static readonly IEqualityComparer<Author> Default = new AuthorEqualityComparer();
92+
93+
public bool Equals(Author x, Author y) => x.Login == y.Login;
94+
95+
public int GetHashCode(Author author) => author.Login.GetHashCode();
96+
}
97+
1198
public class MarkdownBuilder
1299
{
13100
private readonly Config config;
14-
private readonly StringBuilder builder;
101+
private readonly StringBuilder builder;
15102

16103
public static async Task<string> Build(Config config)
17104
{
@@ -27,7 +114,7 @@ private MarkdownBuilder(Config config)
27114
private async Task<string> Build()
28115
{
29116
var (repoOwner, repoName, milestone, previousMilestone, lastCommit) = config;
30-
117+
31118
var client = new GitHubClient(new ProductHeaderValue(config.ProductHeader));
32119
var tokenAuth = new Credentials(config.Token);
33120
client.Credentials = tokenAuth;
@@ -48,7 +135,7 @@ private async Task<string> Build()
48135

49136
return builder.ToString();
50137
}
51-
138+
52139
var issueRequest = new RepositoryIssueRequest
53140
{
54141
State = ItemStateFilter.Closed
@@ -72,7 +159,7 @@ private async Task<string> Build()
72159

73160
var compare = await client.Repository.Commit.Compare(repoOwner, repoName, previousMilestone, lastCommit);
74161
var commits = compare.Commits;
75-
162+
76163
var authorNames = new Dictionary<string, string>();
77164
foreach (var contributor in commits.Select(commit => commit.Author))
78165
if (contributor != null && !authorNames.ContainsKey(contributor.Login))
@@ -81,6 +168,7 @@ private async Task<string> Build()
81168
var name = user?.Name;
82169
authorNames[contributor.Login] = string.IsNullOrWhiteSpace(name) ? contributor.Login : name;
83170
}
171+
84172
var contributors = compare.Commits
85173
.Select(commit => commit.Author)
86174
.Where(author => author != null)
@@ -89,7 +177,7 @@ private async Task<string> Build()
89177
.ToImmutableList();
90178

91179
var milestoneHtmlUlr = $"https://github.com/{repoOwner}/{repoName}/issues?q=milestone:{milestone}";
92-
180+
93181
builder.AppendLine("## Milestone details");
94182
builder.AppendLine();
95183
builder.AppendLine($"In the [{milestone}]({milestoneHtmlUlr}) scope, ");
@@ -105,7 +193,7 @@ private async Task<string> Build()
105193
AppendList("Commits", commits, commit =>
106194
$"{commit.ToLink()} {commit.Commit.ToCommitMessage()}{commit.ToByStr()}");
107195
AppendList("Contributors", contributors, contributor =>
108-
$"{authorNames[contributor.Login]} ({contributor.ToLink()})".Trim(),
196+
$"{authorNames[contributor.Login]} ({contributor.ToLink()})".Trim(),
109197
"Thank you very much!");
110198

111199
return builder.ToString();
@@ -127,4 +215,18 @@ private void AppendList<T>(string title, IReadOnlyList<T> items, Func<T, string>
127215
builder.AppendLine();
128216
}
129217
}
130-
}
218+
219+
public static async Task Run(DirectoryPath path, string currentMilestone, string previousMilestone, string lastCommit)
220+
{
221+
try
222+
{
223+
var config = new Config(currentMilestone, previousMilestone, lastCommit);
224+
var releaseNotes = await MarkdownBuilder.Build(config);
225+
await File.WriteAllTextAsync(path.Combine(config.CurrentMilestone + ".md").FullPath, releaseNotes);
226+
}
227+
catch (Exception e)
228+
{
229+
await Console.Error.WriteLineAsync(e.Demystify().ToString());
230+
}
231+
}
232+
}

build/Program.cs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.IO;
22
using System.Linq;
33
using System.Text;
4+
using Build;
45
using Cake.Common;
56
using Cake.Common.Build;
67
using Cake.Common.Build.AppVeyor;
@@ -144,13 +145,7 @@ public void DocfxChangelogDownload(string version, string versionPrevious, strin
144145
this.Information("DocfxChangelogDownload: " + version);
145146
// Required environment variables: GITHUB_PRODUCT, GITHUB_TOKEN
146147
var changeLogBuilderDirectory = ChangeLogGenDirectory.Combine("ChangeLogBuilder");
147-
var changeLogBuilderProjectFile = changeLogBuilderDirectory.CombineWithFilePath("ChangeLogBuilder.csproj");
148-
this.DotNetRun(changeLogBuilderProjectFile.FullPath,
149-
new ProcessArgumentBuilder().Append(version).Append(versionPrevious).Append(lastCommit),
150-
new DotNetRunSettings()
151-
{
152-
WorkingDirectory = changeLogBuilderDirectory
153-
});
148+
ChangeLogBuilder.Run(changeLogBuilderDirectory, version, versionPrevious, lastCommit).Wait();
154149

155150
var src = changeLogBuilderDirectory.CombineWithFilePath(version + ".md");
156151
var dest = ChangeLogGenDirectory.Combine("details").CombineWithFilePath(version + ".md");
@@ -456,20 +451,19 @@ public override void Run(BuildContext context)
456451
context.DocfxChangelogDownload(
457452
DocumentationHelper.BdnAllVersions[i],
458453
DocumentationHelper.BdnAllVersions[i - 1]);
459-
} else if (context.Argument("LatestVersions", false))
454+
}
455+
else if (context.Argument("LatestVersions", false))
460456
{
457+
for (int i = DocumentationHelper.BdnAllVersions.Length - 3; i < DocumentationHelper.BdnAllVersions.Length; i++)
458+
context.DocfxChangelogDownload(
459+
DocumentationHelper.BdnAllVersions[i],
460+
DocumentationHelper.BdnAllVersions[i - 1]);
461461
}
462462

463-
if (!context.Argument("StableVersions", false))
464-
context.DocfxChangelogDownload(
465-
DocumentationHelper.BdnNextVersion,
466-
DocumentationHelper.BdnAllVersions.Last(),
467-
"HEAD");
468-
469-
for (int i = DocumentationHelper.BdnAllVersions.Length - 3; i < DocumentationHelper.BdnAllVersions.Length; i++)
470-
context.DocfxChangelogDownload(
471-
DocumentationHelper.BdnAllVersions[i],
472-
DocumentationHelper.BdnAllVersions[i - 1]);
463+
context.DocfxChangelogDownload(
464+
DocumentationHelper.BdnNextVersion,
465+
DocumentationHelper.BdnAllVersions.Last(),
466+
"HEAD");
473467
}
474468
}
475469

0 commit comments

Comments
 (0)