11namespace ApiSurface
22
33open System
4- open System.IO . Abstractions
4+ open System.IO
55open System.Text .RegularExpressions
66open System.Runtime .CompilerServices
77open System.Runtime .InteropServices
88open System.Reflection
9- open System.IO
109
1110type ApiSurface = internal | ApiSurface of string list
1211
@@ -176,37 +175,33 @@ module ApiSurface =
176175
177176 assembly |> ofAssembly |> toString |> writer.Write
178177
179- let private readCurrentVersion ( version : IFileInfo ) =
180- use stream = version.OpenRead ()
181- use reader = new StreamReader ( stream)
178+ let private readCurrentVersion ( version : Stream ) =
179+ use reader = new StreamReader ( version)
182180 let versionFile = VersionFile.read reader
183181
184182 let versionParts = versionFile.Version.Split '.'
185183
186- try
187- {
188- Major = int versionParts.[ 0 ]
189- Minor = int versionParts.[ 1 ]
190- }
191- with _ ->
192- // GitVersioning will verify the json file during build, before the test runs, so it's not expected that anyone will see this error.
193- failwithf
194- " Version in the version.json file must be of the form 'x.x' when x represents a whole number; it was %s ."
195- versionFile.Version
196-
197-
198- let private writeUpdatedVersion ( version : Version ) ( versionFile : IFileInfo ) =
184+ let parsedVersion =
185+ try
186+ {
187+ Major = int versionParts.[ 0 ]
188+ Minor = int versionParts.[ 1 ]
189+ }
190+ with _ ->
191+ // GitVersioning will verify the json file during build, before the test runs, so it's not expected that anyone will see this error.
192+ failwithf
193+ " Version in the version.json file must be of the form 'x.x' when x represents a whole number; it was %s ."
194+ versionFile.Version
195+
196+ versionFile, parsedVersion
197+
198+ let private writeUpdatedVersion ( oldVersionFile : VersionFile ) ( newVersion : Version ) ( versionFile : Stream ) =
199199 let updatedFile =
200- use stream = versionFile.OpenRead ()
201- use reader = new StreamReader ( stream)
202- let versionFile = VersionFile.read reader
203-
204- { versionFile with
205- Version = sprintf " %d .%d " version.Major version.Minor
200+ { oldVersionFile with
201+ Version = sprintf " %d .%d " newVersion.Major newVersion.Minor
206202 }
207203
208- use writer = versionFile.Open FileMode.Create
209- use writer = new StreamWriter ( writer)
204+ use writer = new StreamWriter ( versionFile)
210205 updatedFile |> VersionFile.write writer
211206
212207 let internal findNewVersion currentVersion ( ApiSurface baseline ) ( ApiSurface target ) =
@@ -228,8 +223,17 @@ module ApiSurface =
228223 // If the api was not changed, then GitVersioning will handle the patch version
229224 | _ -> currentVersion
230225
231- let updateVersionJson ( baseline : ApiSurface ) ( assembly : Assembly ) ( versionFile : IFileInfo ) : unit =
232- let currentVersion = readCurrentVersion versionFile
226+ let updateVersionJson < 'fileInfo >
227+ ( baseline : ApiSurface )
228+ ( assembly : Assembly )
229+ ( versionFile : 'fileInfo )
230+ ( openVersionFile : 'fileInfo -> FileMode * FileAccess -> Stream )
231+ : unit
232+ =
233+ let oldVersionFile , currentVersion =
234+ use versionFile = openVersionFile versionFile ( FileMode.Open, FileAccess.Read)
235+ readCurrentVersion versionFile
236+
233237 printfn " Current version %d .%d " currentVersion.Major currentVersion.Minor
234238
235239 let updatedVersion = findNewVersion currentVersion baseline ( ofAssembly assembly)
@@ -239,12 +243,14 @@ module ApiSurface =
239243 else
240244 printfn " Updated version to %d .%d " updatedVersion.Major updatedVersion.Minor
241245
242- writeUpdatedVersion updatedVersion versionFile
246+ do
247+ use versionFile = openVersionFile versionFile ( FileMode.Truncate, FileAccess.Write)
248+ writeUpdatedVersion oldVersionFile updatedVersion versionFile
243249
244250 let writeAssembly
245251 ( baseline : ApiSurface )
246252 ( possibleBaselineResources : string list )
247- ( versionFiles : IFileInfo list)
253+ ( versionFiles : FileInfo list)
248254 ( assembly : Assembly )
249255 : unit
250256 =
@@ -275,7 +281,7 @@ module ApiSurface =
275281 match versionFile with
276282 | Some versionFile ->
277283 printfn " Updating version.json file: %s " versionFile.FullName
278- updateVersionJson baseline assembly versionFile
284+ updateVersionJson baseline assembly versionFile ( fun f ( mode , access ) -> f.Open ( mode , access ))
279285 | None -> ()
280286
281287 printfn " Updating baseline file: %s " baselinePath
@@ -285,13 +291,12 @@ module ApiSurface =
285291 let writeAssemblyBaselineWithDirectory ( dir : string ) ( assembly : Assembly ) : unit =
286292 let possibleBaselineResources = findBaselineResourcesWithDirectory dir assembly
287293
288- let versionFiles =
289- VersionFile.findVersionFilesWithDirectory ( FileSystem ()) dir assembly
294+ let versionFiles = VersionFile.findVersionFilesWithDirectory FileInfo dir assembly
290295
291296 writeAssembly ( ofAssemblyBaseline assembly) possibleBaselineResources versionFiles assembly
292297
293298 [<CompiledName " WriteAssemblyBaseline" >]
294299 let writeAssemblyBaseline ( assembly : Assembly ) : unit =
295300 let possibleBaselineResources = findBaselineResources assembly
296- let versionFiles = VersionFile.findVersionFiles ( FileSystem ()) assembly
301+ let versionFiles = VersionFile.findVersionFiles FileInfo assembly
297302 writeAssembly ( ofAssemblyBaseline assembly) possibleBaselineResources versionFiles assembly
0 commit comments