6
6
7
7
open System
8
8
open System.IO
9
+ open Paket
9
10
open Fake.BuildServer
10
11
open Fake.Core
11
12
open Fake.DotNet
@@ -111,9 +112,59 @@ Target.create "PublishNuGet" (fun _ ->
111
112
)
112
113
)
113
114
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 + 1 u
120
+ Minor = 0 u
121
+ Patch = 0 u }
122
+
123
+ let bumpMinor ( semver : Paket.SemVerInfo ) =
124
+ { semver with Minor = semver.Minor + 1 u
125
+ Patch = 0 u }
126
+
127
+ let bumpPatch ( semver : Paket.SemVerInfo ) =
128
+ { semver with Patch = semver.Patch + 1 u }
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
+
114
163
// --------------------------------------------------------------------------------------
115
164
// Run all targets by default. Invoke 'build <Target>' to override
116
165
166
+
167
+
117
168
Target.create " Start" ignore
118
169
Target.create " Release" ignore
119
170
Target.create " GenerateDocs" ignore
@@ -140,6 +191,7 @@ open Fake.Core.TargetOperators
140
191
141
192
" Build"
142
193
==> " NuGet"
194
+ ==> " ValidateVersionBump"
143
195
==> " PublishNuGet"
144
196
==> " Release"
145
197
0 commit comments