Skip to content

Commit a22b011

Browse files
authored
Merge pull request #930 from baronfel/synver
Add a check for SemVer compliance to the build
2 parents c8d34ea + 9f20ec2 commit a22b011

File tree

3 files changed

+350
-2
lines changed

3 files changed

+350
-2
lines changed

fcs/build.fsx

+52
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
open System
88
open System.IO
9+
open Paket
910
open Fake.BuildServer
1011
open Fake.Core
1112
open Fake.DotNet
@@ -111,9 +112,59 @@ Target.create "PublishNuGet" (fun _ ->
111112
)
112113
)
113114

115+
let anchor (path: string) =
116+
System.IO.Path.GetFullPath(Path.Combine(__SOURCE_DIRECTORY__, path))
117+
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+
139+
Target.create "ValidateVersionBump" (fun _ ->
140+
let intendedVersion = Paket.PublicAPI.ParseSemVer release.NugetVersion
141+
let lockfile = Paket.LockFile.LoadFrom "paket.lock"
142+
let refGroup = lockfile.Groups.[Paket.Domain.GroupName "reference"]
143+
let oldPackage = refGroup.Resolution.[Paket.Domain.PackageName "FSharp.Compiler.Service"]
144+
let oldVersion = oldPackage.Version
145+
let oldSurfaceArea = SynVer.SurfaceArea.ofAssembly (System.Reflection.Assembly.LoadFile (anchor "packages/reference/FSharp.Compiler.Service/lib/netstandard2.0/FSharp.Compiler.Service.dll"))
146+
let newSurfaceArea = SynVer.SurfaceArea.ofAssembly (System.Reflection.Assembly.LoadFile (anchor "../artifacts/bin/fcs/Release/netstandard2.0/FSharp.Compiler.Service.dll"))
147+
let (computedVersion, computedMagnitude) = SynVer.SurfaceArea.bump (string oldVersion) oldSurfaceArea newSurfaceArea
148+
let parsedComputedVersion = Paket.PublicAPI.ParseSemVer computedVersion
149+
let apiDiffs = SynVer.SurfaceArea.diff oldSurfaceArea newSurfaceArea |> String.concat "\n"
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 ->
154+
failwithf """Version bump invalid.
155+
Version packaged was %A
156+
Version computed due to API diffs was %A
157+
Allowed version magnitude change is %A
158+
The full set of API diffs is:
159+
%A
160+
""" intendedVersion parsedComputedVersion computedMagnitude apiDiffs
161+
)
162+
114163
// --------------------------------------------------------------------------------------
115164
// Run all targets by default. Invoke 'build <Target>' to override
116165

166+
167+
117168
Target.create "Start" ignore
118169
Target.create "Release" ignore
119170
Target.create "GenerateDocs" ignore
@@ -140,6 +191,7 @@ open Fake.Core.TargetOperators
140191

141192
"Build"
142193
==> "NuGet"
194+
==> "ValidateVersionBump"
143195
==> "PublishNuGet"
144196
==> "Release"
145197

fcs/paket.dependencies

+11-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ nuget Fake.Core.UserInput
1515
nuget Fake.DotNet.Cli
1616
nuget Fake.DotNet.Fsi
1717
nuget Fake.DotNet.Paket
18+
nuget SynVer.FAKE
19+
nuget Paket.Core
1820

1921
group generate
2022

@@ -27,4 +29,12 @@ nuget Fake.Core
2729
nuget Fake.IO.FileSystem
2830
nuget Fake.Core.Trace
2931
nuget FSharp.Literate 4.0.0-alpha03
30-
nuget FSharp.Formatting 4.0.0-alpha03
32+
nuget FSharp.Formatting 4.0.0-alpha03
33+
34+
group reference
35+
36+
source https://api.nuget.org/v3/index.json
37+
framework: netstandard2.0
38+
39+
storage: packages
40+
nuget FSharp.Compiler.Service 34.1.0

0 commit comments

Comments
 (0)