Skip to content

Commit

Permalink
Extracting Changelog module into a separate file in build projects.
Browse files Browse the repository at this point in the history
  • Loading branch information
nikoyak committed Jun 6, 2023
1 parent 500391c commit cab9433
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 443 deletions.
125 changes: 125 additions & 0 deletions Content/Library/build/Changelog.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
module Changelog

open System
open Fake.Core
open Fake.IO

let isEmptyChange =
function
| Changelog.Change.Added s
| Changelog.Change.Changed s
| Changelog.Change.Deprecated s
| Changelog.Change.Fixed s
| Changelog.Change.Removed s
| Changelog.Change.Security s
| Changelog.Change.Custom(_, s) -> String.IsNullOrWhiteSpace s.CleanedText

let tagFromVersionNumber versionNumber = sprintf "v%s" versionNumber

let failOnEmptyChangelog (latestEntry: Changelog.ChangelogEntry) =
let isEmpty =
(latestEntry.Changes
|> Seq.forall isEmptyChange)
|| latestEntry.Changes
|> Seq.isEmpty

if isEmpty then
failwith
"No changes in CHANGELOG. Please add your changes under a heading specified in https://keepachangelog.com/"

let mkLinkReference (newVersion: SemVerInfo) (changelog: Changelog.Changelog) gitHubRepoUrl =
if
changelog.Entries
|> List.isEmpty
then
// No actual changelog entries yet: link reference will just point to the Git tag
sprintf
"[%s]: %s/releases/tag/%s"
newVersion.AsString
gitHubRepoUrl
(tagFromVersionNumber newVersion.AsString)
else
let versionTuple version =
(version.Major, version.Minor, version.Patch)
// Changelog entries come already sorted, most-recent first, by the Changelog module
let prevEntry =
changelog.Entries
|> List.skipWhile (fun entry ->
entry.SemVer.PreRelease.IsSome
&& versionTuple entry.SemVer = versionTuple newVersion
)
|> List.tryHead

let linkTarget =
match prevEntry with
| Some entry ->
sprintf
"%s/compare/%s...%s"
gitHubRepoUrl
(tagFromVersionNumber entry.SemVer.AsString)
(tagFromVersionNumber newVersion.AsString)
| None ->
sprintf
"%s/releases/tag/%s"
gitHubRepoUrl
(tagFromVersionNumber newVersion.AsString)

sprintf "[%s]: %s" newVersion.AsString linkTarget

let mkReleaseNotes changelog (latestEntry: Changelog.ChangelogEntry) gitHubRepoUrl =
let linkReference = mkLinkReference latestEntry.SemVer changelog gitHubRepoUrl

if String.isNullOrEmpty linkReference then
latestEntry.ToString()
else
// Add link reference target to description before building release notes, since in main changelog file it's at the bottom of the file
let description =
match latestEntry.Description with
| None -> linkReference
| Some desc when desc.Contains(linkReference) -> desc
| Some desc -> sprintf "%s\n\n%s" (desc.Trim()) linkReference

{ latestEntry with
Description = Some description
}
.ToString()

let getVersionNumber envVarName ctx =
let args = ctx.Context.Arguments

let verArg =
args
|> List.tryHead
|> Option.defaultWith (fun () -> Environment.environVarOrDefault envVarName "")

if SemVer.isValid verArg then
verArg
elif
verArg.StartsWith("v")
&& SemVer.isValid verArg.[1..]
then
let target = ctx.Context.FinalTarget

Trace.traceImportantfn
"Please specify a version number without leading 'v' next time, e.g. \"./build.sh %s %s\" rather than \"./build.sh %s %s\""
target
verArg.[1..]
target
verArg

verArg.[1..]
elif String.isNullOrEmpty verArg then
let target = ctx.Context.FinalTarget

Trace.traceErrorfn
"Please specify a version number, either at the command line (\"./build.sh %s 1.0.0\") or in the %s environment variable"
target
envVarName

failwith "No version number found"
else
Trace.traceErrorfn
"Please specify a valid version number: %A could not be recognized as a version number"
verArg

failwith "Invalid version number"
142 changes: 9 additions & 133 deletions Content/Library/build/build.fs
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,6 @@ let releaseBranch = "MyReleaseBranch"
let readme = "README.md"
let changelogFile = "CHANGELOG.md"

let tagFromVersionNumber versionNumber = sprintf "v%s" versionNumber

let READMElink = Uri(Uri(gitHubRepoUrl), $"blob/{releaseBranch}/{readme}")
let CHANGELOGlink = Uri(Uri(gitHubRepoUrl), $"blob/{releaseBranch}/{changelogFile}")

Expand Down Expand Up @@ -192,126 +190,6 @@ let failOnWrongBranch () =
then
failwithf "Not on %s. If you want to release please switch to this branch." releaseBranch

module Changelog =

let isEmptyChange =
function
| Changelog.Change.Added s
| Changelog.Change.Changed s
| Changelog.Change.Deprecated s
| Changelog.Change.Fixed s
| Changelog.Change.Removed s
| Changelog.Change.Security s
| Changelog.Change.Custom(_, s) -> String.IsNullOrWhiteSpace s.CleanedText

let failOnEmptyChangelog () =
let isEmpty =
(latestEntry.Changes
|> Seq.forall isEmptyChange)
|| latestEntry.Changes
|> Seq.isEmpty

if isEmpty then
failwith
"No changes in CHANGELOG. Please add your changes under a heading specified in https://keepachangelog.com/"

let mkLinkReference (newVersion: SemVerInfo) (changelog: Changelog.Changelog) =
if
changelog.Entries
|> List.isEmpty
then
// No actual changelog entries yet: link reference will just point to the Git tag
sprintf
"[%s]: %s/releases/tag/%s"
newVersion.AsString
gitHubRepoUrl
(tagFromVersionNumber newVersion.AsString)
else
let versionTuple version =
(version.Major, version.Minor, version.Patch)
// Changelog entries come already sorted, most-recent first, by the Changelog module
let prevEntry =
changelog.Entries
|> List.skipWhile (fun entry ->
entry.SemVer.PreRelease.IsSome
&& versionTuple entry.SemVer = versionTuple newVersion
)
|> List.tryHead

let linkTarget =
match prevEntry with
| Some entry ->
sprintf
"%s/compare/%s...%s"
gitHubRepoUrl
(tagFromVersionNumber entry.SemVer.AsString)
(tagFromVersionNumber newVersion.AsString)
| None ->
sprintf
"%s/releases/tag/%s"
gitHubRepoUrl
(tagFromVersionNumber newVersion.AsString)

sprintf "[%s]: %s" newVersion.AsString linkTarget

let mkReleaseNotes (latestEntry: Changelog.ChangelogEntry) =
let linkReference = mkLinkReference latestEntry.SemVer changelog

if String.isNullOrEmpty linkReference then
latestEntry.ToString()
else
// Add link reference target to description before building release notes, since in main changelog file it's at the bottom of the file
let description =
match latestEntry.Description with
| None -> linkReference
| Some desc when desc.Contains(linkReference) -> desc
| Some desc -> sprintf "%s\n\n%s" (desc.Trim()) linkReference

{ latestEntry with
Description = Some description
}
.ToString()

let getVersionNumber envVarName ctx =
let args = ctx.Context.Arguments

let verArg =
args
|> List.tryHead
|> Option.defaultWith (fun () -> Environment.environVarOrDefault envVarName "")

if SemVer.isValid verArg then
verArg
elif
verArg.StartsWith("v")
&& SemVer.isValid verArg.[1..]
then
let target = ctx.Context.FinalTarget

Trace.traceImportantfn
"Please specify a version number without leading 'v' next time, e.g. \"./build.sh %s %s\" rather than \"./build.sh %s %s\""
target
verArg.[1..]
target
verArg

verArg.[1..]
elif String.isNullOrEmpty verArg then
let target = ctx.Context.FinalTarget

Trace.traceErrorfn
"Please specify a version number, either at the command line (\"./build.sh %s 1.0.0\") or in the %s environment variable"
target
envVarName

failwith "No version number found"
else
Trace.traceErrorfn
"Please specify a valid version number: %A could not be recognized as a version number"
verArg

failwith "Invalid version number"


module dotnet =
let watch cmdParam program args =
Expand Down Expand Up @@ -404,7 +282,7 @@ module DocsTool =

let allReleaseChecks () =
failOnWrongBranch ()
Changelog.failOnEmptyChangelog ()
Changelog.failOnEmptyChangelog latestEntry


let failOnLocalBuild () =
Expand All @@ -413,7 +291,7 @@ let failOnLocalBuild () =

let allPublishChecks () =
failOnLocalBuild ()
Changelog.failOnEmptyChangelog ()
Changelog.failOnEmptyChangelog latestEntry

//-----------------------------------------------------------------------------
// Target Implementations
Expand Down Expand Up @@ -565,13 +443,13 @@ let updateChangelog ctx =
|> Changelog.save changelogPath

// Now update the link references at the end of the file
let linkReferenceForLatestEntry = Changelog.mkLinkReference newVersion changelog
let linkReferenceForLatestEntry = Changelog.mkLinkReference newVersion changelog gitHubRepoUrl

let linkReferenceForUnreleased =
sprintf
"[Unreleased]: %s/compare/%s...%s"
gitHubRepoUrl
(tagFromVersionNumber newVersion.AsString)
(Changelog.tagFromVersionNumber newVersion.AsString)
"HEAD"

let tailLines =
Expand Down Expand Up @@ -822,8 +700,7 @@ let generateAssemblyInfo _ =
let dotnetPack ctx =
// Get release notes with properly-linked version number
let releaseNotes =
latestEntry
|> Changelog.mkReleaseNotes
Changelog.mkReleaseNotes changelog latestEntry gitHubRepoUrl

let args = [
$"/p:PackageVersion={latestEntry.NuGetVersion}"
Expand Down Expand Up @@ -876,14 +753,14 @@ let gitRelease _ =
>> ignore
)

let msg = sprintf "Bump version to %s\n\n%s" latestEntry.NuGetVersion releaseNotesGitCommitFormat
let msg = sprintf "Bump version to %s\n\n%s" latestEntry.NuGetVersion releaseNotesGitCommitFormat
Git.Commit.exec "" msg

Target.deactivateBuildFailure "RevertChangelog"

Git.Branches.push ""

let tag = tagFromVersionNumber latestEntry.NuGetVersion
let tag = Changelog.tagFromVersionNumber latestEntry.NuGetVersion

Git.Branches.tag "" tag
Git.Branches.pushTag "" "origin" tag
Expand All @@ -902,14 +779,13 @@ let githubRelease _ =
// Get release notes with properly-linked version number

let releaseNotes =
latestEntry
|> Changelog.mkReleaseNotes
Changelog.mkReleaseNotes changelog latestEntry gitHubRepoUrl

GitHub.createClientWithToken token
|> GitHub.draftNewRelease
gitOwner
gitRepoName
(tagFromVersionNumber latestEntry.NuGetVersion)
(Changelog.tagFromVersionNumber latestEntry.NuGetVersion)
(latestEntry.SemVer.PreRelease
<> None)
(releaseNotes
Expand Down
1 change: 1 addition & 0 deletions Content/Library/build/build.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<Compile Include="Changelog.fs" />
<Compile Include="FsDocs.fs" />
<Compile Include="build.fs" />
</ItemGroup>
Expand Down
Loading

0 comments on commit cab9433

Please sign in to comment.