Skip to content

Commit 9f20ec2

Browse files
committed
add symver bump validation to the release
we should follow semantic versioning with the project, so I added a post-packaging step that validates the bump we've declared in RELEASE_NOTES.md. If that bump isn't valid given the rules of SemVer (ie if we've added new public members and haven't done a major bump) the build will fail
1 parent 689f079 commit 9f20ec2

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

fcs/build.fsx

+27-5
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,30 @@ Target.create "PublishNuGet" (fun _ ->
112112
)
113113
)
114114

115-
let anchor (path: string) =
115+
let anchor (path: string) =
116116
System.IO.Path.GetFullPath(Path.Combine(__SOURCE_DIRECTORY__, path))
117117

118+
let bumpMajor (semver: Paket.SemVerInfo) =
119+
{ semver with Major = semver.Major + 1u
120+
Minor = 0u
121+
Patch = 0u }
122+
123+
let bumpMinor (semver: Paket.SemVerInfo) =
124+
{ semver with Minor = semver.Minor + 1u
125+
Patch = 0u }
126+
127+
let bumpPatch (semver: Paket.SemVerInfo) =
128+
{ semver with Patch = semver.Patch + 1u }
129+
130+
let (|WithinRange|OutsideRange|) (leftSemver, (magnitude: SynVer.Version), rightSemver) =
131+
let allowedMin =
132+
match magnitude with
133+
| SynVer.Version.Major -> bumpMajor leftSemver
134+
| SynVer.Version.Minor -> bumpMinor leftSemver
135+
| SynVer.Version.Patch -> bumpPatch leftSemver
136+
137+
if rightSemver < allowedMin || rightSemver < leftSemver then OutsideRange else WithinRange
138+
118139
Target.create "ValidateVersionBump" (fun _ ->
119140
let intendedVersion = Paket.PublicAPI.ParseSemVer release.NugetVersion
120141
let lockfile = Paket.LockFile.LoadFrom "paket.lock"
@@ -126,9 +147,10 @@ Target.create "ValidateVersionBump" (fun _ ->
126147
let (computedVersion, computedMagnitude) = SynVer.SurfaceArea.bump (string oldVersion) oldSurfaceArea newSurfaceArea
127148
let parsedComputedVersion = Paket.PublicAPI.ParseSemVer computedVersion
128149
let apiDiffs = SynVer.SurfaceArea.diff oldSurfaceArea newSurfaceArea |> String.concat "\n"
129-
// todo: expand on this comparison based on the magnitudes
130-
if parsedComputedVersion <> intendedVersion
131-
then
150+
match oldVersion, computedMagnitude, intendedVersion with
151+
| WithinRange ->
152+
Trace.tracefn "Version %A is within the allowed range of %A from the prior version of %A" intendedVersion computedMagnitude oldVersion
153+
| OutsideRange ->
132154
failwithf """Version bump invalid.
133155
Version packaged was %A
134156
Version computed due to API diffs was %A
@@ -169,7 +191,7 @@ open Fake.Core.TargetOperators
169191

170192
"Build"
171193
==> "NuGet"
172-
// ==> "ValidateVersionBump"
194+
==> "ValidateVersionBump"
173195
==> "PublishNuGet"
174196
==> "Release"
175197

0 commit comments

Comments
 (0)