-
Notifications
You must be signed in to change notification settings - Fork 519
/
Nuspec.fs
124 lines (109 loc) · 5.41 KB
/
Nuspec.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
namespace Paket
open System
open System.Xml
open System.IO
open Xml
open Paket.Requirements
open Paket.Domain
/// Nuspec reference type inside of nuspec files.
[<RequireQualifiedAccess>]
type NuspecReferences =
| All
| Explicit of string list
/// Framework assembly reference inside of nuspec files.
type FrameworkAssemblyReference = {
AssemblyName: string
FrameworkRestrictions : FrameworkRestrictions }
type Nuspec =
{ References : NuspecReferences
Dependencies : (PackageName * VersionRequirement * FrameworkRestrictions) list
OfficialName : string
LicenseUrl : string
FrameworkAssemblyReferences : FrameworkAssemblyReference list }
static member All = { References = NuspecReferences.All; Dependencies = []; FrameworkAssemblyReferences = []; OfficialName = ""; LicenseUrl = "" }
static member Explicit references = { References = NuspecReferences.Explicit references; Dependencies = []; FrameworkAssemblyReferences = []; OfficialName = ""; LicenseUrl = "" }
static member Load(fileName : string) =
let fi = FileInfo(fileName)
if not fi.Exists then Nuspec.All
else
let doc = new XmlDocument()
doc.Load fi.FullName
let officialName =
match doc |> getNode "package" |> optGetNode "metadata" |> optGetNode "id" with
| Some node -> node.InnerText
| None -> failwithf "unable to find package id in %s" fileName
let dependency node =
let name =
match node |> getAttribute "id" with
| Some name -> PackageName name
| None -> failwithf "unable to find dependency id in %s" fileName
let version =
match node |> getAttribute "version" with
| Some version -> VersionRequirement.Parse version
| None -> VersionRequirement.Parse "0"
let restriction =
let parent = node.ParentNode
match parent.Name.ToLower(), parent |> getAttribute "targetFramework" with
| "group", Some framework ->
match FrameworkDetection.Extract framework with
| Some x -> [FrameworkRestriction.Exactly x]
| None -> []
| _ -> []
name,version,restriction
let frameworks =
doc
|> getDescendants "group"
|> Seq.map (fun node ->
match node |> getAttribute "targetFramework" with
| Some framework ->
match FrameworkDetection.Extract framework with
| Some x -> [PackageName "",VersionRequirement.NoRestriction,[FrameworkRestriction.Exactly x]]
| None -> []
| _ -> [])
|> Seq.concat
|> Seq.toList
let dependencies =
doc
|> getDescendants "dependency"
|> List.map dependency
|> List.append frameworks
|> Requirements.optimizeRestrictions
let licenseUrl =
match doc |> getNode "package" |> optGetNode "metadata" |> optGetNode "licenseUrl" with
| Some link -> link.InnerText
| None -> ""
let references =
doc
|> getDescendants "reference"
|> List.choose (getAttribute "file")
let assemblyRefs node =
let name = node |> getAttribute "assemblyName"
let targetFrameworks = node |> getAttribute "targetFramework"
match name,targetFrameworks with
| Some name, Some targetFrameworks when targetFrameworks = "" ->
[{ AssemblyName = name; FrameworkRestrictions = [] }]
| Some name, None ->
[{ AssemblyName = name; FrameworkRestrictions = [] }]
| Some name, Some targetFrameworks ->
targetFrameworks.Split([|','; ' '|],System.StringSplitOptions.RemoveEmptyEntries)
|> Array.choose FrameworkDetection.Extract
|> Array.map (fun fw -> { AssemblyName = name; FrameworkRestrictions = [FrameworkRestriction.Exactly fw] })
|> Array.toList
| _ -> []
let frameworkAssemblyReferences =
let grouped =
doc
|> getDescendants "frameworkAssembly"
|> List.collect assemblyRefs
|> Seq.groupBy (fun r -> r.AssemblyName)
[for name,restrictions in grouped do
yield { AssemblyName = name
FrameworkRestrictions =
restrictions
|> Seq.collect (fun x -> x.FrameworkRestrictions)
|> Seq.toList} ]
{ References = if references = [] then NuspecReferences.All else NuspecReferences.Explicit references
Dependencies = dependencies
OfficialName = officialName
LicenseUrl = licenseUrl
FrameworkAssemblyReferences = frameworkAssemblyReferences }