|
1 | 1 | namespace Scripts
|
2 | 2 |
|
| 3 | +open System.Collections.Generic |
| 4 | +open System.IO |
| 5 | +open System.Threading |
3 | 6 | open Fake.Core
|
| 7 | +open Fake.IO |
| 8 | +open Fake.IO.Globbing.Operators |
| 9 | +open NuGet.Common |
| 10 | +open NuGet.Protocol.Core.Types |
| 11 | +open NuGet.Protocol |
| 12 | +open NuGet.Configuration |
| 13 | +open NuGet.Versioning |
4 | 14 | open Commandline
|
| 15 | +open Projects |
5 | 16 |
|
6 |
| -module Differ = |
7 |
| - |
8 |
| - let Run args = |
9 |
| - Tooling.DotNet.Exec ["tool"; "restore"] |
| 17 | +module Differ = |
| 18 | + let private nestJsonNetSerializerNugetId = (Project NestJsonNetSerializer).NugetId |
| 19 | + |
| 20 | + let private netStandard20Identifier = DotNetFramework.NetStandard2_0.Identifier.Nuget |
| 21 | + |
| 22 | + let private findPreviousVersionOnNuget (version:string) = |
| 23 | + let nugetVersion = new NuGetVersion(version) |
| 24 | + let providers = new List<Lazy<INuGetResourceProvider>>(); |
| 25 | + providers.AddRange(Repository.Provider.GetCoreV3()); |
| 26 | + let packageSource = new PackageSource("https://api.nuget.org/v3/index.json") |
| 27 | + let sourceRepository = new SourceRepository(packageSource, providers) |
| 28 | + let metadata = sourceRepository.GetResource<PackageMetadataResource>() |
| 29 | + let searchMetadata = |
| 30 | + metadata.GetMetadataAsync(nestJsonNetSerializerNugetId, false, false, NullLogger.Instance, CancellationToken.None) |
| 31 | + |> Async.AwaitTask |
| 32 | + |> Async.RunSynchronously |
| 33 | + |
| 34 | + let previousPackage = searchMetadata |
| 35 | + |> Seq.cast<PackageSearchMetadata> |
| 36 | + |> Seq.sortByDescending (fun p -> p.Version) |
| 37 | + |> Seq.filter (fun p -> p.Version < nugetVersion) |
| 38 | + |> Seq.tryHead |
| 39 | + |
| 40 | + match previousPackage with |
| 41 | + | Some p -> Some(p.Version.ToFullString()) |
| 42 | + | None -> None |
| 43 | + |
| 44 | + let private unzipReleasePackages () = |
| 45 | + !! (Fake.IO.Path.combine Paths.NugetOutput "*.nupkg") |
| 46 | + |> Seq.iter(fun f -> |
| 47 | + let name = Path.GetFileNameWithoutExtension(f) |
| 48 | + let directory = Path.Combine(Paths.NugetOutput, name) |
| 49 | + Zip.unzip directory f |
| 50 | + ) |
10 | 51 |
|
| 52 | + let tmp = Fake.IO.Path.combine Paths.NugetOutput "tmp" |
| 53 | + if Directory.Exists tmp then Directory.delete tmp |
| 54 | + Directory.create tmp |
| 55 | + |
| 56 | + Directory.EnumerateDirectories(Paths.NugetOutput) |
| 57 | + |> Seq.filter (fun d -> d <> tmp) |
| 58 | + |> Seq.iter(fun d -> |
| 59 | + let netstandard20Dlls = System.IO.Path.Combine(d, "lib", netStandard20Identifier) |
| 60 | + Directory.EnumerateFiles(netstandard20Dlls, "*.dll") |> Shell.copyFiles tmp |
| 61 | + ) |
| 62 | + |
| 63 | + tmp |> Path.GetFullPath |
| 64 | + |
| 65 | + let Run args = |
| 66 | + Tooling.DotNet.Exec ["tool"; "restore"] |
11 | 67 | let differ = "assembly-differ"
|
12 | 68 | let args = args.RemainingArguments |> String.concat " "
|
13 | 69 | let command = sprintf @"%s %s -o ../../%s" differ args Paths.BuildOutput
|
14 | 70 | Environment.setEnvironVar "NUGET" Tooling.nugetFile
|
15 | 71 | Tooling.DotNet.ExecIn Paths.TargetsFolder [command] |> ignore
|
| 72 | + |
| 73 | + let DiffWithPreviousNugetVersion args = |
| 74 | + match args.CommandArguments with |
| 75 | + | SetVersion v -> |
| 76 | + let previousVersion = findPreviousVersionOnNuget v.Version |
| 77 | + match previousVersion with |
| 78 | + | Some p -> |
| 79 | + let directory = unzipReleasePackages () |
| 80 | + let command = [ sprintf "nuget|%s|%s|%s" nestJsonNetSerializerNugetId p netStandard20Identifier; |
| 81 | + sprintf "directory|%s" directory ] |
| 82 | + |
| 83 | + System.Console.WriteLine("Running diff of {0}, {1} from Nuget against local {2}", netStandard20Identifier, p, v.Version) |
| 84 | + Run { args with RemainingArguments = command } |
| 85 | + | None -> failwithf "Could not find previous version on Nuget for version %s" v.Version |
| 86 | + | _ -> failwith "DiffWithPreviousNugetVersion can only be run with SetVersion arguments" |
0 commit comments